Added conditionally hand hiding

This commit is contained in:
Chr1Z93 2024-08-03 15:50:56 +02:00
parent c70de840f7
commit 4c4bcad32b
4 changed files with 121 additions and 38 deletions

View File

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

View File

@ -106,7 +106,7 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
-- contruct feedback message
local cardName = hoveredObject.getName()
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")
-- get new rotation (rounded)
@ -379,7 +379,7 @@ function removeOneUse(playerColor, hoveredObject)
end
-- construct feedback message
local playerName = getColoredName(playerColor)
local playerName = Global.call("getColoredName", playerColor)
local cardInfo = ""
if cardName and cardName ~= "" then
cardInfo = " from " .. cardName
@ -530,7 +530,7 @@ function takeClueFromLocation(playerColor, hoveredObject)
end
-- construct feedback message
local playerName = getColoredName(playerColor)
local playerName = Global.call("getColoredName", playerColor)
local cardInfo = ""
if cardName and cardName ~= "" then
cardInfo = " from " .. cardName
@ -574,17 +574,6 @@ function getFirstSeatedPlayer()
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)
return math.floor((num + mult / 2) / mult) * mult
end

View File

@ -71,6 +71,9 @@ local RESOURCE_OPTIONS = {
"disabled"
}
-- tracks the visibility of each hand
local handVisibility = {}
---------------------------------------------------------
-- data for tokens
---------------------------------------------------------
@ -119,19 +122,21 @@ function onSave()
end
return JSON.encode({
optionPanel = optionPanel,
acknowledgedUpgradeVersions = acknowledgedUpgradeVersions,
chaosTokensLastMatGUID = chaosTokensLastMatGUID,
chaosTokensGUID = chaosTokensGUID
chaosTokensGUID = chaosTokensGUID,
handVisibility = handVisibility,
optionPanel = optionPanel
})
end
function onLoad(savedData)
if savedData and savedData ~= "" then
local loadedData = JSON.decode(savedData)
optionPanel = loadedData.optionPanel
acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions
chaosTokensLastMatGUID = loadedData.chaosTokensLastMatGUID
handVisibility = loadedData.handVisibility
optionPanel = loadedData.optionPanel
-- restore saved state for drawn chaos tokens
for _, guid in ipairs(loadedData.chaosTokensGUID or {}) do
@ -147,6 +152,7 @@ function onLoad(savedData)
end
getModVersion()
updateHandVisibility()
math.randomseed(os.time())
-- initialization of loadable objects library (delay to let Navigation Overlay build)
@ -223,6 +229,8 @@ function onObjectEnterZone(zone, object)
object.call("resetSealedTokens")
end
end
applyHidingToCard(object, zone.getValue())
end
end
@ -238,6 +246,9 @@ function onObjectLeaveZone(zone, object)
if zone.type == "Hand" and object.hasTag("CardWithHelper") then
object.call("syncDisplayWithOptionPanel")
end
-- make object visible
object.setHiddenFrom({})
end, 1)
end
@ -432,7 +443,7 @@ function returnAndRedraw(_, tokenGUID)
-- perform the actual token replacing
trackChaosToken(tokenName, mat.getGUID(), true)
local params = {token = returnedToken, fromBag = true}
local params = { token = returnedToken, fromBag = true }
returnChaosTokenToBag(params)
chaosTokens[indexOfReturnedToken] = drawChaosToken({
@ -1234,8 +1245,7 @@ end
-- updates the preview window
function updatePreviewWindow()
local item = library[contentToShow][currentListItem]
local tempImage =
"https://steamusercontent-a.akamaihd.net/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/"
local tempImage = "https://steamusercontent-a.akamaihd.net/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/"
-- set default image if not defined
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
spawnTable.position = pos
else
broadcastToAll(
"Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red")
broadcastToAll("Please make sure there's space in the upper middle of the table and try again.", "Red")
return
end
end
@ -1819,6 +1828,74 @@ function toggleCardHelpers(state)
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
local sourceName = getColoredName(handColor)
local targetName = getColoredName(playerColor)
-- modify data table
if not handVisibility[handColor] then
handVisibility[handColor] = { playerColor, handColor }
state = "Disabled"
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 = "Enabled"
else
-- add the new color as viewer
table.insert(handVisibility[handColor], playerColor)
state = "Disabled"
end
broadcastToAll(state .. " hiding of " .. sourceName .. "'s hand for " .. 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
---------------------------------------------------------
@ -1892,13 +1969,15 @@ end
---------------------------------------------------------
-- removes a value from a table
---@return boolean: True if something was removed
function removeValueFromTable(t, val)
for i, v in ipairs(t) do
if v == val then
table.remove(t, i)
break
return true
end
end
return false
end
-- checks if a table is empty
@ -1909,3 +1988,14 @@ function isTableEmpty(tbl)
return false
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",
title = "Select Hand Color",
type = "button"
},
{
id = "visibilitySelect",
title = "Toggle this Hand's hiding",
type = "button"
}
}
}
@ -618,7 +623,8 @@ function doDiscardOne()
local cardId = choices[num] .. "/" .. #hand
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
@ -923,6 +929,7 @@ function onClick_hideOrShowOptions(player)
})
end
-- show the triggering player a dialog to select a playermat texture
function onClick_textureSelect(player)
local textureList = {}
for texture, _ in pairs(nameToTexture) do
@ -931,6 +938,7 @@ function onClick_textureSelect(player)
player.showOptionsDialog("Select a texture:", textureList, _, updateTexture)
end
-- show the triggering player a dialog to select a new hand color for this mat
function onClick_handColorSelect(player)
local colorList = Player.getColors()
@ -975,6 +983,11 @@ function onClick_handColorSelect(player)
end)
end
-- instruct Global to update this mat's hand visibility
function onClick_visibilitySelect(player)
Global.call("handVisibilityToggle", { playerColor = player.color, handColor = playerColor })
end
-- changes the UI state and the internal variable for the togglebuttons
function onClick_toggleOption(player, _, id)
local state = optionPanelData[id]
@ -1560,16 +1573,6 @@ function updatePlayerCards(args)
tokenManager.addPlayerCardData(playerCardData)
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