Merge branch 'main' into card-enhancer
This commit is contained in:
commit
b3ffb52e5b
@ -25,5 +25,6 @@
|
|||||||
"useClueClickers": false,
|
"useClueClickers": false,
|
||||||
"useResourceCounters": "disabled",
|
"useResourceCounters": "disabled",
|
||||||
"useSnapTags": true
|
"useSnapTags": true
|
||||||
}
|
},
|
||||||
|
"handVisibility": []
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -245,9 +245,15 @@ do
|
|||||||
if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then
|
if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then
|
||||||
callback = function(spawned) spawned.setState(stateID) end
|
callback = function(spawned) spawned.setState(stateID) end
|
||||||
elseif tokenType == "universalActionAbility" then
|
elseif tokenType == "universalActionAbility" then
|
||||||
local matColor = playermatApi.getMatColorByPosition(card.getPosition())
|
callback = function(spawned)
|
||||||
local class = playermatApi.returnInvestigatorClass(matColor)
|
local matColor = playermatApi.getMatColorByPosition(card.getPosition())
|
||||||
callback = function(spawned) spawned.call("updateClassAndSymbol", { class = class, symbol = subType or class }) end
|
local activeInvestigatorData = playermatApi.getActiveInvestigatorData(matColor)
|
||||||
|
|
||||||
|
spawned.call("updateClassAndSymbol", {
|
||||||
|
class = activeInvestigatorData.class,
|
||||||
|
symbol = subType or activeInvestigatorData.class
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, tokenCount do
|
for i = 1, tokenCount do
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -66,12 +66,16 @@ function onScriptingButtonDown(index, playerColor)
|
|||||||
|
|
||||||
-- check for nearest investigator card and change action token state to its class
|
-- check for nearest investigator card and change action token state to its class
|
||||||
elseif tokenType == "universalActionAbility" then
|
elseif tokenType == "universalActionAbility" then
|
||||||
local matColor = playermatApi.getMatColorByPosition(position)
|
|
||||||
local matRotation = playermatApi.returnRotation(matColor)
|
|
||||||
local class = playermatApi.returnInvestigatorClass(matColor)
|
|
||||||
callback = function(spawned)
|
callback = function(spawned)
|
||||||
|
local matColor = playermatApi.getMatColorByPosition(position)
|
||||||
|
local matRotation = playermatApi.returnRotation(matColor)
|
||||||
|
local activeInvestigatorData = playermatApi.getActiveInvestigatorData(matColor)
|
||||||
|
|
||||||
spawned.setRotation(matRotation)
|
spawned.setRotation(matRotation)
|
||||||
spawned.call("updateClassAndSymbol", { class = class, symbol = class })
|
spawned.call("updateClassAndSymbol", {
|
||||||
|
class = activeInvestigatorData.class,
|
||||||
|
symbol = activeInvestigatorData.class
|
||||||
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user