Merge branch 'main' into extraToken
This commit is contained in:
commit
b8a0b38e55
@ -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": ""
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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"] = {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user