diff --git a/src/accessories/SearchAssistant.ttslua b/src/accessories/SearchAssistant.ttslua index 316dffbe..67bbdbf5 100644 --- a/src/accessories/SearchAssistant.ttslua +++ b/src/accessories/SearchAssistant.ttslua @@ -113,11 +113,25 @@ function startSearch(messageColor, number) -- get draw deck local deckAreaObjects = playermatApi.getDeckAreaObjects(matColor) - if deckAreaObjects.draw == nil then + if deckAreaObjects.draw == nil and deckAreaObjects.topCard == nil then printToColor(matColor .. " draw deck could not be found!", messageColor, "Red") return end + -- check for harbinger + local harbinger + if deckAreaObjects.topCard then + harbinger = isHarbinger(deckAreaObjects.topCard.getGMNotes()) + elseif deckAreaObjects.draw and not deckAreaObjects.draw.is_face_down then + local cards = deckAreaObjects.draw.getObjects() + harbinger = isHarbinger(cards[#cards].gm_notes) + end + + if harbinger then + printToColor("The Harbinger is on top of your deck, searching isn't allowed", messageColor) + return + end + -- get bounds to know the height of the deck local bounds = deckAreaObjects.draw.getBounds() drawDeckPosition = bounds.center + Vector(0, bounds.size.y / 2 + 0.2, 0) @@ -158,16 +172,21 @@ function startSearch(messageColor, number) -- handling for Norman Withers if deckAreaObjects.topCard then - deckAreaObjects.topCard.setRotation(setAsideRotation) + deckAreaObjects.topCard.deal(1, handColor) + number = number - 1 topCardDetected = true end searchView() - Wait.time(function() - deckAreaObjects = playermatApi.getDeckAreaObjects(matColor) + if number > 0 then deckAreaObjects.draw.deal(number, handColor) - end, 1) + end +end + +function isHarbinger(notes) + local md = JSON.decode(notes or "") or {} + return md.id == "08006" end -- place handCards back into deck and optionally shuffle diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index f856dbad..d273d4f0 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -258,7 +258,7 @@ function onObjectNumberTyped(hoveredObject, playerColor, number) end -- check whether the hovered object is part of a players draw objects - for _, color in ipairs(playermatApi.getUsedMatColors()) do + for color, _ in pairs(guidReferenceApi.getObjectsByType("Playermat")) do local deckAreaObjects = playermatApi.getDeckAreaObjects(color) if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then playermatApi.drawCardsWithReshuffle(color, number) diff --git a/src/playermat/Playermat.ttslua b/src/playermat/Playermat.ttslua index 9fc8ac46..e65568b1 100644 --- a/src/playermat/Playermat.ttslua +++ b/src/playermat/Playermat.ttslua @@ -438,14 +438,12 @@ function drawCardsWithReshuffle(numCards) local deckAreaObjects = getDeckAreaObjects() -- Norman Withers handling - local harbinger = false - if deckAreaObjects.topCard and deckAreaObjects.topCard.getName() == "The Harbinger" then - harbinger = true + local harbinger + if deckAreaObjects.topCard then + harbinger = isHarbinger(deckAreaObjects.topCard.getGMNotes()) elseif deckAreaObjects.draw and not deckAreaObjects.draw.is_face_down then local cards = deckAreaObjects.draw.getObjects() - if cards[#cards].name == "The Harbinger" then - harbinger = true - end + harbinger = isHarbinger(cards[#cards].gm_notes) end if harbinger then @@ -473,8 +471,7 @@ function drawCardsWithReshuffle(numCards) if deckSize >= numCards then drawCards(numCards) - -- flip top card again for Norman - if topCardDetected and string.match(activeInvestigatorId, "%d%d%d%d%d") == "08004" then + if topCardDetected then flipTopCardFromDeck() end else @@ -483,8 +480,7 @@ function drawCardsWithReshuffle(numCards) shuffleDiscardIntoDeck() Wait.time(function() drawCards(numCards - deckSize) - -- flip top card again for Norman - if topCardDetected and string.match(activeInvestigatorId, "%d%d%d%d%d") == "08004" then + if topCardDetected then flipTopCardFromDeck() end end, 1) @@ -493,6 +489,11 @@ function drawCardsWithReshuffle(numCards) end end +function isHarbinger(notes) + local md = JSON.decode(notes or "") or {} + return md.id == "08006" +end + -- get the draw deck and discard pile objects and returns the references ---@return table: string-indexed table with references to the found objects function getDeckAreaObjects()