From 592e7ecc37b945767f165935944fb77be799eb0a Mon Sep 17 00:00:00 2001 From: dscarpac Date: Wed, 3 Jul 2024 17:05:00 -0500 Subject: [PATCH 1/7] first go --- src/playercards/CardsThatSealTokens.ttslua | 37 +++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index 009c4933..f7d76194 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -138,7 +138,7 @@ function generateContextMenu() end if allowed then - for i = 1, SHOW_MULTI_SEAL do + for i = SHOW_MULTI_SEAL, 1, -1 do sealToken(map.name, playerColor) end else @@ -190,6 +190,7 @@ function sealToken(name, playerColor) tokenArrangerApi.layout() if name == "Bless" or name == "Curse" then blessCurseManagerApi.sealedToken(name, guid) + addStackSize(token, name) end end }) @@ -283,5 +284,39 @@ function resolveSealed() local closestMatColor = playermatApi.getMatColorByPosition(self.getPosition()) local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") local guidToBeResolved = table.remove(sealedTokens) + local token = getObjectFromGUID(guidToBeResolved) + token.UI.setXml("") chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end + +function addStackSize(token, name) + if name == "Bless" then + labelColor = "#9D702CE6" + else + labelColor = "#633A84E6" + end + token.UI.setXmlTable({ + { + tag = "Panel", + attributes = { + height = 380, + width = 380, + rotation = "0 0 180", + scale = "0.2 0.2 1", + position = "0 0 -12", + color = labelColor + }, + children = { + tag = "Text", + attributes = { + fontSize = "380", + font = "font_teutonic-arkham", + color = "#ffffff", + outline = "#000000", + outlineSize = "8 -8", + text = #sealedTokens + } + } + } + }) +end From 2945aeefefe23c5ee64f6d8154f79fce62e091f9 Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sat, 6 Jul 2024 01:27:46 -0500 Subject: [PATCH 2/7] some updates --- src/playercards/CardsThatSealTokens.ttslua | 73 +++++++++++++++---- .../cards/CrystallineElderSign3.ttslua | 1 + src/playercards/cards/DarkRitual.ttslua | 1 + src/playercards/cards/DayofReckoning.ttslua | 2 + src/playercards/cards/FavoroftheMoon1.ttslua | 1 + src/playercards/cards/FavoroftheSun1.ttslua | 1 + .../cards/FluteoftheOuterGods4.ttslua | 1 + src/playercards/cards/HolySpear5.ttslua | 1 + src/playercards/cards/Nephthys4.ttslua | 4 +- .../cards/ProtectiveIncantation1.ttslua | 1 + src/playercards/cards/RadiantSmite1.ttslua | 1 + .../cards/RiteofSanctification.ttslua | 1 + .../cards/SealoftheSeventhSign5.ttslua | 2 + src/playercards/cards/SerpentsofYig.ttslua | 2 + src/playercards/cards/ShardsoftheVoid3.ttslua | 1 + src/playercards/cards/ShieldofFaith2.ttslua | 1 + .../cards/TheChthonianStone.ttslua | 2 + src/playercards/cards/TheCodexofAges.ttslua | 1 + src/playercards/cards/Unrelenting1.ttslua | 1 + 19 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index f7d76194..50e781e4 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -17,14 +17,22 @@ SHOW_SINGLE_RELEASE --@type: boolean - this entry allows releasing a single token - example usage: "Holy Spear" (to keep the other tokens and just release one) +SHOW_UP_TO_MULTI_RELEASE --@type: number (maximum amount of tokens to release at once) + - enables an entry in the context menu + - this entry allows releasing of multiple tokens at once, to the maximum number + - does not fail if there are fewer than the maximum sealed + - example usage: "Nephthys" (to release up to 3 bless tokens at once) + SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - enables an entry in the context menu - this entry allows releasing of multiple tokens at once - - example usage: "Nephthys" (to release 3 bless tokens at once) + - fails if not enough tokens are sealed + - example usage: Maybe a Custom Card? SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) - enables an entry in the context menu - this entry allows returning tokens to the token pool + - fails if not enough tokens are sealed - example usage: "Nephthys" (to return 3 bless tokens at once) SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) @@ -79,10 +87,25 @@ local guidReferenceApi = require("core/GUIDReferenceApi") local playermatApi = require("playermat/PlayermatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") +local MAX_SEALED = MAX_SEALED or nil local sealedTokens = {} local ID_URL_MAP = {} local tokensInBag = {} +-- XML background color for each token for label when stacked +local tokenColor = { + ["Skull"] = "#4A0400E6", + ["Cultist"] = "#173B0BE6", + ["Tablet"] = "#1D2238E6", + ["Elder Thing"] = "#4D2331E6", + ["Auto-fail"] = "#9B0004E6", + ["Bless"] = "#9D702CE6", + ["Curse"] = "#633A84E6", + ["Frost"] = "#404450E6", + ["Elder Sign"] = "#50A8CEE6", + [""] = "#77674DE6" +} + function onSave() return JSON.encode(sealedTokens) end function onLoad(savedData) @@ -95,12 +118,15 @@ end -- builds the context menu function generateContextMenu() -- conditional single or multi release options - if SHOW_SINGLE_RELEASE then - self.addContextMenuItem("Release token", releaseOneToken) + if MAX_SEALED > 1 then + self.addContextMenuItem("Release one token", releaseOneToken) + end + if SHOW_UP_TO_MULTI_RELEASE then + self.addContextMenuItem("Release max " .. SHOW_UP_TO_MULTI_RELEASE .. " tokens", releaseUpToMultipleTokens) elseif SHOW_MULTI_RELEASE then self.addContextMenuItem("Release " .. SHOW_MULTI_RELEASE .. " token(s)", releaseMultipleTokens) else - self.addContextMenuItem("Release token(s)", releaseAllTokens) + self.addContextMenuItem("Release all tokens", releaseAllTokens) end if RESOLVE_TOKEN then @@ -175,6 +201,10 @@ end -- seals the named token on this card function sealToken(name, playerColor) + if #sealedTokens == MAX_SEALED then + printToColor("Cannot seal any more tokens on this card", playerColor, "Red") + return + end if not chaosBagApi.canTouchChaosTokens() then return end local chaosbag = chaosBagApi.findChaosBag() for i, obj in ipairs(chaosbag.getObjects()) do @@ -190,7 +220,9 @@ function sealToken(name, playerColor) tokenArrangerApi.layout() if name == "Bless" or name == "Curse" then blessCurseManagerApi.sealedToken(name, guid) - addStackSize(token, name) + end + if MAX_SEALED > 1 then + updateStackSize(token, name) end end }) @@ -223,6 +255,26 @@ function releaseMultipleTokens(playerColor) end end +-- release up to multiple tokens at once with no minimum +function releaseUpToMultipleTokens(playerColor) + if #sealedTokens == 0 then + printToColor("Not enough tokens sealed.", playerColor) + return + end + if #sealedTokens < SHOW_UP_TO_MULTI_RELEASE then + local numRemoved = #sealedTokens + for i = 1, #sealedTokens do + putTokenAway(table.remove(sealedTokens)) + end + printToColor("Releasing " .. numRemoved .. " tokens", playerColor) + else + for i = 1, SHOW_UP_TO_MULTI_RELEASE do + putTokenAway(table.remove(sealedTokens)) + end + printToColor("Releasing " .. SHOW_UP_TO_MULTI_RELEASE .. " tokens", playerColor) + end +end + -- releases all sealed tokens function releaseAllTokens(playerColor) if not chaosBagApi.canTouchChaosTokens() then return end @@ -289,12 +341,7 @@ function resolveSealed() chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end -function addStackSize(token, name) - if name == "Bless" then - labelColor = "#9D702CE6" - else - labelColor = "#633A84E6" - end +function updateStackSize(token, name) token.UI.setXmlTable({ { tag = "Panel", @@ -304,7 +351,7 @@ function addStackSize(token, name) rotation = "0 0 180", scale = "0.2 0.2 1", position = "0 0 -12", - color = labelColor + color = tokenColor[name] or "#77674DE6" }, children = { tag = "Text", @@ -314,7 +361,7 @@ function addStackSize(token, name) color = "#ffffff", outline = "#000000", outlineSize = "8 -8", - text = #sealedTokens + text = "x" .. #sealedTokens } } } diff --git a/src/playercards/cards/CrystallineElderSign3.ttslua b/src/playercards/cards/CrystallineElderSign3.ttslua index f0652701..55a8798f 100644 --- a/src/playercards/cards/CrystallineElderSign3.ttslua +++ b/src/playercards/cards/CrystallineElderSign3.ttslua @@ -2,5 +2,6 @@ VALID_TOKENS = { ["+1"] = true, ["Elder Sign"] = true } +MAX_SEALED = 1 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/DarkRitual.ttslua b/src/playercards/cards/DarkRitual.ttslua index c794a4c9..947a8f59 100644 --- a/src/playercards/cards/DarkRitual.ttslua +++ b/src/playercards/cards/DarkRitual.ttslua @@ -3,5 +3,6 @@ VALID_TOKENS = { } KEEP_OPEN = true +MAX_SEALED = 5 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/DayofReckoning.ttslua b/src/playercards/cards/DayofReckoning.ttslua index 78e4493c..b23bb958 100644 --- a/src/playercards/cards/DayofReckoning.ttslua +++ b/src/playercards/cards/DayofReckoning.ttslua @@ -2,4 +2,6 @@ VALID_TOKENS = { ["Elder Sign"] = true } +MAX_SEALED = 1 + require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/FavoroftheMoon1.ttslua b/src/playercards/cards/FavoroftheMoon1.ttslua index dbec7836..8e0d6e42 100644 --- a/src/playercards/cards/FavoroftheMoon1.ttslua +++ b/src/playercards/cards/FavoroftheMoon1.ttslua @@ -4,6 +4,7 @@ VALID_TOKENS = { SHOW_SINGLE_RELEASE = true KEEP_OPEN = true +MAX_SEALED = 3 RESOLVE_TOKEN = true require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/FavoroftheSun1.ttslua b/src/playercards/cards/FavoroftheSun1.ttslua index e749c771..d2c6622e 100644 --- a/src/playercards/cards/FavoroftheSun1.ttslua +++ b/src/playercards/cards/FavoroftheSun1.ttslua @@ -4,6 +4,7 @@ VALID_TOKENS = { SHOW_SINGLE_RELEASE = true KEEP_OPEN = true +MAX_SEALED = 3 RESOLVE_TOKEN = true require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/FluteoftheOuterGods4.ttslua b/src/playercards/cards/FluteoftheOuterGods4.ttslua index 004e4628..19d88fc3 100644 --- a/src/playercards/cards/FluteoftheOuterGods4.ttslua +++ b/src/playercards/cards/FluteoftheOuterGods4.ttslua @@ -3,6 +3,7 @@ VALID_TOKENS = { } SHOW_SINGLE_RELEASE = true +MAX_SEALED = 10 KEEP_OPEN = true require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/HolySpear5.ttslua b/src/playercards/cards/HolySpear5.ttslua index aa948b10..65ac16f9 100644 --- a/src/playercards/cards/HolySpear5.ttslua +++ b/src/playercards/cards/HolySpear5.ttslua @@ -4,5 +4,6 @@ VALID_TOKENS = { SHOW_SINGLE_RELEASE = true SHOW_MULTI_SEAL = 2 +MAX_SEALED = 10 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/Nephthys4.ttslua b/src/playercards/cards/Nephthys4.ttslua index e48958a6..6faac8be 100644 --- a/src/playercards/cards/Nephthys4.ttslua +++ b/src/playercards/cards/Nephthys4.ttslua @@ -2,8 +2,10 @@ VALID_TOKENS = { ["Bless"] = true } +KEEP_OPEN = true SHOW_SINGLE_RELEASE = true -SHOW_MULTI_RELEASE = 3 +SHOW_UP_TO_MULTI_RELEASE = 3 SHOW_MULTI_RETURN = 3 +MAX_SEALED = 10 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/ProtectiveIncantation1.ttslua b/src/playercards/cards/ProtectiveIncantation1.ttslua index 33b6970f..11dab875 100644 --- a/src/playercards/cards/ProtectiveIncantation1.ttslua +++ b/src/playercards/cards/ProtectiveIncantation1.ttslua @@ -5,5 +5,6 @@ INVALID_TOKENS = { } UPDATE_ON_HOVER = true +MAX_SEALED = 1 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/RadiantSmite1.ttslua b/src/playercards/cards/RadiantSmite1.ttslua index aef3cd08..956c79fe 100644 --- a/src/playercards/cards/RadiantSmite1.ttslua +++ b/src/playercards/cards/RadiantSmite1.ttslua @@ -3,5 +3,6 @@ VALID_TOKENS = { } KEEP_OPEN = true +MAX_SEALED = 3 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/RiteofSanctification.ttslua b/src/playercards/cards/RiteofSanctification.ttslua index 8a436d65..f0de0c8c 100644 --- a/src/playercards/cards/RiteofSanctification.ttslua +++ b/src/playercards/cards/RiteofSanctification.ttslua @@ -4,5 +4,6 @@ VALID_TOKENS = { KEEP_OPEN = true SHOW_SINGLE_RELEASE = true +MAX_SEALED = 5 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/SealoftheSeventhSign5.ttslua b/src/playercards/cards/SealoftheSeventhSign5.ttslua index 736b14a8..23d7b356 100644 --- a/src/playercards/cards/SealoftheSeventhSign5.ttslua +++ b/src/playercards/cards/SealoftheSeventhSign5.ttslua @@ -2,4 +2,6 @@ VALID_TOKENS = { ["Auto-fail"] = true } +MAX_SEALED = 1 + require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/SerpentsofYig.ttslua b/src/playercards/cards/SerpentsofYig.ttslua index 78e4493c..b23bb958 100644 --- a/src/playercards/cards/SerpentsofYig.ttslua +++ b/src/playercards/cards/SerpentsofYig.ttslua @@ -2,4 +2,6 @@ VALID_TOKENS = { ["Elder Sign"] = true } +MAX_SEALED = 1 + require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/ShardsoftheVoid3.ttslua b/src/playercards/cards/ShardsoftheVoid3.ttslua index 10645275..91a24295 100644 --- a/src/playercards/cards/ShardsoftheVoid3.ttslua +++ b/src/playercards/cards/ShardsoftheVoid3.ttslua @@ -3,5 +3,6 @@ VALID_TOKENS = { } SHOW_SINGLE_RELEASE = true +MAX_SEALED = 4 -- Core Set is component-limited to 4 '0' tokens require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/ShieldofFaith2.ttslua b/src/playercards/cards/ShieldofFaith2.ttslua index 8a436d65..f0de0c8c 100644 --- a/src/playercards/cards/ShieldofFaith2.ttslua +++ b/src/playercards/cards/ShieldofFaith2.ttslua @@ -4,5 +4,6 @@ VALID_TOKENS = { KEEP_OPEN = true SHOW_SINGLE_RELEASE = true +MAX_SEALED = 5 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/TheChthonianStone.ttslua b/src/playercards/cards/TheChthonianStone.ttslua index 050c1176..e8670ec2 100644 --- a/src/playercards/cards/TheChthonianStone.ttslua +++ b/src/playercards/cards/TheChthonianStone.ttslua @@ -5,4 +5,6 @@ VALID_TOKENS = { ["Elder Thing"] = true, } +MAX_SEALED = 1 + require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/TheCodexofAges.ttslua b/src/playercards/cards/TheCodexofAges.ttslua index 1a8729b8..aab59a09 100644 --- a/src/playercards/cards/TheCodexofAges.ttslua +++ b/src/playercards/cards/TheCodexofAges.ttslua @@ -3,5 +3,6 @@ VALID_TOKENS = { } RESOLVE_TOKEN = true +MAX_SEALED = 1 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/Unrelenting1.ttslua b/src/playercards/cards/Unrelenting1.ttslua index 013dd214..8bcab646 100644 --- a/src/playercards/cards/Unrelenting1.ttslua +++ b/src/playercards/cards/Unrelenting1.ttslua @@ -5,5 +5,6 @@ INVALID_TOKENS = { UPDATE_ON_HOVER = true KEEP_OPEN = true +MAX_SEALED = 3 require("playercards/CardsThatSealTokens") From 289f786eb2f7704bf884be89f07dad4ed12dee73 Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sun, 7 Jul 2024 08:38:03 -0500 Subject: [PATCH 3/7] destroys XML on hidden tokens --- src/playercards/CardsThatSealTokens.ttslua | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index 50e781e4..7ab1173f 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -221,9 +221,12 @@ function sealToken(name, playerColor) if name == "Bless" or name == "Curse" then blessCurseManagerApi.sealedToken(name, guid) end - if MAX_SEALED > 1 then - updateStackSize(token, name) + --destroy XML on just covered token + if #sealedTokens > 1 then + local coveredToken = getObjectFromGUID(sealedTokens[#sealedTokens - 1]) + coveredToken.UI.setXml("") end + updateStackSize() end }) return @@ -313,6 +316,7 @@ function putTokenAway(guid) if name == "Bless" or name == "Curse" then blessCurseManagerApi.releasedToken(name, guid) end + updateStackSize() end -- returns the token to the pool (== removes it) @@ -325,6 +329,7 @@ function returnToken(guid) if name == "Bless" or name == "Curse" then blessCurseManagerApi.returnedToken(name, guid) end + updateStackSize() end -- resolves sealed token as if it came from the chaos bag @@ -338,10 +343,16 @@ function resolveSealed() local guidToBeResolved = table.remove(sealedTokens) local token = getObjectFromGUID(guidToBeResolved) token.UI.setXml("") + updateStackSize() chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end -function updateStackSize(token, name) +function updateStackSize() + if MAX_SEALED == 1 then return end + -- get topmost sealed token + local token = getObjectFromGUID(sealedTokens[#sealedTokens]) + local name = token.getName() + token.UI.setXmlTable({ { tag = "Panel", From 55654a288ac70855c37e8b716134f0a32814941a Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sun, 7 Jul 2024 16:00:14 -0500 Subject: [PATCH 4/7] many updates --- src/chaosbag/ChaosBagApi.ttslua | 5 +- src/core/Global.ttslua | 17 +++-- src/playercards/CardsThatSealTokens.ttslua | 74 ++++++++----------- src/playercards/cards/FavoroftheMoon1.ttslua | 1 - src/playercards/cards/FavoroftheSun1.ttslua | 1 - .../cards/FluteoftheOuterGods4.ttslua | 1 - src/playercards/cards/HolySpear5.ttslua | 1 - src/playercards/cards/Nephthys4.ttslua | 3 +- .../cards/RiteofSanctification.ttslua | 1 - src/playercards/cards/ShardsoftheVoid3.ttslua | 1 - src/playercards/cards/ShieldofFaith2.ttslua | 1 - src/playermat/Playermat.ttslua | 4 +- 12 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/chaosbag/ChaosBagApi.ttslua b/src/chaosbag/ChaosBagApi.ttslua index 5882d5bb..218f63a9 100644 --- a/src/chaosbag/ChaosBagApi.ttslua +++ b/src/chaosbag/ChaosBagApi.ttslua @@ -47,8 +47,9 @@ do -- returns a chaos token to the bag and calls all relevant functions ---@param token tts__Object Chaos token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) + ---@param fromBag boolean whether or not the token to return was in the middle of being drawn (true) or elsewhere (false) + ChaosBagApi.returnChaosTokenToBag = function(token, fromBag) + return Global.call("returnChaosTokenToBag", { token = token, fromBag = fromBag }) end -- spawns the specified chaos token and puts it into the chaos bag diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index 049dee56..2ce84b52 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -207,6 +207,12 @@ function onObjectEnterZone(zone, object) object.clearContextMenu() object.call("shutOff") end + if object.hasTag("CardThatSeals") then + local func = object.getVar("resetSealedTokens") -- check if function exists (it won't for older custom content) + if func ~= nil then + object.call("resetSealedTokens") + end + end end end @@ -301,13 +307,13 @@ function returnChaosTokens() end -- returns a single chaos token to the bag and calls respective functions -function returnChaosTokenToBag(token) - local name = token.getName() +function returnChaosTokenToBag(params) + local name = params.token.getName() local chaosBag = findChaosBag() - chaosBag.putObject(token) + chaosBag.putObject(params.token) tokenArrangerApi.layout() if name == "Bless" or name == "Curse" then - blessCurseManagerApi.releasedToken(name, token.getGUID(), true) + blessCurseManagerApi.releasedToken(name, params.token.getGUID(), params.fromBag) end end @@ -418,7 +424,8 @@ function returnAndRedraw(_, tokenGUID) -- perform the actual token replacing trackChaosToken(tokenName, mat.getGUID(), true) - returnChaosTokenToBag(returnedToken) + params = {token = returnedToken, fromBag = true} + returnChaosTokenToBag(params) chaosTokens[indexOfReturnedToken] = drawChaosToken({ mat = mat, diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index 7ab1173f..92d780a3 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -1,7 +1,16 @@ --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. +NOTE: all cards are allowed to release a single token to enable Hallow and A Watchful Peace, +and to release all sealed tokens to allow for cards that might leave play with sealed tokens on them. Valid options (set before requiring this file): +MAX_SEALED --@type: number (maximum number of tokens allowable by the card to be sealed) + - required for all cards + - if MAX_SEALED is more than 1, then an XML label is created for the topmost token indicating the number of sealed tokens + - gives an error if user tries to seal additional tokens on the card + - example usage: "The Chthonian Stone" + > MAX_SEALED = 1 + UPDATE_ON_HOVER --@type: boolean - automatically updates the context menu options when the card is hovered - the "Read Bag" function reads the content of the chaos bag to update the context menu @@ -12,23 +21,12 @@ KEEP_OPEN --@type: boolean - makes the context menu stay open after selecting an option - example usage: "Unrelenting" -SHOW_SINGLE_RELEASE --@type: boolean - - enables an entry in the context menu - - this entry allows releasing a single token - - example usage: "Holy Spear" (to keep the other tokens and just release one) - -SHOW_UP_TO_MULTI_RELEASE --@type: number (maximum amount of tokens to release at once) +SHOW_MULTI_RELEASE --@type: number (maximum amount of tokens to release at once) - enables an entry in the context menu - this entry allows releasing of multiple tokens at once, to the maximum number - does not fail if there are fewer than the maximum sealed - example usage: "Nephthys" (to release up to 3 bless tokens at once) -SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - - enables an entry in the context menu - - this entry allows releasing of multiple tokens at once - - fails if not enough tokens are sealed - - example usage: Maybe a Custom Card? - SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) - enables an entry in the context menu - this entry allows returning tokens to the token pool @@ -66,6 +64,7 @@ Thus it should be implemented like this: > ["+1"] = true, > ["Elder Sign"] = true > } + > MAX_SEALED = 1 > require... ---------------------------------------------------------- Example 2: Holy Spear @@ -76,8 +75,8 @@ Thus it should be implemented like this: > VALID_TOKENS = { > ["Bless"] = true > } - > SHOW_SINGLE_RELEASE = true > SHOW_MULTI_SEAL = 2 + > MAX_SEALED = 10 > require... ----------------------------------------------------------]] @@ -117,18 +116,18 @@ end -- builds the context menu function generateContextMenu() - -- conditional single or multi release options + + self.addContextMenuItem("Release one token", releaseOneToken) + + -- conditional release options if MAX_SEALED > 1 then - self.addContextMenuItem("Release one token", releaseOneToken) - end - if SHOW_UP_TO_MULTI_RELEASE then - self.addContextMenuItem("Release max " .. SHOW_UP_TO_MULTI_RELEASE .. " tokens", releaseUpToMultipleTokens) - elseif SHOW_MULTI_RELEASE then - self.addContextMenuItem("Release " .. SHOW_MULTI_RELEASE .. " token(s)", releaseMultipleTokens) - else self.addContextMenuItem("Release all tokens", releaseAllTokens) end + if SHOW_MULTI_RELEASE then + self.addContextMenuItem("Release " .. SHOW_MULTI_RELEASE .. " token(s)", releaseMultipleTokens) + end + if RESOLVE_TOKEN then local firstTokenType for tokenType, val in pairs(VALID_TOKENS) do @@ -246,35 +245,23 @@ function releaseOneToken(playerColor) end end --- release multiple tokens at once -function releaseMultipleTokens(playerColor) - if SHOW_MULTI_RELEASE <= #sealedTokens then - for i = 1, SHOW_MULTI_RELEASE do - putTokenAway(table.remove(sealedTokens)) - end - printToColor("Releasing " .. SHOW_MULTI_RELEASE .. " tokens", playerColor) - else - printToColor("Not enough tokens sealed.", playerColor) - end -end - -- release up to multiple tokens at once with no minimum -function releaseUpToMultipleTokens(playerColor) +function releaseMultipleTokens(playerColor) if #sealedTokens == 0 then printToColor("Not enough tokens sealed.", playerColor) return end - if #sealedTokens < SHOW_UP_TO_MULTI_RELEASE then + if #sealedTokens < SHOW_MULTI_RELEASE then local numRemoved = #sealedTokens - for i = 1, #sealedTokens do + for i = 1, numRemoved do putTokenAway(table.remove(sealedTokens)) end printToColor("Releasing " .. numRemoved .. " tokens", playerColor) else - for i = 1, SHOW_UP_TO_MULTI_RELEASE do + for i = 1, SHOW_MULTI_RELEASE do putTokenAway(table.remove(sealedTokens)) end - printToColor("Releasing " .. SHOW_UP_TO_MULTI_RELEASE .. " tokens", playerColor) + printToColor("Releasing " .. SHOW_MULTI_RELEASE .. " tokens", playerColor) end end @@ -341,19 +328,20 @@ function resolveSealed() local closestMatColor = playermatApi.getMatColorByPosition(self.getPosition()) local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") local guidToBeResolved = table.remove(sealedTokens) - local token = getObjectFromGUID(guidToBeResolved) - token.UI.setXml("") + local resolvedToken = getObjectFromGUID(guidToBeResolved) + resolvedToken.UI.setXml("") updateStackSize() chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end function updateStackSize() if MAX_SEALED == 1 then return end + if #sealedTokens == 0 then return end -- get topmost sealed token - local token = getObjectFromGUID(sealedTokens[#sealedTokens]) - local name = token.getName() + local topToken = getObjectFromGUID(sealedTokens[#sealedTokens]) + local name = topToken.getName() - token.UI.setXmlTable({ + topToken.UI.setXmlTable({ { tag = "Panel", attributes = { diff --git a/src/playercards/cards/FavoroftheMoon1.ttslua b/src/playercards/cards/FavoroftheMoon1.ttslua index 8e0d6e42..7788115e 100644 --- a/src/playercards/cards/FavoroftheMoon1.ttslua +++ b/src/playercards/cards/FavoroftheMoon1.ttslua @@ -2,7 +2,6 @@ VALID_TOKENS = { ["Curse"] = true } -SHOW_SINGLE_RELEASE = true KEEP_OPEN = true MAX_SEALED = 3 RESOLVE_TOKEN = true diff --git a/src/playercards/cards/FavoroftheSun1.ttslua b/src/playercards/cards/FavoroftheSun1.ttslua index d2c6622e..139dcf81 100644 --- a/src/playercards/cards/FavoroftheSun1.ttslua +++ b/src/playercards/cards/FavoroftheSun1.ttslua @@ -2,7 +2,6 @@ VALID_TOKENS = { ["Bless"] = true } -SHOW_SINGLE_RELEASE = true KEEP_OPEN = true MAX_SEALED = 3 RESOLVE_TOKEN = true diff --git a/src/playercards/cards/FluteoftheOuterGods4.ttslua b/src/playercards/cards/FluteoftheOuterGods4.ttslua index 19d88fc3..61f69599 100644 --- a/src/playercards/cards/FluteoftheOuterGods4.ttslua +++ b/src/playercards/cards/FluteoftheOuterGods4.ttslua @@ -2,7 +2,6 @@ VALID_TOKENS = { ["Curse"] = true } -SHOW_SINGLE_RELEASE = true MAX_SEALED = 10 KEEP_OPEN = true diff --git a/src/playercards/cards/HolySpear5.ttslua b/src/playercards/cards/HolySpear5.ttslua index 65ac16f9..3c60c749 100644 --- a/src/playercards/cards/HolySpear5.ttslua +++ b/src/playercards/cards/HolySpear5.ttslua @@ -2,7 +2,6 @@ VALID_TOKENS = { ["Bless"] = true } -SHOW_SINGLE_RELEASE = true SHOW_MULTI_SEAL = 2 MAX_SEALED = 10 diff --git a/src/playercards/cards/Nephthys4.ttslua b/src/playercards/cards/Nephthys4.ttslua index 6faac8be..acc58d27 100644 --- a/src/playercards/cards/Nephthys4.ttslua +++ b/src/playercards/cards/Nephthys4.ttslua @@ -3,8 +3,7 @@ VALID_TOKENS = { } KEEP_OPEN = true -SHOW_SINGLE_RELEASE = true -SHOW_UP_TO_MULTI_RELEASE = 3 +SHOW_MULTI_RELEASE = 3 SHOW_MULTI_RETURN = 3 MAX_SEALED = 10 diff --git a/src/playercards/cards/RiteofSanctification.ttslua b/src/playercards/cards/RiteofSanctification.ttslua index f0de0c8c..77f51211 100644 --- a/src/playercards/cards/RiteofSanctification.ttslua +++ b/src/playercards/cards/RiteofSanctification.ttslua @@ -3,7 +3,6 @@ VALID_TOKENS = { } KEEP_OPEN = true -SHOW_SINGLE_RELEASE = true MAX_SEALED = 5 require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/ShardsoftheVoid3.ttslua b/src/playercards/cards/ShardsoftheVoid3.ttslua index 91a24295..a43a02e2 100644 --- a/src/playercards/cards/ShardsoftheVoid3.ttslua +++ b/src/playercards/cards/ShardsoftheVoid3.ttslua @@ -2,7 +2,6 @@ VALID_TOKENS = { ["0"] = true } -SHOW_SINGLE_RELEASE = true MAX_SEALED = 4 -- Core Set is component-limited to 4 '0' tokens require("playercards/CardsThatSealTokens") diff --git a/src/playercards/cards/ShieldofFaith2.ttslua b/src/playercards/cards/ShieldofFaith2.ttslua index f0de0c8c..77f51211 100644 --- a/src/playercards/cards/ShieldofFaith2.ttslua +++ b/src/playercards/cards/ShieldofFaith2.ttslua @@ -3,7 +3,6 @@ VALID_TOKENS = { } KEEP_OPEN = true -SHOW_SINGLE_RELEASE = true MAX_SEALED = 5 require("playercards/CardsThatSealTokens") diff --git a/src/playermat/Playermat.ttslua b/src/playermat/Playermat.ttslua index 81dd612d..fea8196e 100644 --- a/src/playermat/Playermat.ttslua +++ b/src/playermat/Playermat.ttslua @@ -260,7 +260,7 @@ function discardListOfObjects(objList) end elseif tokenChecker.isChaosToken(obj) then -- put chaos tokens back into bag (e.g. Unrelenting) - chaosBagApi.returnChaosTokenToBag(obj) + chaosBagApi.returnChaosTokenToBag(obj, false) elseif not obj.getLock() and not obj.hasTag("DontDiscard") then -- don't touch locked objects (like the table etc.) or specific objects (like key tokens) ownedObjects.Trash.putObject(obj) @@ -878,7 +878,7 @@ function removeTokensFromObject(object) for _, obj in ipairs(searchLib.onObject(object)) do if tokenChecker.isChaosToken(obj) then - chaosBagApi.returnChaosTokenToBag(obj) + chaosBagApi.returnChaosTokenToBag(obj, false) elseif obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and From 58d4b4d292b4168df4fa74c8ac9dd29ea7aaffe6 Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sun, 7 Jul 2024 17:35:04 -0500 Subject: [PATCH 5/7] updates and remove one use change --- src/core/GameKeyHandler.ttslua | 12 ++++++++++- src/core/Global.ttslua | 2 +- src/playercards/CardsThatSealTokens.ttslua | 25 +++++++++++----------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/core/GameKeyHandler.ttslua b/src/core/GameKeyHandler.ttslua index 1c52ec55..1cf866e8 100644 --- a/src/core/GameKeyHandler.ttslua +++ b/src/core/GameKeyHandler.ttslua @@ -5,6 +5,7 @@ local navigationOverlayApi = require("core/NavigationOverlayApi") local optionPanelApi = require("core/OptionPanelApi") local playermatApi = require("playermat/PlayermatApi") local searchLib = require("util/SearchLib") +local tokenChecker = require("core/token/TokenChecker") local victoryDisplayApi = require("core/VictoryDisplayApi") function onLoad() @@ -265,7 +266,7 @@ function removeOneUse(playerColor, hoveredObject) for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do if not obj.locked and obj.memo ~= "resourceCounter" then -- check for matching object, otherwise use the first hit - if obj.memo == searchForType then + if obj.memo and obj.memo == searchForType then targetObject = obj break elseif not targetObject then @@ -275,6 +276,15 @@ function removeOneUse(playerColor, hoveredObject) end end + -- release sealed token if card has one and no uses + if tokenChecker.isChaosToken(targetObject) and hoveredObject.hasTag("CardThatSeals") then + local func = hoveredObject.getVar("releaseOneToken") -- check if function exists + if func ~= nil then + hoveredObject.call("releaseOneToken", playerColor) + return + end + end + -- error handling if not targetObject then broadcastToColor("No tokens found!", playerColor, "Yellow") diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index 2ce84b52..b591245a 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -424,7 +424,7 @@ function returnAndRedraw(_, tokenGUID) -- perform the actual token replacing trackChaosToken(tokenName, mat.getGUID(), true) - params = {token = returnedToken, fromBag = true} + local params = {token = returnedToken, fromBag = true} returnChaosTokenToBag(params) chaosTokens[indexOfReturnedToken] = drawChaosToken({ diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index 92d780a3..c379e8bc 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -86,7 +86,6 @@ local guidReferenceApi = require("core/GUIDReferenceApi") local playermatApi = require("playermat/PlayermatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") -local MAX_SEALED = MAX_SEALED or nil local sealedTokens = {} local ID_URL_MAP = {} local tokensInBag = {} @@ -116,7 +115,6 @@ end -- builds the context menu function generateContextMenu() - self.addContextMenuItem("Release one token", releaseOneToken) -- conditional release options @@ -200,7 +198,7 @@ end -- seals the named token on this card function sealToken(name, playerColor) - if #sealedTokens == MAX_SEALED then + if #sealedTokens >= MAX_SEALED then printToColor("Cannot seal any more tokens on this card", playerColor, "Red") return end @@ -220,10 +218,14 @@ function sealToken(name, playerColor) if name == "Bless" or name == "Curse" then blessCurseManagerApi.sealedToken(name, guid) end - --destroy XML on just covered token + -- destroy XML on just covered token if #sealedTokens > 1 then local coveredToken = getObjectFromGUID(sealedTokens[#sealedTokens - 1]) - coveredToken.UI.setXml("") + if coveredToken ~= nil then + coveredToken.UI.setXml("") + else + table.remove(sealedTokens, #sealedTokens - 1) + end end updateStackSize() end @@ -253,16 +255,13 @@ function releaseMultipleTokens(playerColor) end if #sealedTokens < SHOW_MULTI_RELEASE then local numRemoved = #sealedTokens - for i = 1, numRemoved do - putTokenAway(table.remove(sealedTokens)) - end - printToColor("Releasing " .. numRemoved .. " tokens", playerColor) else - for i = 1, SHOW_MULTI_RELEASE do - putTokenAway(table.remove(sealedTokens)) - end - printToColor("Releasing " .. SHOW_MULTI_RELEASE .. " tokens", playerColor) + local numRemoved = SHOW_MULTI_RELEASE end + for i = 1, numRemoved do + putTokenAway(table.remove(sealedTokens)) + end + printToColor("Releasing " .. numRemoved .. " tokens", playerColor) end -- releases all sealed tokens From 7985855573257c41bcc2167ab57e363d974c0121 Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sun, 7 Jul 2024 17:52:09 -0500 Subject: [PATCH 6/7] removed local --- src/playercards/CardsThatSealTokens.ttslua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index c379e8bc..477a5552 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -254,9 +254,9 @@ function releaseMultipleTokens(playerColor) return end if #sealedTokens < SHOW_MULTI_RELEASE then - local numRemoved = #sealedTokens + numRemoved = #sealedTokens else - local numRemoved = SHOW_MULTI_RELEASE + numRemoved = SHOW_MULTI_RELEASE end for i = 1, numRemoved do putTokenAway(table.remove(sealedTokens)) From ee3f01cd2907da27e6956badcefbf6de69d712d3 Mon Sep 17 00:00:00 2001 From: dscarpac Date: Sun, 7 Jul 2024 18:07:30 -0500 Subject: [PATCH 7/7] maybe the last change? --- src/playercards/CardsThatSealTokens.ttslua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/playercards/CardsThatSealTokens.ttslua b/src/playercards/CardsThatSealTokens.ttslua index 477a5552..0fb3a9fa 100644 --- a/src/playercards/CardsThatSealTokens.ttslua +++ b/src/playercards/CardsThatSealTokens.ttslua @@ -253,11 +253,12 @@ function releaseMultipleTokens(playerColor) printToColor("Not enough tokens sealed.", playerColor) return end + + local numRemoved = SHOW_MULTI_RELEASE if #sealedTokens < SHOW_MULTI_RELEASE then numRemoved = #sealedTokens - else - numRemoved = SHOW_MULTI_RELEASE end + for i = 1, numRemoved do putTokenAway(table.remove(sealedTokens)) end