ah_sce_unpacked/unpacked/Bag All Player Cards 15bb07/CardCustom Makeshift Trap Upgrade Sheet 64dfce.ttslua

1034 lines
34 KiB
Plaintext
Raw Normal View History

2023-04-22 16:56:01 -04:00
-- Bundled by luabundle {"version":"1.6.0"}
local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire)
local loadingPlaceholder = {[{}] = true}
local register
local modules = {}
local require
local loaded = {}
register = function(name, body)
if not modules[name] then
modules[name] = body
end
end
require = function(name)
local loadedModule = loaded[name]
if loadedModule then
if loadedModule == loadingPlaceholder then
return nil
end
else
if not modules[name] then
if not superRequire then
local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name)
error('Tried to require ' .. identifier .. ', but no such module has been registered')
else
return superRequire(name)
end
end
loaded[name] = loadingPlaceholder
loadedModule = modules[name](require, loaded, register, modules)
loaded[name] = loadedModule
end
return loadedModule
end
return require, loaded, register, modules
end)(nil)
2024-03-10 09:56:22 -04:00
__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules)
require("playercards/customizable/MakeshiftTrapUpgradeSheet")
2024-02-17 19:48:30 -05:00
end)
__bundle_register("playercards/customizable/MakeshiftTrapUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules)
-- Customizable Cards: Makeshift Trap
-- Color information for buttons
boxSize = 39
-- static values
xInitial = -0.935
xOffset = 0.0735
customizations = {
[1] = {
checkboxes = {
posZ = -0.889,
count = 1,
}
},
[2] = {
checkboxes = {
posZ = -0.655,
count = 1,
}
},
[3] = {
checkboxes = {
posZ = -0.325,
count = 2,
}
},
[4] = {
checkboxes = {
posZ = -0.085,
count = 2,
}
},
[5] = {
checkboxes = {
posZ = 0.252,
count = 2,
},
},
[6] = {
checkboxes = {
posZ = 0.585,
count = 3,
}
},
[7] = {
checkboxes = {
posZ = 0.927,
count = 4,
},
},
}
require("playercards/customizable/UpgradeSheetLibrary")
end)
__bundle_register("playercards/customizable/UpgradeSheetLibrary", function(require, _LOADED, __bundle_register, __bundle_modules)
-- Common code for handling customizable card upgrade sheets
-- Define UI elements in the base card file, then include this
-- UI element definition is an array of tables, each with this structure. A row may include
-- checkboxes (number defined by count), a text field, both, or neither (if the row has custom
-- handling, as Living Ink does)
-- {
-- checkboxes = {
-- posZ = -0.71,
-- count = 1,
-- },
-- textField = {
-- position = { 0.005, 0.25, -0.58 },
-- width = 875
-- }
-- }
-- Fields should also be defined for xInitial (left edge of the checkboxes) and xOffset (amount to
-- shift X from one box to the next) as well as boxSize (checkboxes) and inputFontSize.
--
-- selectedUpgrades holds the state of checkboxes and text input, each element being:
-- selectedUpgrades[row] = { xp = #, text = "" }
2024-07-27 21:47:52 -04:00
local playermatApi = require("playermat/PlayermatApi")
2024-02-17 19:48:30 -05:00
-- Y position for UI elements. Visibility of checkboxes moves the checkbox inside the card object
-- when not selected.
local Y_VISIBLE = 0.25
local Y_INVISIBLE = -0.5
-- Used for Summoned Servitor and Living Ink
local VECTOR_COLOR = {
unselected = { 0.5, 0.5, 0.5, 0.75 },
mystic = { 0.597, 0.195, 0.796 }
}
2024-03-10 09:56:22 -04:00
-- These match with ArkhamDB's way of storing the data in the dropdown menu
local SUMMONED_SERVITOR_SLOT_INDICES = { arcane = "1", ally = "0", none = "" }
local rowCheckboxFirstIndex = { }
local rowInputIndex = { }
local selectedUpgrades = { }
-- save state when going into bags / decks
function onDestroy() self.script_state = onSave() end
function onSave()
return JSON.encode({
selections = selectedUpgrades
})
end
-- Startup procedure
function onLoad(savedData)
if savedData ~= "" then
local loadedData = JSON.decode(savedData)
if loadedData.selections ~= nil then
selectedUpgrades = loadedData.selections
end
end
selfId = getSelfId()
maybeLoadLivingInkSkills()
createUi()
maybeUpdateLivingInkSkillDisplay()
maybeUpdateServitorSlotDisplay()
self.addContextMenuItem("Clear Selections", function() resetSelections() end)
self.addContextMenuItem("Scale: 1x", function() self.setScale({ 1, 1, 1 }) end)
self.addContextMenuItem("Scale: 2x", function() self.setScale({ 2, 1, 2 }) end)
self.addContextMenuItem("Scale: 3x", function() self.setScale({ 3, 1, 3 }) end)
end
-- Grabs the ID from the metadata for special functions (Living Ink, Summoned Servitor)
function getSelfId()
local metadata = JSON.decode(self.getGMNotes())
return metadata.id
end
function isUpgradeActive(row)
return customizations[row] ~= nil
and customizations[row].checkboxes ~= nil
and customizations[row].checkboxes.count ~= nil
and customizations[row].checkboxes.count > 0
and selectedUpgrades[row] ~= nil
and selectedUpgrades[row].xp ~= nil
and selectedUpgrades[row].xp >= customizations[row].checkboxes.count
end
function resetSelections()
selectedUpgrades = { }
updateDisplay()
end
function createUi()
if customizations == nil then
return
end
for i = 1, #customizations do
if customizations[i].checkboxes ~= nil then
createRowCheckboxes(i)
end
if customizations[i].textField ~= nil then
createRowTextField(i)
end
end
maybeMakeLivingInkSkillSelectionButtons()
maybeMakeServitorSlotSelectionButtons()
updateDisplay()
end
function createRowCheckboxes(rowIndex)
local checkboxes = customizations[rowIndex].checkboxes
rowCheckboxFirstIndex[rowIndex] = 0
local previousButtons = self.getButtons()
if previousButtons ~= nil then
rowCheckboxFirstIndex[rowIndex] = #previousButtons
end
for col = 1, checkboxes.count do
local funcName = "checkboxRow" .. rowIndex .. "Col" .. col
local func = function() clickCheckbox(rowIndex, col) end
self.setVar(funcName, func)
local checkboxPos = getCheckboxPosition(rowIndex, col)
self.createButton({
click_function = funcName,
function_owner = self,
position = checkboxPos,
height = boxSize * 10,
width = boxSize * 10,
font_size = 1000,
scale = { 0.1, 0.1, 0.1 },
color = { 0, 0, 0 },
font_color = { 0, 0, 0 }
})
end
end
function getCheckboxPosition(row, col)
return {
x = xInitial + col * xOffset,
y = Y_VISIBLE,
z = customizations[row].checkboxes.posZ
}
end
function createRowTextField(rowIndex)
local textField = customizations[rowIndex].textField
rowInputIndex[rowIndex] = 0
local previousInputs = self.getInputs()
if previousInputs ~= nil then
rowInputIndex[rowIndex] = #previousInputs
end
local funcName = "textbox" .. rowIndex
local func = function(_, _, val, sel) clickTextbox(rowIndex, val, sel) end
self.setVar(funcName, func)
self.createInput({
input_function = funcName,
function_owner = self,
label = "Click to type",
alignment = 2,
position = textField.position,
scale = { 0.1, 0.1, 0.1 },
width = textField.width * 10,
height = inputFontsize * 10 + 75,
font_size = inputFontsize * 10.5,
color = "White",
value = ""
})
end
function updateDisplay()
for i = 1, #customizations do
updateRowDisplay(i)
end
maybeUpdateLivingInkSkillDisplay()
maybeUpdateServitorSlotDisplay()
end
function updateRowDisplay(rowIndex)
if customizations[rowIndex].checkboxes ~= nil then
updateCheckboxes(rowIndex)
end
if customizations[rowIndex].textField ~= nil then
updateTextField(rowIndex)
end
end
function updateCheckboxes(rowIndex)
local checkboxCount = customizations[rowIndex].checkboxes.count
local selected = 0
if selectedUpgrades[rowIndex] ~= nil and selectedUpgrades[rowIndex].xp ~= nil then
selected = selectedUpgrades[rowIndex].xp
end
local checkboxIndex = rowCheckboxFirstIndex[rowIndex]
for col = 1, checkboxCount do
local pos = getCheckboxPosition(rowIndex, col)
if col <= selected then
pos.y = Y_VISIBLE
else
pos.y = Y_INVISIBLE
end
self.editButton({
index = checkboxIndex,
position = pos
})
checkboxIndex = checkboxIndex + 1
end
end
function updateTextField(rowIndex)
local inputIndex = rowInputIndex[rowIndex]
if selectedUpgrades[rowIndex] ~= nil and selectedUpgrades[rowIndex].text ~= nil then
self.editInput({
index = inputIndex,
value = " " .. selectedUpgrades[rowIndex].text
})
end
end
function clickCheckbox(row, col)
if selectedUpgrades[row] == nil then
selectedUpgrades[row] = { }
selectedUpgrades[row].xp = 0
end
if selectedUpgrades[row].xp == col then
selectedUpgrades[row].xp = col - 1
else
selectedUpgrades[row].xp = col
end
updateCheckboxes(row)
2024-07-27 21:47:52 -04:00
playermatApi.syncAllCustomizableCards()
2024-03-10 09:56:22 -04:00
end
-- Updates saved value for given text box when it loses focus
function clickTextbox(rowIndex, value, selected)
if selected == false then
if selectedUpgrades[rowIndex] == nil then
selectedUpgrades[rowIndex] = { }
end
selectedUpgrades[rowIndex].text = value:gsub("^%s*(.-)%s*$", "%1")
-- Editing isn't actually done yet, and will block the update. Wait a frame so it's finished
Wait.frames(function() updateRowDisplay(rowIndex) end, 1)
end
end
---------------------------------------------------------
-- Living Ink related functions
---------------------------------------------------------
-- Builds the list of boolean skill selections from the Row 1 text field
function maybeLoadLivingInkSkills()
if selfId ~= "09079-c" then return end
selectedSkills = {
willpower = false,
intellect = false,
combat = false,
agility = false
}
if selectedUpgrades[1] ~= nil and selectedUpgrades[1].text ~= nil then
for skill in string.gmatch(selectedUpgrades[1].text, "([^,]+)") do
selectedSkills[skill] = true
end
end
end
function clickSkill(skillname)
selectedSkills[skillname] = not selectedSkills[skillname]
maybeUpdateLivingInkSkillDisplay()
updateSelectedLivingInkSkillText()
end
-- Creates the invisible buttons overlaying the skill icons
function maybeMakeLivingInkSkillSelectionButtons()
if selfId ~= "09079-c" then return end
local buttonData = {
function_owner = self,
position = { y = 0.2 },
height = 130,
width = 130,
color = { 0, 0, 0, 0 },
}
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
for skillname, _ in pairs(selectedSkills) do
local funcName = "clickSkill" .. skillname
self.setVar(funcName, function() clickSkill(skillname) end)
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
buttonData.click_function = funcName
buttonData.position.x = -1 * SKILL_ICON_POSITIONS[skillname].x
buttonData.position.z = SKILL_ICON_POSITIONS[skillname].z
self.createButton(buttonData)
end
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- Builds a comma-delimited string of skills and places it in the Row 1 text field
function updateSelectedLivingInkSkillText()
local skillString = ""
if selectedSkills.willpower then
skillString = skillString .. "willpower" .. ","
end
if selectedSkills.intellect then
skillString = skillString .. "intellect" .. ","
end
if selectedSkills.combat then
skillString = skillString .. "combat" .. ","
end
if selectedSkills.agility then
skillString = skillString .. "agility" .. ","
end
if selectedUpgrades[1] == nil then
selectedUpgrades[1] = { }
end
selectedUpgrades[1].text = skillString
2024-02-17 19:48:30 -05:00
end
2024-03-10 09:56:22 -04:00
-- Refresh the vector circles indicating a skill is selected. Since we can only have one table of
-- vectors set, have to refresh all 4 at once
function maybeUpdateLivingInkSkillDisplay()
if selfId ~= "09079-c" then return end
local circles = {}
for skill, isSelected in pairs(selectedSkills) do
if isSelected then
local circle = getCircleVector(SKILL_ICON_POSITIONS[skill])
if circle ~= nil then
table.insert(circles, circle)
end
2024-01-06 21:32:29 -05:00
end
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
self.setVectorLines(circles)
end
2023-08-27 21:09:46 -04:00
2024-03-10 09:56:22 -04:00
function getCircleVector(center)
local diameter = Vector(0, 0, 0.1)
local pointOfOrigin = Vector(center.x, Y_VISIBLE, center.z)
local vec
local vecList = {}
local arcStep = 5
for i = 0, 360, arcStep do
diameter:rotateOver('y', arcStep)
vec = pointOfOrigin + diameter
vec.y = pointOfOrigin.y
table.insert(vecList, vec)
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
return {
points = vecList,
color = VECTOR_COLOR.mystic,
thickness = 0.02,
}
2024-02-17 19:48:30 -05:00
end
2024-03-10 09:56:22 -04:00
---------------------------------------------------------
-- Summoned Servitor related functions
---------------------------------------------------------
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- Creates the invisible buttons overlaying the slot words
function maybeMakeServitorSlotSelectionButtons()
if selfId ~= "09080-c" then return end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
local buttonData = {
click_function = "clickArcane",
function_owner = self,
position = { x = -1 * SLOT_ICON_POSITIONS.arcane.x, y = 0.2, z = SLOT_ICON_POSITIONS.arcane.z },
height = 130,
width = 130,
color = { 0, 0, 0, 0 },
}
self.createButton(buttonData)
buttonData.click_function = "clickAlly"
buttonData.position.x = -1 * SLOT_ICON_POSITIONS.ally.x
self.createButton(buttonData)
2024-02-17 19:48:30 -05:00
end
2023-08-27 21:09:46 -04:00
2024-03-10 09:56:22 -04:00
-- toggles the clicked slot
function clickArcane()
if selectedUpgrades[6] == nil then
selectedUpgrades[6] = { }
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
if selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.arcane then
selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.none
else
selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.arcane
2024-02-04 10:51:51 -05:00
end
2024-03-10 09:56:22 -04:00
maybeUpdateServitorSlotDisplay()
2024-02-17 19:48:30 -05:00
end
2024-02-04 10:51:51 -05:00
2024-03-10 09:56:22 -04:00
-- toggles the clicked slot
function clickAlly()
if selectedUpgrades[6] == nil then
selectedUpgrades[6] = { }
2024-01-06 21:32:29 -05:00
end
2024-03-10 09:56:22 -04:00
if selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.ally then
selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.none
else
selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.ally
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
maybeUpdateServitorSlotDisplay()
2024-02-17 19:48:30 -05:00
end
2023-08-27 21:09:46 -04:00
2024-03-10 09:56:22 -04:00
-- Refresh the vector circles indicating a slot is selected.
function maybeUpdateServitorSlotDisplay()
if selfId ~= "09080-c" then return end
local center = SLOT_ICON_POSITIONS["arcane"]
local arcaneVecList = {
Vector(center.x + 0.12, Y_VISIBLE, center.z + 0.05),
Vector(center.x - 0.12, Y_VISIBLE, center.z + 0.05),
Vector(center.x - 0.12, Y_VISIBLE, center.z - 0.05),
Vector(center.x + 0.12, Y_VISIBLE, center.z - 0.05),
Vector(center.x + 0.12, Y_VISIBLE, center.z + 0.05),
}
center = SLOT_ICON_POSITIONS["ally"]
local allyVecList = {
Vector(center.x + 0.07, Y_VISIBLE, center.z + 0.05),
Vector(center.x - 0.07, Y_VISIBLE, center.z + 0.05),
Vector(center.x - 0.07, Y_VISIBLE, center.z - 0.05),
Vector(center.x + 0.07, Y_VISIBLE, center.z - 0.05),
Vector(center.x + 0.07, Y_VISIBLE, center.z + 0.05),
2024-02-17 19:48:30 -05:00
}
2024-03-10 09:56:22 -04:00
local arcaneVecColor = VECTOR_COLOR.unselected
local allyVecColor = VECTOR_COLOR.unselected
if selectedUpgrades[6] ~= nil and selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.arcane then
arcaneVecColor = VECTOR_COLOR.mystic
elseif selectedUpgrades[6] ~= nil and selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.ally then
allyVecColor = VECTOR_COLOR.mystic
end
self.setVectorLines({
{
points = arcaneVecList,
color = arcaneVecColor,
thickness = 0.02,
},
{
points = allyVecList,
color = allyVecColor,
thickness = 0.02,
}
})
2024-02-17 19:48:30 -05:00
end
2024-03-10 09:56:22 -04:00
end)
2024-07-27 21:47:52 -04:00
__bundle_register("playermat/PlayermatApi", function(require, _LOADED, __bundle_register, __bundle_modules)
2024-03-10 09:56:22 -04:00
do
2024-07-27 21:47:52 -04:00
local PlayermatApi = {}
2024-03-10 09:56:22 -04:00
local guidReferenceApi = require("core/GUIDReferenceApi")
local searchLib = require("util/SearchLib")
2024-07-27 21:47:52 -04:00
local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 }
2023-08-27 21:09:46 -04:00
2024-03-10 09:56:22 -04:00
-- Convenience function to look up a mat's object by color, or get all mats.
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
---@return table: Single-element if only single playermat is requested
2024-03-10 09:56:22 -04:00
local function getMatForColor(matColor)
if matColor == "All" then
return guidReferenceApi.getObjectsByType("Playermat")
else
return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") }
end
end
2023-08-27 21:09:46 -04:00
2024-07-27 21:47:52 -04:00
-- Returns the color of the closest playermat
2024-03-10 09:56:22 -04:00
---@param startPos table Starting position to get the closest mat from
2024-07-27 21:47:52 -04:00
PlayermatApi.getMatColorByPosition = function(startPos)
2024-03-10 09:56:22 -04:00
local result, smallestDistance
for matColor, mat in pairs(getMatForColor("All")) do
local distance = Vector.between(startPos, mat.getPosition()):magnitude()
if smallestDistance == nil or distance < smallestDistance then
smallestDistance = distance
result = matColor
end
end
return result
2023-08-27 21:09:46 -04:00
end
2024-07-27 21:47:52 -04:00
-- Returns the color of the player's hand that is seated next to the playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getPlayerColor = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getVar("playerColor")
end
end
2023-08-27 21:09:46 -04:00
2024-07-27 21:47:52 -04:00
-- Returns the color of the playermat that owns the playercolor's hand
---@param handColor string Color of the playermat
PlayermatApi.getMatColor = function(handColor)
2024-03-10 09:56:22 -04:00
for matColor, mat in pairs(getMatForColor("All")) do
local playerColor = mat.getVar("playerColor")
if playerColor == handColor then
return matColor
end
end
2023-08-27 21:09:46 -04:00
end
2024-07-27 21:47:52 -04:00
-- Instructs a playermat to check for DES
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.checkForDES = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
2024-07-27 21:47:52 -04:00
mat.call("checkForDES")
2024-03-10 09:56:22 -04:00
end
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
2024-07-27 21:47:52 -04:00
-- Returns if there is the card "Dream-Enhancing Serum" on the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
---@return boolean: whether DES is present on the playermat
PlayermatApi.hasDES = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getVar("hasDES")
end
end
-- gets the slot data for the playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getSlotData = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getTable("slotData")
end
end
-- sets the slot data for the playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
---@param newSlotData table New slot data for the playermat
PlayermatApi.loadSlotData = function(matColor, newSlotData)
for _, mat in pairs(getMatForColor(matColor)) do
mat.setTable("slotData", newSlotData)
mat.call("redrawSlotSymbols")
return
end
end
-- Performs a search of the deck area of the requested playermat and returns the result as table
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getDeckAreaObjects = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.call("getDeckAreaObjects")
end
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
-- Flips the top card of the deck (useful after deck manipulation for Norman Withers)
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.flipTopCardFromDeck = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.call("flipTopCardFromDeck")
end
2024-02-04 10:51:51 -05:00
end
2024-03-10 09:56:22 -04:00
2024-07-27 21:47:52 -04:00
-- Returns the position of the discard pile of the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getDiscardPosition = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.call("returnGlobalDiscardPosition")
2024-01-06 21:32:29 -05:00
end
2024-01-06 21:32:07 -05:00
end
2024-07-27 21:47:52 -04:00
-- Returns the position of the draw pile of the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getDrawPosition = function(matColor)
2024-06-09 10:10:21 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.call("returnGlobalDrawPosition")
end
end
2024-03-10 09:56:22 -04:00
-- Transforms a local position into a global position
---@param localPos table Local position to be transformed
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.transformLocalPosition = function(localPos, matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.positionToWorld(localPos)
end
2024-02-04 10:51:51 -05:00
end
2024-07-27 21:47:52 -04:00
-- Returns the rotation of the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.returnRotation = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getRotation()
end
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
-- Returns a table with spawn data (position and rotation) for a helper object
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
2024-03-10 09:56:22 -04:00
---@param helperName string Name of the helper object
2024-07-27 21:47:52 -04:00
PlayermatApi.getHelperSpawnData = function(matColor, helperName)
2024-03-10 09:56:22 -04:00
local resultTable = {}
local localPositionTable = {
["Hand Helper"] = {0.05, 0, -1.182},
["Search Assistant"] = {-0.3, 0, -1.182}
}
for color, mat in pairs(getMatForColor(matColor)) do
resultTable[color] = {
position = mat.positionToWorld(localPositionTable[helperName]),
rotation = mat.getRotation()
}
end
return resultTable
2023-08-27 21:09:46 -04:00
end
2024-03-10 09:56:22 -04:00
2024-07-27 21:47:52 -04:00
-- Triggers the Upkeep for the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
2024-03-10 09:56:22 -04:00
---@param playerColor string Color of the calling player (for messages)
2024-07-27 21:47:52 -04:00
PlayermatApi.doUpkeepFromHotkey = function(matColor, playerColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("doUpkeepFromHotkey", playerColor)
2024-01-06 21:32:29 -05:00
end
2024-01-06 21:32:07 -05:00
end
2024-07-27 21:47:52 -04:00
-- Handles discarding for the requested playermat for the provided list of objects
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
2024-03-10 09:56:22 -04:00
---@param objList table List of objects to discard
2024-07-27 21:47:52 -04:00
PlayermatApi.discardListOfObjects = function(matColor, objList)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("discardListOfObjects", objList)
end
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- Returns the active investigator id
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.returnInvestigatorId = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getVar("activeInvestigatorId")
2023-08-27 21:09:46 -04:00
end
end
2024-07-27 21:47:52 -04:00
-- Returns the class of the active investigator
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
PlayermatApi.returnInvestigatorClass = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
return mat.getVar("activeInvestigatorClass")
end
end
2024-06-09 10:10:21 -04:00
-- Returns the position for encounter card drawing
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
2024-06-09 10:10:21 -04:00
---@param stack boolean If true, returns the leftmost position instead of the first empty from the right
2024-07-27 21:47:52 -04:00
PlayermatApi.getEncounterCardDrawPosition = function(matColor, stack)
2024-06-09 10:10:21 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return Vector(mat.call("getEncounterCardDrawPosition", stack))
end
end
2024-07-27 21:47:52 -04:00
-- Sets the requested playermat's snap points to limit snapping to matching card types or not. If
2024-03-10 09:56:22 -04:00
-- matchTypes is true, the main card slot snap points will only snap assets, while the
-- investigator area point will only snap Investigators. If matchTypes is false, snap points will
-- be reset to snap all cards.
---@param matchCardTypes boolean Whether snap points should only snap for the matching card types
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.setLimitSnapsByType = function(matchCardTypes, matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("setLimitSnapsByType", matchCardTypes)
end
end
2024-01-06 21:32:07 -05:00
2024-07-27 21:47:52 -04:00
-- Sets the requested playermat's draw 1 button to visible
2024-03-10 09:56:22 -04:00
---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.showDrawButton = function(isDrawButtonVisible, matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("showDrawButton", isDrawButtonVisible)
end
end
2024-01-06 21:32:07 -05:00
2024-07-27 21:47:52 -04:00
-- Shows or hides the clickable clue counter for the requested playermat
2024-03-10 09:56:22 -04:00
---@param showCounter boolean Whether the clickable counter should be present or not
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.clickableClues = function(showCounter, matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("clickableClues", showCounter)
end
end
2024-02-17 19:48:30 -05:00
2024-07-27 21:47:52 -04:00
-- Toggles the use of class textures for the requested playermat
---@param state boolean Whether the class texture should be used or not
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.useClassTexture = function(state, matColor)
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("useClassTexture", state)
end
end
-- Removes all clues (to the trash for tokens and counters set to 0) for the requested playermat
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.removeClues = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("removeClues")
end
end
2024-02-17 19:48:30 -05:00
2024-07-27 21:47:52 -04:00
-- Reports the clue count for the requested playermat
2024-03-10 09:56:22 -04:00
---@param useClickableCounters boolean Controls which type of counter is getting checked
2024-07-27 21:47:52 -04:00
PlayermatApi.getClueCount = function(useClickableCounters, matColor)
2024-03-10 09:56:22 -04:00
local count = 0
for _, mat in pairs(getMatForColor(matColor)) do
count = count + mat.call("getClueCount", useClickableCounters)
end
return count
2024-01-06 21:32:29 -05:00
end
2024-01-06 21:32:07 -05:00
2024-06-09 10:10:21 -04:00
-- Updates the specified owned counter
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
2024-03-10 09:56:22 -04:00
---@param type string Counter to target
---@param newValue number Value to set the counter to
---@param modifier number If newValue is not provided, the existing value will be adjusted by this modifier
2024-07-27 21:47:52 -04:00
PlayermatApi.updateCounter = function(matColor, type, newValue, modifier)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier })
end
2024-02-17 19:48:30 -05:00
end
2024-03-10 09:56:22 -04:00
2024-07-27 21:47:52 -04:00
-- Triggers the draw function for the specified playermat
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
2024-03-10 09:56:22 -04:00
---@param number number Amount of cards to draw
2024-07-27 21:47:52 -04:00
PlayermatApi.drawCardsWithReshuffle = function(matColor, number)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("drawCardsWithReshuffle", number)
end
2024-01-06 21:32:29 -05:00
end
2024-03-10 09:56:22 -04:00
2024-06-09 10:10:21 -04:00
-- Returns the resource counter amount
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All")
2024-03-10 09:56:22 -04:00
---@param type string Counter to target
2024-07-27 21:47:52 -04:00
PlayermatApi.getCounterValue = function(matColor, type)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
return mat.call("getCounterValue", type)
end
2024-02-17 19:48:30 -05:00
end
2024-01-06 21:32:07 -05:00
2024-06-09 10:10:21 -04:00
-- Returns a list of mat colors that have an investigator placed
2024-07-27 21:47:52 -04:00
PlayermatApi.getUsedMatColors = function()
2024-03-10 09:56:22 -04:00
local usedColors = {}
for matColor, mat in pairs(getMatForColor("All")) do
local searchPos = mat.positionToWorld(localInvestigatorPosition)
local searchResult = searchLib.atPosition(searchPos, "isCardOrDeck")
if #searchResult > 0 then
table.insert(usedColors, matColor)
2024-02-17 19:48:30 -05:00
end
end
2024-03-10 09:56:22 -04:00
return usedColors
2024-01-06 21:32:29 -05:00
end
2024-07-27 21:47:52 -04:00
-- Returns investigator name
---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All")
PlayermatApi.getInvestigatorName = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
local searchPos = mat.positionToWorld(localInvestigatorPosition)
local searchResult = searchLib.atPosition(searchPos, "isCardOrDeck")
if #searchResult == 1 then
return searchResult[1].getName()
end
end
return ""
end
2024-06-09 10:10:21 -04:00
-- Resets the specified skill tracker to "1, 1, 1, 1"
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.resetSkillTracker = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("resetSkillTracker")
end
2024-02-04 10:51:51 -05:00
end
2024-07-27 21:47:52 -04:00
-- Redraws the XML for the slot symbols based on the slotData table
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.redrawSlotSymbols = function(matColor)
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("redrawSlotSymbols")
end
end
-- Finds all objects on the playermat and associated set aside zone and returns a table
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
2024-03-10 09:56:22 -04:00
---@param filter string Name of the filte function (see util/SearchLib)
2024-07-27 21:47:52 -04:00
PlayermatApi.searchAroundPlayermat = function(matColor, filter)
2024-03-10 09:56:22 -04:00
local objList = {}
for _, mat in pairs(getMatForColor(matColor)) do
for _, obj in ipairs(mat.call("searchAroundSelf", filter)) do
table.insert(objList, obj)
end
end
return objList
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- Discard a non-hidden card from the corresponding player's hand
2024-07-27 21:47:52 -04:00
---@param matColor string Color of the playermat - White, Orange, Green, Red or All
PlayermatApi.doDiscardOne = function(matColor)
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("doDiscardOne")
end
end
2024-02-17 19:48:30 -05:00
2024-07-27 21:47:52 -04:00
-- Triggers the metadata sync for all playermats
PlayermatApi.syncAllCustomizableCards = function()
2024-03-10 09:56:22 -04:00
for _, mat in pairs(getMatForColor("All")) do
mat.call("syncAllCustomizableCards")
end
end
2024-02-17 19:48:30 -05:00
2024-07-27 21:47:52 -04:00
return PlayermatApi
2024-03-10 09:56:22 -04:00
end
end)
2024-06-09 10:10:21 -04:00
__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local GUIDReferenceApi = {}
local function getGuidHandler()
return getObjectFromGUID("123456")
end
-- Returns the matching object
---@param owner string Parent object for this search
---@param type string Type of object to search for
---@return any: Object reference to the matching object
GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type)
return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type })
end
-- Returns all matching objects as a table with references
---@param type string Type of object to search for
---@return table: List of object references to matching objects
GUIDReferenceApi.getObjectsByType = function(type)
return getGuidHandler().call("getObjectsByType", type)
end
-- Returns all matching objects as a table with references
---@param owner string Parent object for this search
---@return table: List of object references to matching objects
GUIDReferenceApi.getObjectsByOwner = function(owner)
return getGuidHandler().call("getObjectsByOwner", owner)
end
-- Sends new information to the reference handler to edit the main index
---@param owner string Parent of the object
---@param type string Type of the object
---@param guid string GUID of the object
GUIDReferenceApi.editIndex = function(owner, type, guid)
return getGuidHandler().call("editIndex", {
owner = owner,
type = type,
guid = guid
})
end
-- Returns the owner of an object or the object it's located on
---@param object tts__GameObject Object for this search
---@return string: Parent of the object or object it's located on
GUIDReferenceApi.getOwnerOfObject = function(object)
return getGuidHandler().call("getOwnerOfObject", object)
end
return GUIDReferenceApi
end
end)
2024-03-10 09:56:22 -04:00
__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules)
do
local SearchLib = {}
local filterFunctions = {
isCard = function(x) return x.type == "Card" end,
isDeck = function(x) return x.type == "Deck" end,
isCardOrDeck = function(x) return x.type == "Card" or x.type == "Deck" end,
isClue = function(x) return x.memo == "clueDoom" and x.is_face_down == false end,
2024-07-27 21:47:52 -04:00
isTileOrToken = function(x) return x.type == "Tile" end,
isUniversalToken = function(x) return x.getMemo() == "universalActionAbility" end,
2024-02-04 10:51:51 -05:00
}
2024-03-10 09:56:22 -04:00
-- performs the actual search and returns a filtered list of object references
---@param pos tts__Vector Global position
---@param rot? tts__Vector Global rotation
---@param size table Size
---@param filter? string Name of the filter function
---@param direction? table Direction (positive is up)
---@param maxDistance? number Distance for the cast
local function returnSearchResult(pos, rot, size, filter, direction, maxDistance)
local filterFunc
if filter then
filterFunc = filterFunctions[filter]
end
local searchResult = Physics.cast({
origin = pos,
direction = direction or { 0, 1, 0 },
orientation = rot or { 0, 0, 0 },
type = 3,
size = size,
max_distance = maxDistance or 0
})
2024-02-04 10:51:51 -05:00
2024-07-27 21:47:52 -04:00
-- filter the result for matching objects
2024-03-10 09:56:22 -04:00
local objList = {}
for _, v in ipairs(searchResult) do
if not filter or filterFunc(v.hit_object) then
table.insert(objList, v.hit_object)
end
end
return objList
2024-02-04 10:51:51 -05:00
end
2024-03-10 09:56:22 -04:00
-- searches the specified area
SearchLib.inArea = function(pos, rot, size, filter)
return returnSearchResult(pos, rot, size, filter)
2024-02-04 10:51:51 -05:00
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- searches the area on an object
SearchLib.onObject = function(obj, filter)
2024-07-27 21:47:52 -04:00
local pos = obj.getPosition()
local size = obj.getBounds().size:setAt("y", 1)
2024-03-10 09:56:22 -04:00
return returnSearchResult(pos, _, size, filter)
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- searches the specified position (a single point)
SearchLib.atPosition = function(pos, filter)
2024-07-27 21:47:52 -04:00
local size = { 0.1, 2, 0.1 }
2024-03-10 09:56:22 -04:00
return returnSearchResult(pos, _, size, filter)
end
2024-02-17 19:48:30 -05:00
2024-03-10 09:56:22 -04:00
-- searches below the specified position (downwards until y = 0)
SearchLib.belowPosition = function(pos, filter)
2024-07-27 21:47:52 -04:00
local size = { 0.1, 2, 0.1 }
local direction = { 0, -1, 0 }
local maxDistance = pos.y
2024-03-10 09:56:22 -04:00
return returnSearchResult(pos, _, size, filter, direction, maxDistance)
2024-02-04 10:51:51 -05:00
end
2024-03-10 09:56:22 -04:00
return SearchLib
2024-02-04 10:51:51 -05:00
end
end)
2023-04-22 16:56:01 -04:00
return __bundle_require("__root")