Merge branch 'main' into extraToken

This commit is contained in:
Chr1Z93 2024-06-08 23:03:55 +02:00
commit b8a0b38e55
11 changed files with 347 additions and 295 deletions

View File

@ -9,9 +9,29 @@
"Order": 0 "Order": 0
}, },
"ColorDiffuse": { "ColorDiffuse": {
"b": 0, "b": 1,
"g": 0.36652, "g": 1,
"r": 0.70588 "r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_COL.obj",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2450601198422160026/E21C455A90B78E48E0D03FCA4AF52A9C33C31534/",
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 6
}, },
"Description": "Put any cards in here to add them to the indices for the player card panel and deck importer.\n\nSelect the 'update index' entry in the context menu of this bag once you've added all cards.\n\nThis can be used for custom cards too.", "Description": "Put any cards in here to add them to the indices for the player card panel and deck importer.\n\nSelect the 'update index' entry in the context menu of this bag once you've added all cards.\n\nThis can be used for custom cards too.",
"DragSelectable": true, "DragSelectable": true,
@ -29,7 +49,7 @@
"MaterialIndex": -1, "MaterialIndex": -1,
"MeasureMovement": false, "MeasureMovement": false,
"MeshIndex": -1, "MeshIndex": -1,
"Name": "Bag", "Name": "Custom_Model",
"Nickname": "Additional Player Cards", "Nickname": "Additional Player Cards",
"Number": 0, "Number": 0,
"Snap": true, "Snap": true,
@ -40,14 +60,14 @@
"Tooltip": true, "Tooltip": true,
"Transform": { "Transform": {
"posX": 60, "posX": 60,
"posY": 1.204, "posY": 1.486,
"posZ": 48, "posZ": 48,
"rotX": 0, "rotX": 0,
"rotY": 0, "rotY": 270,
"rotZ": 0, "rotZ": 0,
"scaleX": 1.5, "scaleX": 1,
"scaleY": 1.5, "scaleY": 0.14,
"scaleZ": 1.5 "scaleZ": 1
}, },
"Value": 0, "Value": 0,
"XmlUI": "" "XmlUI": ""

View File

@ -22,7 +22,7 @@
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1704036721123215146/E44A3B99EACF310E49E94977151A03C9A3DC7F17/", "ImageURL": "http://cloud-3.steamusercontent.com/ugc/1704036721123215146/E44A3B99EACF310E49E94977151A03C9A3DC7F17/",
"WidthScale": 0 "WidthScale": 0
}, },
"Description": "Displays the hand size (total or by title for \"Dream Enhancing Serum\"), hover over it to briefly toggle counting method.\n\nAllows you to randomly discard a card from your hand.", "Description": "Displays the hand size (total or by title for \"Dream Enhancing Serum\" - hover over it to see the regular count).\n\nAllows you to randomly discard a card from your hand.",
"DragSelectable": true, "DragSelectable": true,
"GMNotes": "", "GMNotes": "",
"GUID": "450688", "GUID": "450688",

View File

@ -44,7 +44,7 @@
"Transform": { "Transform": {
"posX": 60, "posX": 60,
"posY": 1.481, "posY": 1.481,
"posZ": 56, "posZ": 57,
"rotX": 0, "rotX": 0,
"rotY": 270, "rotY": 270,
"rotZ": 0, "rotZ": 0,

View File

@ -1,7 +1,7 @@
local playmatApi = require("playermat/PlaymatApi") local playmatApi = require("playermat/PlaymatApi")
-- forward declaration of variables that are used across functions -- forward declaration of variables that are used across functions
local matColor, handColor, loopId, hovering local matColor, handColor, hovering
function onLoad() function onLoad()
local buttonParamaters = {} local buttonParamaters = {}
@ -10,7 +10,7 @@ function onLoad()
-- index 0: button as hand size label -- index 0: button as hand size label
buttonParamaters.hover_color = "White" buttonParamaters.hover_color = "White"
buttonParamaters.click_function = "none" buttonParamaters.click_function = "none"
buttonParamaters.position = { 0, 0.11, -0.4 } buttonParamaters.position = Vector(0, 0.11, -0.4)
buttonParamaters.height = 0 buttonParamaters.height = 0
buttonParamaters.width = 0 buttonParamaters.width = 0
buttonParamaters.font_size = 500 buttonParamaters.font_size = 500
@ -19,17 +19,14 @@ function onLoad()
-- index 1: button to toggle "des" -- index 1: button to toggle "des"
buttonParamaters.label = "DES: ✗" buttonParamaters.label = "DES: ✗"
buttonParamaters.click_function = "none" buttonParamaters.position.z = 0.25
buttonParamaters.position = { 0, 0.11, 0.25 }
buttonParamaters.height = 0
buttonParamaters.width = 0
buttonParamaters.font_size = 120 buttonParamaters.font_size = 120
self.createButton(buttonParamaters) self.createButton(buttonParamaters)
-- index 2: button to discard a card -- index 2: button to discard a card
buttonParamaters.label = "discard random card" buttonParamaters.label = "Discard Random Card"
buttonParamaters.click_function = "discardRandom" buttonParamaters.click_function = "discardRandom"
buttonParamaters.position = { 0, 0.11, 0.7 } buttonParamaters.position.z = 0.7
buttonParamaters.height = 175 buttonParamaters.height = 175
buttonParamaters.width = 900 buttonParamaters.width = 900
buttonParamaters.font_size = 90 buttonParamaters.font_size = 90
@ -39,27 +36,24 @@ function onLoad()
updateColors() updateColors()
-- start loop to update card count -- start loop to update card count
loopId = Wait.time(updateValue, 1, -1) playmatApi.checkForDES(matColor)
Wait.time(updateValue, 1, -1)
end end
-- updates colors when object is dropped somewhere -- updates colors when object is dropped somewhere
function onDrop() updateColors() end function onDrop() updateColors() end
-- toggles counting method briefly -- disables DES counting while hovered
function onObjectHover(hover_color, obj) function onObjectHover(hoverColor, object)
-- only continue if correct player hovers over "self" if hoverColor ~= handColor then return end
if obj ~= self or hover_color ~= handColor or hovering then return end
-- toggle this flag so this doesn't get executed multiple times during the delay if object == self then
hovering = true hovering = true
playmatApi.checkForDES(matColor)
-- stop loop, toggle "des" and displayed value briefly, then start new loop after 2s updateValue()
Wait.stop(loopId) else
updateValue(true)
Wait.time(function()
loopId = Wait.time(updateValue, 1, -1)
hovering = false hovering = false
end, 1) end
end end
-- updates the matcolor and handcolor variable -- updates the matcolor and handcolor variable
@ -70,7 +64,7 @@ function updateColors()
end end
-- count cards in hand (by name for DES) -- count cards in hand (by name for DES)
function updateValue(toggle) function updateValue()
-- update colors if handColor doesn't own a handzone -- update colors if handColor doesn't own a handzone
if Player[handColor].getHandCount() == 0 then if Player[handColor].getHandCount() == 0 then
updateColors() updateColors()
@ -79,19 +73,24 @@ function updateValue(toggle)
-- if there is still no handzone, then end here -- if there is still no handzone, then end here
if Player[handColor].getHandCount() == 0 then return end if Player[handColor].getHandCount() == 0 then return end
-- get state of "Dream-Enhancing Serum" from playermat and update button label -- get state of "Dream-Enhancing Serum" from playermat
local des = playmatApi.isDES(matColor) local hasDES = playmatApi.hasDES(matColor)
if toggle then des = not des end
self.editButton({ index = 1, label = "DES: " .. (des and "✓" or "✗") }) -- default to regular count if hovered
if hovering then
hasDES = false
end
self.editButton({ index = 1, label = "DES: " .. (hasDES and "✓" or "✗") })
-- count cards in hand -- count cards in hand
local hand = Player[handColor].getHandObjects() local hand = Player[handColor].getHandObjects()
local size = 0 local size = 0
if des then if hasDES then
local cardHash = {} local cardHash = {}
for _, obj in pairs(hand) do for _, obj in pairs(hand) do
if obj.tag == "Card" then if obj.type == "Card" then
local name = obj.getName() local name = obj.getName()
local title = string.match(name, '(.+)(%s%(%d+%))') or name local title = string.match(name, '(.+)(%s%(%d+%))') or name
cardHash[title] = true cardHash[title] = true
@ -102,12 +101,14 @@ function updateValue(toggle)
end end
else else
for _, obj in pairs(hand) do for _, obj in pairs(hand) do
if obj.tag == "Card" then size = size + 1 end if obj.type == "Card" then
size = size + 1
end
end end
end end
-- update button label and color -- update button label and color
self.editButton({ index = 0, font_color = des and "Green" or "White", label = size }) self.editButton({ index = 0, font_color = hasDES and "Green" or "White", label = size })
end end
-- discards a random non-hidden card from hand -- discards a random non-hidden card from hand

View File

@ -163,12 +163,11 @@ function endSearch(_, _, isRightClick)
-- draw set aside cards (from the ground!) -- draw set aside cards (from the ground!)
for _, obj in ipairs(searchLib.atPosition(setAsidePosition, "isCardOrDeck")) do for _, obj in ipairs(searchLib.atPosition(setAsidePosition, "isCardOrDeck")) do
local count = 1
if obj.type == "Deck" then if obj.type == "Deck" then
Wait.time(function() obj.deal(#obj.getObjects(), handColor) end, 1) count = #obj.getObjects()
elseif obj.type == "Card" then
obj.setPosition(Player[handColor].getHandTransform().position)
obj.flip()
end end
Wait.time(function() obj.deal(count, handColor) end, 1)
end end
normalView() normalView()
@ -180,11 +179,11 @@ function endSearch(_, _, isRightClick)
if deckAreaObjects.draw then if deckAreaObjects.draw then
deckAreaObjects.draw.shuffle() deckAreaObjects.draw.shuffle()
end end
end, (#handCards + 2.5) * 0.2) end, #handCards * 0.3 + 0.5)
end end
-- Norman Withers handling -- Norman Withers handling
if topCardDetected then if topCardDetected then
Wait.time(function() playmatApi.flipTopCardFromDeck(matColor) end, #handCards * 0.2) Wait.time(function() playmatApi.flipTopCardFromDeck(matColor) end, #handCards * 0.3 + 0.75)
end end
end end

View File

@ -71,16 +71,15 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
local matColor = playmatApi.getMatColor(playerColor) local matColor = playmatApi.getMatColor(playerColor)
local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat")
-- do not continue if the threat area is already full -- do not continue if the threat area is already full
if playmatApi.getEncounterCardDrawPosition(matColor, false) == playmatApi.getEncounterCardDrawPosition(matColor, true) then if playmatApi.getEncounterCardDrawPosition(matColor, false) == playmatApi.getEncounterCardDrawPosition(matColor, true) then
broadcastToColor("Threat area is full.", playerColor, "Yellow") broadcastToColor("Threat area is full.", playerColor, "Yellow")
return return
end end
-- initialize list of objects to move -- initialize list of objects to move
local moveTheseObjects = {} local moveTheseObjects = {}
for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do
table.insert(moveTheseObjects, obj) table.insert(moveTheseObjects, obj)
end end
@ -89,17 +88,15 @@ function takeCardIntoThreatArea(playerColor, hoveredObject)
local originalMatColor = guidReferenceApi.getOwnerOfObject(hoveredObject) local originalMatColor = guidReferenceApi.getOwnerOfObject(hoveredObject)
-- determine modifiers for the playmats -- determine modifiers for the playmats
local modifierY local modifierY = 0
if originalMatColor == "Red" then if originalMatColor == "Red" then
modifierY = 90 modifierY = 90
elseif originalMatColor == "Green" then elseif originalMatColor == "Green" then
modifierY = -90 modifierY = -90
else
modifierY = 0
end end
-- store local positions of objects
local localPositions = {} local localPositions = {}
for i, obj in ipairs(moveTheseObjects) do for i, obj in ipairs(moveTheseObjects) do
local localPos = hoveredObject.positionToLocal(obj.getPosition()) local localPos = hoveredObject.positionToLocal(obj.getPosition())
localPositions[i] = localPos localPositions[i] = localPos
@ -136,15 +133,17 @@ function discardObject(playerColor, hoveredObject)
end end
-- These should probably not be discarded normally. Ask player for confirmation. -- These should probably not be discarded normally. Ask player for confirmation.
if (hoveredObject.type == "Deck") or hoveredObject.hasTag("Location") then if hoveredObject.type == "Deck" or hoveredObject.hasTag("Location") then
local suspect = (hoveredObject.type == "Deck") and "Deck" or "Location" local suspect = (hoveredObject.type == "Deck") and "Deck" or "Location"
Player[playerColor].showConfirmDialog("Discard " .. suspect .. "?", function () performDiscard(playerColor, hoveredObject) end) Player[playerColor].showConfirmDialog("Discard " .. suspect .. "?",
function() performDiscard(playerColor, hoveredObject) end)
return return
end end
performDiscard(playerColor, hoveredObject) performDiscard(playerColor, hoveredObject)
end end
-- actually performs the discarding of the object and tokens / tiles on it
function performDiscard(playerColor, hoveredObject) function performDiscard(playerColor, hoveredObject)
-- initialize list of objects to discard -- initialize list of objects to discard
local discardTheseObjects = { hoveredObject } local discardTheseObjects = { hoveredObject }
@ -169,10 +168,11 @@ function discardTopDeck(playerColor, hoveredObject)
broadcastToColor("Hover a deck/card and try again.", playerColor, "Yellow") broadcastToColor("Hover a deck/card and try again.", playerColor, "Yellow")
return return
end end
-- take top card from deck (unless it is already a single card)
local takenCard = hoveredObject
if hoveredObject.type == "Deck" then if hoveredObject.type == "Deck" then
takenCard = hoveredObject.takeObject({ index = 0 }) takenCard = hoveredObject.takeObject({ index = 0 })
else
takenCard = hoveredObject
end end
Wait.frames(function() performDiscard(playerColor, takenCard) end, 1) Wait.frames(function() performDiscard(playerColor, takenCard) end, 1)
end end
@ -194,15 +194,21 @@ function getColorToDiscardFor(hoveredObject, playerColor)
areaNearPlaymat.minZ = bounds.center.z - bounds.size.z / 2 - bufferAroundPlaymat areaNearPlaymat.minZ = bounds.center.z - bounds.size.z / 2 - bufferAroundPlaymat
areaNearPlaymat.maxZ = bounds.center.z + bounds.size.z / 2 + bufferAroundPlaymat areaNearPlaymat.maxZ = bounds.center.z + bounds.size.z / 2 + bufferAroundPlaymat
-- discard to closest mat if near it, use triggering playmat if not -- discard to closest mat if near it
local discardForMatColor
if inArea(pos, areaNearPlaymat) then if inArea(pos, areaNearPlaymat) then
return closestMatColor return closestMatColor
elseif pos.y > (Player[playerColor].getHandTransform().position.y - (Player[playerColor].getHandTransform().scale.y / 2)) then -- discard to closest mat if card is in a hand
return closestMatColor
else
return playmatApi.getMatColor(playerColor)
end end
-- discard to closest mat if card is in a hand
local handZone = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "HandZone")
for _, zone in ipairs(hoveredObject.getZones()) do
if zone == handZone then
return closestMatColor
end
end
-- discard to triggering mat if previous conditions weren't met
return playmatApi.getMatColor(playerColor)
end end
-- moves the hovered card to the victory display -- moves the hovered card to the victory display

View File

@ -1445,7 +1445,7 @@ function applyOptionPanelChange(id, state)
local counter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "MasterClueCounter") local counter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "MasterClueCounter")
counter.setVar("useClickableCounters", state) counter.setVar("useClickableCounters", state)
-- option: Play area snap tags -- option: Play area connection drawing
elseif id == "playAreaConnections" then elseif id == "playAreaConnections" then
playAreaApi.setConnectionDrawState(state) playAreaApi.setConnectionDrawState(state)

View File

@ -65,7 +65,7 @@ function onLoad(savedData)
locations = loadedData.trackedLocations or {} locations = loadedData.trackedLocations or {}
currentScenario = loadedData.currentScenario currentScenario = loadedData.currentScenario
connectionColor = loadedData.connectionColor or { 0.4, 0.4, 0.4, 1 } connectionColor = loadedData.connectionColor or { 0.4, 0.4, 0.4, 1 }
connectionsEnabled = loadedData.connectionsEnabled or true connectionsEnabled = loadedData.connectionsEnabled
end end
-- this needs to be here since the playarea will be reloaded when the image changes -- this needs to be here since the playarea will be reloaded when the image changes

View File

@ -549,38 +549,38 @@ INVESTIGATORS["Wilson Richards"] = {
cards = { "10001" }, cards = { "10001" },
minicards = { "10001-m" }, minicards = { "10001-m" },
signatures = { "10002", "10003" }, signatures = { "10002", "10003" },
starterDeck = "2634667" --carson deck as placeholder starterDeck = "3893753"
} }
INVESTIGATORS["Kate Winthrop"] = { INVESTIGATORS["Kate Winthrop"] = {
cards = { "10004" }, cards = { "10004" },
minicards = { "10004-m" }, minicards = { "10004-m" },
signatures = { "10005", "10006", "10007", "10008" }, signatures = { "10005", "10006", "10007", "10008" },
starterDeck = "2643928" --harvey deck as placeholder starterDeck = "3893779"
} }
INVESTIGATORS["Alessandra Zorzi"] = { INVESTIGATORS["Alessandra Zorzi"] = {
cards = { "10009" }, cards = { "10009" },
minicards = { "10009-m" }, minicards = { "10009-m" },
signatures = { "10010", "10010", "10010", "10011" }, signatures = { "10010", "10010", "10010", "10011" },
starterDeck = "2643931" --winifred deck as placeholder starterDeck = "3893775"
} }
INVESTIGATORS["Kōhaku Narukami"] = { INVESTIGATORS["Kōhaku Narukami"] = {
cards = { "10012" }, cards = { "10012" },
minicards = { "10012-m" }, minicards = { "10012-m" },
signatures = { "10013", "10014" }, signatures = { "10013", "10014" },
starterDeck = "2636199" --gloria deck as placeholder starterDeck = "3893763"
} }
INVESTIGATORS["Hank Samson"] = { INVESTIGATORS["Hank Samson"] = {
cards = { "10015", "10015-b1", "10015-b2" }, cards = { "10015", "10015-b1", "10015-b2" },
minicards = { "10015-m" }, minicards = { "10015-m" },
signatures = { "10017", "10018" }, signatures = { "10017", "10018" },
starterDeck = "2643934" --stella deck as placeholder starterDeck = "3893788"
} }
-- PnP content -- PnP content
INVESTIGATORS["Subject 5U-21"] = { INVESTIGATORS["Subject 5U-21"] = {
cards = { "89001" }, cards = { "89001" },
minicards = { "89001-m" }, minicards = { "89001-m" },
signatures = { "89002", "89003", "89003", "89003", "89004", "89004", "89004", "89005" }, signatures = { "89002", "89003", "89003", "89003", "89004", "89004", "89004", "89005" },
starterDeck = "2624990" -- Lola's deck id until Suzi is on ArkhamDB starterDeck = "3893795"
} }
-- Promo content -- Promo content
INVESTIGATORS["Gloria Goldberg"] = { INVESTIGATORS["Gloria Goldberg"] = {

View File

@ -16,6 +16,7 @@ local DISCARD_BUTTON_X_START = -1.365
local DISCARD_BUTTON_X_OFFSET = 0.455 local DISCARD_BUTTON_X_OFFSET = 0.455
local SEARCH_AROUND_SELF_X_BUFFER = 8 local SEARCH_AROUND_SELF_X_BUFFER = 8
local SEARCH_AROUND_SELF_Z_BUFFER = 1.75
-- defined areas for object searching -- defined areas for object searching
local MAIN_PLAY_AREA = { local MAIN_PLAY_AREA = {
@ -89,7 +90,7 @@ activeInvestigatorId = "00000"
local isDrawButtonVisible = false local isDrawButtonVisible = false
-- global variable to report "Dream-Enhancing Serum" status -- global variable to report "Dream-Enhancing Serum" status
isDES = false hasDES = false
-- table of type-object reference pairs of all owned objects -- table of type-object reference pairs of all owned objects
local ownedObjects = {} local ownedObjects = {}
@ -170,17 +171,23 @@ end
-- finds all objects on the playmat and associated set aside zone. -- finds all objects on the playmat and associated set aside zone.
function searchAroundSelf(filter) function searchAroundSelf(filter)
local scale = self.getScale()
local bounds = self.getBoundsNormalized() local bounds = self.getBoundsNormalized()
-- Increase the width to cover the set aside zone -- Increase the width to cover the set aside zone
bounds.size.x = bounds.size.x + SEARCH_AROUND_SELF_X_BUFFER bounds.size.x = bounds.size.x + SEARCH_AROUND_SELF_X_BUFFER
bounds.size.y = 1 bounds.size.y = 1
-- Since the cast is centered on the position, shift left or right to keep the non-set aside edge bounds.size.z = bounds.size.z + SEARCH_AROUND_SELF_Z_BUFFER
-- of the cast at the edge of the playmat
-- setAsideDirection accounts for the set aside zone being on the left or right, depending on the -- 'setAsideDirection' accounts for the set aside zone being on the left or right,
-- table position of the playmat -- depending on the table position of the playmat
local setAsideDirection = bounds.center.z > 0 and 1 or -1 local setAsideDirection = bounds.center.z > 0 and 1 or -1
-- Since the cast is centered on the position, shift left or right to keep
-- the non-set aside edge of the cast at the edge of the playmat
local localCenter = self.positionToLocal(bounds.center) local localCenter = self.positionToLocal(bounds.center)
localCenter.x = localCenter.x + setAsideDirection * SEARCH_AROUND_SELF_X_BUFFER / 2 / self.getScale().x localCenter.x = localCenter.x + setAsideDirection * SEARCH_AROUND_SELF_X_BUFFER / 2 / scale.x
localCenter.z = localCenter.z - SEARCH_AROUND_SELF_Z_BUFFER / 2 / scale.z
return searchArea(self.positionToWorld(localCenter), bounds.size, filter) return searchArea(self.positionToWorld(localCenter), bounds.size, filter)
end end
@ -291,7 +298,8 @@ function doUpkeep(_, clickedByColor, isRightClick)
updateMessageColor(clickedByColor) updateMessageColor(clickedByColor)
-- unexhaust cards in play zone, flip action tokens and find forcedLearning -- unexhaust cards in play zone, flip action tokens and find Forced Learning / Dream-Enhancing Serum
checkForDES()
local forcedLearning = false local forcedLearning = false
local rot = self.getRotation() local rot = self.getRotation()
for _, obj in ipairs(searchAroundSelf()) do for _, obj in ipairs(searchAroundSelf()) do
@ -319,7 +327,7 @@ function doUpkeep(_, clickedByColor, isRightClick)
obj.setRotation({ rot.x, rot.y + yRotDiff, rot.z }) obj.setRotation({ rot.x, rot.y + yRotDiff, rot.z })
end end
-- detect forced learning to handle card drawing accordingly -- detect Forced Learning to handle card drawing accordingly
if cardMetadata.id == "08031" then if cardMetadata.id == "08031" then
forcedLearning = true forcedLearning = true
end end
@ -535,6 +543,23 @@ function doDiscardOne()
end end
end end
-- checks if DES is present
function checkForDES()
hasDES = false
for _, obj in ipairs(searchAroundSelf()) do
if obj.type == "Card" then
local cardMetadata = JSON.decode(obj.getGMNotes()) or {}
-- position is used to exclude deck / discard
local cardPos = self.positionToLocal(obj.getPosition())
if cardMetadata.id == "06159" and cardPos.x > -1 then
hasDES = true
break
end
end
end
end
--------------------------------------------------------- ---------------------------------------------------------
-- slot symbol displaying -- slot symbol displaying
--------------------------------------------------------- ---------------------------------------------------------
@ -754,9 +779,6 @@ function onCollisionEnter(collisionInfo)
-- only continue for cards -- only continue for cards
if object.type ~= "Card" then return end if object.type ~= "Card" then return end
-- detect if "Dream-Enhancing Serum" is placed
if object.getName() == "Dream-Enhancing Serum" then isDES = true end
maybeUpdateActiveInvestigator(object) maybeUpdateActiveInvestigator(object)
syncCustomizableMetadata(object) syncCustomizableMetadata(object)
@ -769,11 +791,6 @@ function onCollisionEnter(collisionInfo)
end end
end end
-- detect if "Dream-Enhancing Serum" is removed
function onCollisionExit(collisionInfo)
if collisionInfo.collision_object.getName() == "Dream-Enhancing Serum" then isDES = false end
end
-- checks if tokens should be spawned for the provided card -- checks if tokens should be spawned for the provided card
function shouldSpawnTokens(card) function shouldSpawnTokens(card)
if card.is_face_down then if card.is_face_down then

View File

@ -47,11 +47,20 @@ do
end end
end end
-- Instructs a playmat to check for DES
---@param matColor string Color of the playmat - White, Orange, Green, Red or All
PlaymatApi.checkForDES = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("checkForDES")
end
end
-- Returns if there is the card "Dream-Enhancing Serum" on the requested playmat -- Returns if there is the card "Dream-Enhancing Serum" on the requested playmat
---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All")
PlaymatApi.isDES = function(matColor) ---@return boolean: whether DES is present on the playmat
PlaymatApi.hasDES = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do for _, mat in pairs(getMatForColor(matColor)) do
return mat.getVar("isDES") return mat.getVar("hasDES")
end end
end end