Merge pull request #800 from argonui/hand-visibility

Added conditional hand hiding
This commit is contained in:
BootleggerFinn 2024-08-03 17:40:57 -05:00 committed by GitHub
commit 67283c445d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 126 additions and 38 deletions

View File

@ -25,5 +25,6 @@
"useClueClickers": false, "useClueClickers": false,
"useResourceCounters": "disabled", "useResourceCounters": "disabled",
"useSnapTags": true "useSnapTags": true
} },
"handVisibility": []
} }

View File

@ -106,7 +106,7 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
-- contruct feedback message -- contruct feedback message
local cardName = hoveredObject.getName() local cardName = hoveredObject.getName()
if cardName == "" then cardName = "a card" end if cardName == "" then cardName = "a card" end
local playerName = getColoredName(playerColor) local playerName = Global.call("getColoredName", playerColor)
broadcastToAll("Moved " .. cardName .. " to " .. playerName .. "'s threat area.", "White") broadcastToAll("Moved " .. cardName .. " to " .. playerName .. "'s threat area.", "White")
-- get new rotation (rounded) -- get new rotation (rounded)
@ -379,7 +379,7 @@ function removeOneUse(playerColor, hoveredObject)
end end
-- construct feedback message -- construct feedback message
local playerName = getColoredName(playerColor) local playerName = Global.call("getColoredName", playerColor)
local cardInfo = "" local cardInfo = ""
if cardName and cardName ~= "" then if cardName and cardName ~= "" then
cardInfo = " from " .. cardName cardInfo = " from " .. cardName
@ -530,7 +530,7 @@ function takeClueFromLocation(playerColor, hoveredObject)
end end
-- construct feedback message -- construct feedback message
local playerName = getColoredName(playerColor) local playerName = Global.call("getColoredName", playerColor)
local cardInfo = "" local cardInfo = ""
if cardName and cardName ~= "" then if cardName and cardName ~= "" then
cardInfo = " from " .. cardName cardInfo = " from " .. cardName
@ -574,17 +574,6 @@ function getFirstSeatedPlayer()
end end
end end
-- returns the colored steam name or color
function getColoredName(playerColor)
local displayName = playerColor
if Player[playerColor].steam_name then
displayName = Player[playerColor].steam_name
end
-- add bb-code
return "[" .. Color.fromString(playerColor):toHex() .. "]" .. displayName .. "[-]"
end
function roundToMultiple(num, mult) function roundToMultiple(num, mult)
return math.floor((num + mult / 2) / mult) * mult return math.floor((num + mult / 2) / mult) * mult
end end

View File

@ -71,6 +71,9 @@ local RESOURCE_OPTIONS = {
"disabled" "disabled"
} }
-- tracks the visibility of each hand
local handVisibility = {}
--------------------------------------------------------- ---------------------------------------------------------
-- data for tokens -- data for tokens
--------------------------------------------------------- ---------------------------------------------------------
@ -119,19 +122,21 @@ function onSave()
end end
return JSON.encode({ return JSON.encode({
optionPanel = optionPanel,
acknowledgedUpgradeVersions = acknowledgedUpgradeVersions, acknowledgedUpgradeVersions = acknowledgedUpgradeVersions,
chaosTokensLastMatGUID = chaosTokensLastMatGUID, chaosTokensLastMatGUID = chaosTokensLastMatGUID,
chaosTokensGUID = chaosTokensGUID chaosTokensGUID = chaosTokensGUID,
handVisibility = handVisibility,
optionPanel = optionPanel
}) })
end end
function onLoad(savedData) function onLoad(savedData)
if savedData and savedData ~= "" then if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData) local loadedData = JSON.decode(savedData)
optionPanel = loadedData.optionPanel
acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions
chaosTokensLastMatGUID = loadedData.chaosTokensLastMatGUID chaosTokensLastMatGUID = loadedData.chaosTokensLastMatGUID
handVisibility = loadedData.handVisibility
optionPanel = loadedData.optionPanel
-- restore saved state for drawn chaos tokens -- restore saved state for drawn chaos tokens
for _, guid in ipairs(loadedData.chaosTokensGUID or {}) do for _, guid in ipairs(loadedData.chaosTokensGUID or {}) do
@ -147,6 +152,7 @@ function onLoad(savedData)
end end
getModVersion() getModVersion()
updateHandVisibility()
math.randomseed(os.time()) math.randomseed(os.time())
-- initialization of loadable objects library (delay to let Navigation Overlay build) -- initialization of loadable objects library (delay to let Navigation Overlay build)
@ -223,6 +229,8 @@ function onObjectEnterZone(zone, object)
object.call("resetSealedTokens") object.call("resetSealedTokens")
end end
end end
applyHidingToCard(object, zone.getValue())
end end
end end
@ -238,6 +246,9 @@ function onObjectLeaveZone(zone, object)
if zone.type == "Hand" and object.hasTag("CardWithHelper") then if zone.type == "Hand" and object.hasTag("CardWithHelper") then
object.call("syncDisplayWithOptionPanel") object.call("syncDisplayWithOptionPanel")
end end
-- make object visible
object.setHiddenFrom({})
end, 1) end, 1)
end end
@ -432,7 +443,7 @@ function returnAndRedraw(_, tokenGUID)
-- perform the actual token replacing -- perform the actual token replacing
trackChaosToken(tokenName, mat.getGUID(), true) trackChaosToken(tokenName, mat.getGUID(), true)
local params = {token = returnedToken, fromBag = true} local params = { token = returnedToken, fromBag = true }
returnChaosTokenToBag(params) returnChaosTokenToBag(params)
chaosTokens[indexOfReturnedToken] = drawChaosToken({ chaosTokens[indexOfReturnedToken] = drawChaosToken({
@ -1234,8 +1245,7 @@ end
-- updates the preview window -- updates the preview window
function updatePreviewWindow() function updatePreviewWindow()
local item = library[contentToShow][currentListItem] local item = library[contentToShow][currentListItem]
local tempImage = local tempImage = "https://steamusercontent-a.akamaihd.net/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/"
"https://steamusercontent-a.akamaihd.net/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/"
-- set default image if not defined -- set default image if not defined
if item.boxsize == nil or item.boxsize == "" or item.boxart == nil or item.boxart == "" then if item.boxsize == nil or item.boxsize == "" or item.boxart == nil or item.boxart == "" then
@ -1397,8 +1407,7 @@ function contentDownloadCallback(request, params)
if pos then if pos then
spawnTable.position = pos spawnTable.position = pos
else else
broadcastToAll( broadcastToAll("Please make sure there's space in the upper middle of the table and try again.", "Red")
"Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red")
return return
end end
end end
@ -1819,6 +1828,74 @@ function toggleCardHelpers(state)
end end
end end
-- toggles the hand visibility of a hand for a specific player
function handVisibilityToggle(params)
local playerColor = params.playerColor
local handColor = params.handColor
-- collect data for message
local state, preposition
-- modify data table
if not handVisibility[handColor] then
handVisibility[handColor] = { playerColor, handColor }
state, preposition = "Showing", "to"
elseif removeValueFromTable(handVisibility[handColor], playerColor) then
-- something was removed, maybe clear the table
if #handVisibility[handColor] == 1 and handVisibility[handColor][1] == handColor then
handVisibility[handColor] = nil
end
state, preposition = "Hiding", "from"
else
-- add the new color as viewer
table.insert(handVisibility[handColor], playerColor)
state, preposition = "Showing", "to"
end
local sourceName = getColoredName(handColor)
local targetName = getColoredName(playerColor)
broadcastToAll(state .. " " .. sourceName .. "'s hand " .. preposition .. " " .. targetName .. ".")
updateHandVisibility()
end
function updateHandVisibility()
-- update the global setting
if not next(handVisibility) then
Hands.hiding = 1
else
Hands.hiding = 3
end
-- update visibility of cards already in hands (delay seems to be necessary)
Wait.frames(function()
for _, handColor in ipairs(Player.getAvailableColors()) do
for _, handObj in ipairs(Player[handColor].getHandObjects()) do
applyHidingToCard(handObj, handColor)
end
end
end, 1)
end
-- maybe hide card from non-allowed players
---@param card tts__Object Card to maybe hide
---@param handColor? string Color of the hand this card is in
function applyHidingToCard(card, handColor)
if next(handVisibility) then
local viewers = { handColor }
if handColor and handVisibility[handColor] then
viewers = handVisibility[handColor]
end
local hiddenFrom = Player.getColors()
for _, viewer in ipairs(viewers) do
removeValueFromTable(hiddenFrom, viewer)
end
card.setHiddenFrom(hiddenFrom)
else
card.setHiddenFrom({})
end
end
--------------------------------------------------------- ---------------------------------------------------------
-- Update notification related functionality -- Update notification related functionality
--------------------------------------------------------- ---------------------------------------------------------
@ -1892,13 +1969,15 @@ end
--------------------------------------------------------- ---------------------------------------------------------
-- removes a value from a table -- removes a value from a table
---@return boolean: True if something was removed
function removeValueFromTable(t, val) function removeValueFromTable(t, val)
for i, v in ipairs(t) do for i, v in ipairs(t) do
if v == val then if v == val then
table.remove(t, i) table.remove(t, i)
break return true
end end
end end
return false
end end
-- checks if a table is empty -- checks if a table is empty
@ -1909,3 +1988,14 @@ function isTableEmpty(tbl)
return false return false
end end
end end
-- returns the colored steam name or color
function getColoredName(playerColor)
local displayName = playerColor
if Player[playerColor].steam_name then
displayName = Player[playerColor].steam_name
end
-- add bb-code
return "[" .. Color.fromString(playerColor):toHex() .. "]" .. displayName .. "[-]"
end

View File

@ -25,6 +25,11 @@ local availableOptions = {
id = "handColorSelect", id = "handColorSelect",
title = "Select Hand Color", title = "Select Hand Color",
type = "button" type = "button"
},
{
id = "visibilitySelect",
title = "Show/Hide this Hand to me",
type = "button"
} }
} }
} }
@ -618,7 +623,8 @@ function doDiscardOne()
local cardId = choices[num] .. "/" .. #hand local cardId = choices[num] .. "/" .. #hand
deckLib.placeOrMergeIntoDeck(card, returnGlobalDiscardPosition(), self.getRotation()) deckLib.placeOrMergeIntoDeck(card, returnGlobalDiscardPosition(), self.getRotation())
broadcastToAll(getColoredName(playerColor) .. " randomly discarded " .. cardName " (" .. cardId .. ").", "White") local playerName = Global.call("getColoredName", playerColor)
broadcastToAll(playerName .. " randomly discarded " .. cardName " (" .. cardId .. ").", "White")
end end
end end
@ -923,6 +929,7 @@ function onClick_hideOrShowOptions(player)
}) })
end end
-- show the triggering player a dialog to select a playermat texture
function onClick_textureSelect(player) function onClick_textureSelect(player)
local textureList = {} local textureList = {}
for texture, _ in pairs(nameToTexture) do for texture, _ in pairs(nameToTexture) do
@ -931,6 +938,7 @@ function onClick_textureSelect(player)
player.showOptionsDialog("Select a texture:", textureList, _, updateTexture) player.showOptionsDialog("Select a texture:", textureList, _, updateTexture)
end end
-- show the triggering player a dialog to select a new hand color for this mat
function onClick_handColorSelect(player) function onClick_handColorSelect(player)
local colorList = Player.getColors() local colorList = Player.getColors()
@ -975,6 +983,16 @@ function onClick_handColorSelect(player)
end) end)
end end
-- instruct Global to update this mat's hand visibility
function onClick_visibilitySelect(player)
if player.color == playerColor then
printToColor("This is meant to be clicked by other players to be able to see your hand (primarily for multi-handed gameplay). It won't do anything for you.", playerColor)
return
end
Global.call("handVisibilityToggle", { playerColor = player.color, handColor = playerColor })
end
-- changes the UI state and the internal variable for the togglebuttons -- changes the UI state and the internal variable for the togglebuttons
function onClick_toggleOption(player, _, id) function onClick_toggleOption(player, _, id)
local state = optionPanelData[id] local state = optionPanelData[id]
@ -1560,16 +1578,6 @@ function updatePlayerCards(args)
tokenManager.addPlayerCardData(playerCardData) tokenManager.addPlayerCardData(playerCardData)
end end
-- returns the colored steam name or color
function getColoredName(playerColor)
local displayName = playerColor
if Player[playerColor].steam_name then
displayName = Player[playerColor].steam_name
end
-- add bb-code
return "[" .. Color.fromString(playerColor):toHex() .. "]" .. displayName .. "[-]"
end
function getActiveInvestigatorData() return activeInvestigatorData end function getActiveInvestigatorData() return activeInvestigatorData end