diff --git a/src/core/GameKeyHandler.ttslua b/src/core/GameKeyHandler.ttslua index 8b57ce0b..373357e9 100644 --- a/src/core/GameKeyHandler.ttslua +++ b/src/core/GameKeyHandler.ttslua @@ -264,7 +264,7 @@ function removeOneUse(playerColor, hoveredObject) local indexByMemo = {} local distanceByMemo = {} for _, obj in ipairs(searchResult) do - if not obj.locked then + if obj.memo or not obj.locked then local objPos = obj.getPosition() local distance = Vector.between(cardPos, objPos):magnitude() local memo = obj.memo or "NO_MEMO" diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index efa14115..265eab7d 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -2897,7 +2897,7 @@ function storeTokenTransform(card) cardTokens[card] = {} local cardRot = card.getRotation() for _, token in ipairs(searchLib.onObject(card, "isTileOrToken", 0.95)) do - if not token.locked then + if token.memo or not token.locked then -- offset to stop the token from colliding with the card local tokenPos = token.getPosition() + Vector(0, 0.05, 0) token.setPosition(tokenPos) @@ -2932,6 +2932,20 @@ function stopTokenTransformUpdating(card) card.use_hands = true end +function unregisterTokenFromCard(params) + local card = params.card + local token = params.token + + if cardTokens[card] == nil then return end + + for i, tokenData in ipairs(cardTokens[card] or {}) do + if tokenData.token == token then + table.remove(cardTokens[card], i) + break + end + end +end + -- removes tokens from the provided card/deck function removeTokensFromObject(params) local object = params.object diff --git a/src/core/GlobalApi.ttslua b/src/core/GlobalApi.ttslua index e39a64d9..229a31e7 100644 --- a/src/core/GlobalApi.ttslua +++ b/src/core/GlobalApi.ttslua @@ -68,6 +68,13 @@ do Global.call("moveCardWithTokens", { card = card, position = position, rotation = rotation }) end + -- unregisters a token from a card + ---@param card tts__Object Card that might have this token added + ---@param token tts__Object Token that should get unregistered + function GlobalApi.unregisterTokenFromCard(card, token) + Global.call("unregisterTokenFromCard", { card = card, token = token }) + end + -- loads saved options ---@param options table Set a new state for the option table function GlobalApi.loadOptionPanelSettings(options) diff --git a/src/playermat/Playermat.ttslua b/src/playermat/Playermat.ttslua index 84c7c3dd..a8ee6153 100644 --- a/src/playermat/Playermat.ttslua +++ b/src/playermat/Playermat.ttslua @@ -297,7 +297,7 @@ function discardListOfObjects(objList) elseif tokenChecker.isChaosToken(obj) then -- put chaos tokens back into bag (e.g. Unrelenting) chaosBagApi.returnChaosTokenToBag(obj, false) - elseif not obj.getLock() and not obj.hasTag("DontDiscard") then + elseif (obj.memo or 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) end diff --git a/src/util/SearchLib.ttslua b/src/util/SearchLib.ttslua index 40800f4d..3beedadf 100644 --- a/src/util/SearchLib.ttslua +++ b/src/util/SearchLib.ttslua @@ -6,7 +6,7 @@ do isCardOrDeck = function(x) return x.type == "Card" or x.type == "Deck" end, isClue = function(x) return x.memo == "clueDoom" and x.is_face_down == false end, isDoom = function(x) return x.memo == "clueDoom" and x.is_face_down == true end, - isTileOrToken = function(x) return x.type == "Tile" or x.type == "Generic" end, + isTileOrToken = function(x) return (x.type == "Tile" or x.type == "Generic") and x.interactable end, isUniversalToken = function(x) return x.getMemo() == "universalActionAbility" end, }