diff --git a/unpacked.ttslua b/unpacked.ttslua index 8cd832d83..7bf439724 100644 --- a/unpacked.ttslua +++ b/unpacked.ttslua @@ -41,1155 +41,67 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/Global") end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlayAreaApi = {} + local BlessCurseManagerApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") end - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) end - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) end - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) end - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) end - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) end - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("core/SoundCubeApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SoundCubeApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- this table links the name of a trigger effect to its index - local soundIndices = { - ["Vacuum"] = 0, - ["Deep Bell"] = 1, - ["Dark Souls"] = 2 - } - - local function playTriggerEffect(index) - local SoundCube = guidReferenceApi.getObjectByOwnerAndType("Mythos", "SoundCube") - SoundCube.AssetBundle.playTriggerEffect(index) - end - - -- plays the by name requested sound - ---@param soundName String Name of the sound to play - SoundCubeApi.playSoundByName = function(soundName) - playTriggerEffect(soundIndices[soundName]) - end - - return SoundCubeApi -end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end - end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi -end -end) -__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local NavigationOverlayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getNOHandler() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") - end - - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player - NavigationOverlayApi.copyVisibility = function(startColor, targetColor) - getNOHandler().call("copyVisibility", { - startColor = startColor, - targetColor = targetColor - }) - end - - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for - NavigationOverlayApi.cycleVisibility = function(playerColor) - getNOHandler().call("cycleVisibility", playerColor) - end - - -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to - NavigationOverlayApi.loadCamera = function(player, camera) - getNOHandler().call("loadCameraFromApi", { - player = player, - camera = camera - }) - end - - return NavigationOverlayApi -end -end) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true - } - - local TokenChecker = {} - - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true - else - return false - end - end - - return TokenChecker -end -end) -__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local guidReferenceApi = require("core/GUIDReferenceApi") - local optionPanelApi = require("core/OptionPanelApi") - local playAreaApi = require("core/PlayAreaApi") - local searchLib = require("util/SearchLib") - local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") - - local PLAYER_CARD_TOKEN_OFFSETS = { - [1] = { - Vector(0, 3, -0.2) - }, - [2] = { - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [3] = { - Vector(0, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [4] = { - Vector(0.4, 3, -0.9), - Vector(-0.4, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [5] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [6] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2) - }, - [7] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0, 3, 0.5) - }, - [8] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(-0.35, 3, 0.5), - Vector(0.35, 3, 0.5) - }, - [9] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5) - }, - [10] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0, 3, 1.2) - }, - [11] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(-0.35, 3, 1.2), - Vector(0.35, 3, 1.2) - }, - [12] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0.7, 3, 1.2), - Vector(0, 3, 1.2), - Vector(-0.7, 3, 1.2) - } - } - - -- stateIDs for the multi-stated resource tokens - local stateTable = { - ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, - ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 - } - - -- Table of data extracted from the token source bag, keyed by the Memo on each token which - -- should match the token type keys ("resource", "clue", etc) - local tokenTemplates - - local playerCardData - local locationData - - local TokenManager = { } - local internal = { } - - -- Spawns tokens for the card. This function is built to just throw a card at it and let it do - -- the work once a card has hit an area where it might spawn tokens. It will check to see if - -- the card has already spawned, find appropriate data from either the uses metadata or the Data - -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - TokenManager.spawnForCard = function(card, extraUses) - if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then - return - end - local metadata = JSON.decode(card.getGMNotes()) - if metadata ~= nil then - internal.spawnTokensFromUses(card, extraUses) - else - internal.spawnTokensFromDataHelper(card) - end - end - - -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the - -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) - local optionPanel = optionPanelApi.getOptions() - - if tokenType == "damage" or tokenType == "horror" then - TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then - TokenManager.spawnResourceCounterToken(card, tokenCount) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then - TokenManager.spawnResourceCounterToken(card, tokenCount) - else - TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) - end - end - - -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror - -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other - -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to - TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) - if tokenValue < 1 or tokenValue > 50 then return end - - local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) end) - end - - TokenManager.spawnResourceCounterToken = function(card, tokenCount) - local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) - spawned.call("updateVal", tokenCount) - end) - end - - -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". - -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) - -- not checking the max at this point since clue offsets are calculated dynamically - if tokenCount < 1 then return end - - local offsets = {} - if tokenType == "clue" then - offsets = internal.buildClueOffsets(card, tokenCount) - else - -- only up to 12 offset tables defined - if tokenCount > 12 then return end - for i = 1, tokenCount do - offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) - -- Fix the y-position for the spawn, since positionToWorld considers rotation which can - -- have bad results for face up/down differences - offsets[i].y = card.getPosition().y + 0.15 - end - end - - if shiftDown ~= nil then - -- Copy the offsets to make sure we don't change the static values - local baseOffsets = offsets - offsets = { } - - -- get a vector for the shifting (downwards local to the card) - local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) - for i, baseOffset in ipairs(baseOffsets) do - offsets[i] = baseOffset + shiftDownVector - end - end - - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - return - end - - -- handling for not provided subtype (for example when spawning from custom data helpers) - if subType == nil then - subType = "" - end - - -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") - local callback = nil - local stateID = stateTable[string.lower(subType)] - if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then - callback = function(spawned) spawned.setState(stateID) end - end - - for i = 1, tokenCount do - TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) - end - end - - -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, - -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned - TokenManager.spawnToken = function(position, tokenType, rotation, callback) - internal.initTokenTemplates() - local loadTokenType = tokenType - if tokenType == "clue" or tokenType == "doom" then - loadTokenType = "clueDoom" - end - if tokenTemplates[loadTokenType] == nil then - error("Unknown token type '" .. tokenType .. "'") - return - end - local tokenTemplate = tokenTemplates[loadTokenType] - - -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag - local rot = Vector(tokenTemplate.Transform.rotX, - 270, - tokenTemplate.Transform.rotZ) - if rotation ~= nil then - rot.y = rotation.y - end - if tokenType == "doom" then - rot.z = 180 - end - - tokenTemplate.Nickname = "" - return spawnObjectData({ - data = tokenTemplate, - position = position, - rotation = rot, - callback_function = callback - }) - end - - -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - TokenManager.maybeReplenishCard = function(card, uses, mat) - -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) - if uses[1].count and uses[1].replenish then - internal.replenishTokens(card, uses, mat) - end - end - - -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some - -- callers. - ---@param card Object Card object to reset the tokens for - TokenManager.resetTokensSpawned = function(card) - tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) - end - - -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addPlayerCardData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - playerCardData[k] = v - end - end - - -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addLocationData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - locationData[k] = v - end - end - - -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise - TokenManager.hasLocationData = function(card) - internal.initDataHelperData() - return internal.getLocationData(card) ~= nil - end - - internal.initTokenTemplates = function() - if tokenTemplates ~= nil then - return - end - tokenTemplates = {} - local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") - for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do - local tokenName = tokenTemplate.Memo - tokenTemplates[tokenName] = tokenTemplate - end - end - - -- Copies the data from the DataHelper. Will only happen once. - internal.initDataHelperData = function() - if playerCardData ~= nil then - return - end - local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') - locationData = dataHelper.getTable('LOCATIONS_DATA') - end - - -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - internal.spawnTokensFromUses = function(card, extraUses) - local uses = internal.getUses(card) - if uses == nil then return end - - -- go through tokens to spawn - local tokenCount - for i, useInfo in ipairs(uses) do - tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() - if extraUses ~= nil and extraUses[useInfo.type] ~= nil then - tokenCount = tokenCount + extraUses[useInfo.type] - end - -- Shift each spawned group after the first down so they don't pile on each other - TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) - end - - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - - -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - internal.spawnTokensFromDataHelper = function(card) - internal.initDataHelperData() - local playerData = internal.getPlayerCardData(card) - if playerData ~= nil then - internal.spawnPlayerCardTokensFromDataHelper(card, playerData) - end - local locationData = internal.getLocationData(card) - if locationData ~= nil then - internal.spawnLocationTokensFromDataHelper(card, locationData) - end - end - - -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) - local token = playerData.tokenType - local tokenCount = playerData.tokenCount - TokenManager.spawnTokenGroup(card, token, tokenCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - - -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnLocationTokensFromDataHelper = function(card, locationData) - local clueCount = internal.getClueCountFromData(card, locationData) - if clueCount > 0 then - TokenManager.spawnTokenGroup(card, "clue", clueCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - end - - internal.getPlayerCardData = function(card) - return playerCardData[card.getName() .. ':' .. card.getDescription()] - or playerCardData[card.getName()] - end - - internal.getLocationData = function(card) - return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] - end - - internal.getClueCountFromData = function(card, locationData) - -- Return the number of clues to spawn on this location - if locationData == nil then - error('attempted to get clue for unexpected object: ' .. card.getName()) - return 0 - end - - if ((card.is_face_down and locationData.clueSide == 'back') - or (not card.is_face_down and locationData.clueSide == 'front')) then - if locationData.type == 'fixed' then - return locationData.value - elseif locationData.type == 'perPlayer' then - return locationData.value * playAreaApi.getInvestigatorCount() - end - error('unexpected location type: ' .. locationData.type) - end - return 0 - end - - -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from - internal.getUses = function(card) - local metadata = JSON.decode(card.getGMNotes()) or { } - if metadata.type == "Location" then - if card.is_face_down and metadata.locationBack ~= nil then - return metadata.locationBack.uses - elseif not card.is_face_down and metadata.locationFront ~= nil then - return metadata.locationFront.uses - end - elseif not card.is_face_down then - return metadata.uses - end - - return nil - end - - -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at - internal.buildClueOffsets = function(card, count) - local pos = card.getPosition() - local cluePositions = { } - for i = 1, count do - local column = math.floor((i - 1) / 4) - local row = (i - 1) % 4 - table.insert(cluePositions, Vector(pos.x - 1 + 0.55 * row, pos.y, pos.z - 1.4 - 0.55 * column)) - end - return cluePositions - end - - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - internal.replenishTokens = function(card, uses, mat) - local cardPos = card.getPosition() - - -- don't continue for cards on the deck (Norman) or in the discard pile - if mat.positionToLocal(cardPos).x < -1 then return end - - -- get current amount of resource tokens on the card - local clickableResourceCounter = nil - local foundTokens = 0 - - for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do - local memo = obj.getMemo() - - if (stateTable[memo] or 0) > 0 then - foundTokens = foundTokens + math.abs(obj.getQuantity()) - obj.destruct() - elseif memo == "resourceCounter" then - foundTokens = obj.getVar("val") - clickableResourceCounter = obj - break - end - end - - -- this is the theoretical new amount of uses (to be checked below) - local newCount = foundTokens + uses[1].replenish - - -- if there are already more uses than the replenish amount, keep them - if foundTokens > uses[1].count then - newCount = foundTokens - -- only replenish up until the replenish amount - elseif newCount > uses[1].count then - newCount = uses[1].count - end - - -- update the clickable counter or spawn a group of tokens - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", newCount) - else - TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) - end - end - - return TokenManager -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local MythosAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getMythosArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") - end - - -- returns the chaos token metadata (if provided through scenario reference card) - MythosAreaApi.returnTokenData = function() - return getMythosArea().call("returnTokenData") - end - - -- returns an object reference to the encounter deck - MythosAreaApi.getEncounterDeck = function() - return getMythosArea().call("getEncounterDeck") - end - - -- draw an encounter card for the requesting mat - MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) - end - - return MythosAreaApi -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi + return BlessCurseManagerApi end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1205,14 +117,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -1225,7 +140,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -1260,8 +175,23 @@ do return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/Global") +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end end) __bundle_register("core/Global", function(require, _LOADED, __bundle_register, __bundle_modules) local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") @@ -1303,11 +233,10 @@ local chaosTokensLastMatGUID = nil local tokenDrawingStats = { ["Overall"] = {} } local bagSearchers = {} -local MAT_COLORS = { "White", "Orange", "Green", "Red" } local hideTitleSplashWaitFunctionId = nil -- online functionality related variables -local MOD_VERSION = "3.5.0" +local MOD_VERSION = "3.6.0" local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main' local library, requestObj, modMeta local acknowledgedUpgradeVersions = {} @@ -1537,7 +466,7 @@ end -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. ----@return Boolean. True if the bag is manipulated, false if it should be blocked. +---@return boolean: True if the bag is manipulated, false if it should be blocked. function canTouchChaosTokens() for color, searching in pairs(bagSearchers) do if searching then @@ -1572,12 +501,34 @@ function drawChaosToken(params) -- add the token to the list, compute new position based on list length tokenOffset[1] = tokenOffset[1] + (0.17 * #chaosTokens) - local token = chaosBag.takeObject({ - index = 0, - position = params.mat.positionToWorld(tokenOffset), - rotation = params.mat.getRotation() - }) + + local token + if params.guidToBeResolved then -- resolve a sealed token from a card + token = getObjectFromGUID(params.guidToBeResolved) + token.setPositionSmooth(params.mat.positionToWorld(tokenOffset)) + local guid = token.getGUID() + local tokenType = token.getName() + if tokenType == "Bless" or tokenType == "Curse" then + blessCurseManagerApi.releasedToken(tokenType, guid) + end + tokenArrangerApi.layout() + else -- take a token from the bag, either specified or random + local takeParameters = { + position = params.mat.positionToWorld(tokenOffset), + rotation = params.mat.getRotation() + } + + if params.tokenType then + for i, lookedForToken in ipairs(chaosBag.getObjects()) do + if lookedForToken.name == params.tokenType then + takeParameters.index = i - 1 + end + end + end + + token = chaosBag.takeObject(takeParameters) + end -- get data for token description local name = token.getName() local tokenData = mythosAreaApi.returnTokenData().tokenData or {} @@ -1598,7 +549,7 @@ end -- DEPRECATED. Use TokenManager instead. -- Spawns a single token. ----@param params Table. Array with arguments to the method. 1 = position, 2 = type, 3 = rotation +---@param params table Array with arguments to the method. 1 = position, 2 = type, 3 = rotation function spawnToken(params) return tokenManager.spawnToken(params[1], params[2], params[3]) end @@ -1685,7 +636,7 @@ end --------------------------------------------------------- -- called for button creation on the difficulty selectors ----@param args Table Parameters for this function: +---@param args table Parameters for this function: -- object TTSObject Usually "self" -- key String Name of the scenario function createSetupButtons(args) @@ -1736,7 +687,7 @@ function createSetupButtons(args) end -- called for adding chaos tokens ----@param args Table Parameters for this function: +---@param args table Parameters for this function: -- object object Usually "self" -- key string Name of the scenario -- mode string difficulty (e.g. "hard" or "expert") @@ -1836,7 +787,7 @@ function getChaosBagState() end -- respawns the chaos bag with a new state of tokens ----@param tokenList Table List of chaos token ids +---@param tokenList table List of chaos token ids ---@api ChaosBag / ChaosBagApi function setChaosBagState(tokenList) if not canTouchChaosTokens() then return end @@ -1877,7 +828,7 @@ function setChaosBagState(tokenList) end -- spawns the specified chaos token and puts it into the chaos bag ----@param id String ID of the chaos token +---@param id string ID of the chaos token function spawnChaosToken(id) if not canTouchChaosTokens() then return end @@ -1905,7 +856,7 @@ function spawnChaosToken(id) end -- removes the specified chaos token from the chaos bag ----@param id String ID of the chaos token +---@param id string ID of the chaos token function removeChaosToken(id) if not canTouchChaosTokens() then return end @@ -1957,7 +908,7 @@ end --------------------------------------------------------- -- forwards the requested content type to the update function and sets highlight to clicked tab ----@param tabId String Id of the clicked tab +---@param tabId string Id of the clicked tab function onClick_tab(_, _, tabId) for listId, listContent in pairs(tabIdTable) do if listId == tabId then @@ -2016,7 +967,7 @@ function onClick_download(player) end -- the download button on the placeholder objects calls this to directly initiate a download ----@param params Table contains url and guid of replacement object +---@param params table contains url and guid of replacement object function placeholder_download(params) local url = SOURCE_REPO .. '/' .. params.url requestObj = WebRequest.get(url, function (request) contentDownloadCallback(request, params) end) @@ -2094,7 +1045,7 @@ function coroutineDownloadAll() broadcastToAll("Downloading " .. contentType .. "...") local contained = "" for _, params in ipairs(objectList) do - local request = WebRequest.get(SOURCE_REPO .. '/' .. params.url) + local request = WebRequest.get(SOURCE_REPO .. '/' .. params.url, function() end) local start = os.time() while true do if request.is_done then @@ -2162,6 +1113,10 @@ function onClick_spawnPlaceholder() material = 3 }) + if item.boxsize == "big" then + placeholder.addTag("LargeBox") + end + placeholder.setColorTint({1, 1, 1, 71/255}) placeholder.setName(item.name) placeholder.setDescription("by " .. (item.author or "Unknown")) @@ -2177,8 +1132,8 @@ function onClick_spawnPlaceholder() end -- toggles the visibility of the respective UI ----@param player LuaPlayer Player that triggered this ----@param title String Name of the UI to toggle +---@param player tts__Player Player that triggered this +---@param title string Name of the UI to toggle function onClick_toggleUi(player, title) if title == "Navigation Overlay" then navigationOverlayApi.cycleVisibility(player.color) @@ -2431,8 +1386,8 @@ function libraryDownloadCallback(request) end -- loops through an XML table and returns the specified object ----@param ui Table XmlTable (get this via getXmlTable) ----@param id String Id of the object to return +---@param ui table XmlTable (get this via getXmlTable) +---@param id string Id of the object to return function getXmlTableElementById(ui, id) for _, obj in ipairs(ui) do if obj.attributes and obj.attributes.id and obj.attributes.id == id then return obj end @@ -2520,7 +1475,7 @@ function playermatRemovalSelected(player, selectedIndex, id) end -- removes a playermat and all related objects from play ----@param matColor String Color of the playermat to remove +---@param matColor string Color of the playermat to remove function removePlayermat(matColor) local matObjects = guidReferenceApi.getObjectsByOwner(matColor) if not matObjects.Playermat then return end @@ -2559,8 +1514,8 @@ function updateOptionPanelState() end -- handles the applying of option selections and calls the respective functions based ----@param id String ID of the option that was selected or deselected ----@param state Boolean State of the option (true = enabled) +---@param id string ID of the option that was selected or deselected +---@param state boolean|any State of the option (true = enabled) function applyOptionPanelChange(id, state) -- option: Snap tags if id == "useSnapTags" then @@ -2635,7 +1590,7 @@ function applyOptionPanelChange(id, state) -- option: Show CYOA campaign guides elseif id == "showCYOA" then - optionPanel[id] = spawnOrRemoveHelper(state, "CYOA Campaign Guides", {39, 1.3, -20}) + optionPanel[id] = spawnOrRemoveHelper(state, "CYOA Campaign Guides", { 39, 1.3, -20}) -- option: Show displacement tool elseif id == "showDisplacementTool" then @@ -2644,12 +1599,12 @@ function applyOptionPanelChange(id, state) end -- handler for spawn / remove functions of helper objects ----@param state Boolean Contains the state of the option: true = spawn it, false = remove it ----@param name String Name of the helper object ----@param position Vector Position of the object (where it will spawn) ----@param rotation Vector Rotation of the object for spawning (default: {0, 270, 0}) ----@param owner String Owner of the object (defaults to "Mythos") ----@return. GUID of the spawnedObj (or nil if object was removed) +---@param state boolean Contains the state of the option: true = spawn it, false = remove it +---@param name string Name of the helper object +---@param position tts__Vector Position of the object (where it will spawn) +---@param rotation? tts__Vector Rotation of the object for spawning (default: {0, 270, 0}) +---@param owner? string Owner of the object (defaults to "Mythos") +---@return string|nil GUID GUID of the spawnedObj (or nil if object was removed) function spawnOrRemoveHelper(state, name, position, rotation, owner) if (type(state) == "table" and #state == 0) then return removeHelperObject(name) @@ -2665,9 +1620,9 @@ function spawnOrRemoveHelper(state, name, position, rotation, owner) end -- copies the specified tool (by name) from the option panel source bag ----@param name String Name of the object that should be copied ----@param position Table Desired position of the object ----@param rotation Table Desired rotation of the object (defaults to object's rotation) +---@param name string Name of the object that should be copied +---@param position tts__Vector Desired position of the object +---@param rotation? tts__Vector Desired rotation of the object (defaults to object's rotation) function spawnHelperObject(name, position, rotation) local sourceBag = guidReferenceApi.getObjectByOwnerAndType("Mythos","OptionPanelSource") @@ -2696,7 +1651,7 @@ function spawnHelperObject(name, position, rotation) end -- removes the specified tool (by name) ----@param name String Object that should be removed +---@param name string Object that should be removed function removeHelperObject(name) -- links objects name to the respective option name (to grab the GUID for removal) local referenceTable = { @@ -2726,6 +1681,8 @@ end -- loads saved options function loadSettings(newOptions) + -- TO-DO: instead of overriding, keep original table and only add new data + -- this will ensure that new options aren't set to nil when importing an old state optionPanel = newOptions updateOptionPanelState() for id, state in pairs(optionPanel) do @@ -2822,7 +1779,7 @@ function compareVersion(request) end -- converts a version number to a string ----@param version String Version number, separated by dots (e.g. 3.3.1) +---@param version string Version number, separated by dots (e.g. 3.3.1) function convertVersionToNumber(version) local major, minor, patch = string.match(version, "(%d+)%.(%d+)%.(%d+)") return major * 100 + minor * 10 + patch @@ -2859,58 +1816,1137 @@ function onClick_notification(_, parameter) xmlVisibility["updateNotification"] = false end end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local BlessCurseManagerApi = {} + local TokenArrangerApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end end - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) end - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") end - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) end - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) + return TokenArrangerApi +end +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") end - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") end - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") end - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) end - return BlessCurseManagerApi + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } + + local TokenChecker = {} + + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true + else + return false + end + end + + return TokenChecker +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local NavigationOverlayApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getNOHandler() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") + end + + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player + NavigationOverlayApi.copyVisibility = function(startColor, targetColor) + getNOHandler().call("copyVisibility", { + startColor = startColor, + targetColor = targetColor + }) + end + + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for + NavigationOverlayApi.cycleVisibility = function(playerColor) + getNOHandler().call("cycleVisibility", playerColor) + end + + -- loads the specified camera for a player + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to + NavigationOverlayApi.loadCamera = function(player, camera) + getNOHandler().call("loadCameraFromApi", { + player = player, + camera = camera + }) + end + + return NavigationOverlayApi +end +end) +__bundle_register("core/SoundCubeApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SoundCubeApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- this table links the name of a trigger effect to its index + local soundIndices = { + ["Vacuum"] = 0, + ["Deep Bell"] = 1, + ["Dark Souls"] = 2 + } + + ---@param index number Index of the sound effect to play + local function playTriggerEffect(index) + local SoundCube = guidReferenceApi.getObjectByOwnerAndType("Mythos", "SoundCube") + SoundCube.AssetBundle.playTriggerEffect(index) + end + + -- plays the by name requested sound + ---@param soundName string Name of the sound to play + SoundCubeApi.playSoundByName = function(soundName) + playTriggerEffect(soundIndices[soundName]) + end + + return SoundCubeApi +end +end) +__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local MythosAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getMythosArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + end + + ---@return any: Table of chaos token metadata (if provided through scenario reference card) + MythosAreaApi.returnTokenData = function() + return getMythosArea().call("returnTokenData") + end + + ---@return any: Object reference to the encounter deck + MythosAreaApi.getEncounterDeck = function() + return getMythosArea().call("getEncounterDeck") + end + + -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) + end + + return MythosAreaApi +end +end) +__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local guidReferenceApi = require("core/GUIDReferenceApi") + local optionPanelApi = require("core/OptionPanelApi") + local playAreaApi = require("core/PlayAreaApi") + local searchLib = require("util/SearchLib") + local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") + + local PLAYER_CARD_TOKEN_OFFSETS = { + [1] = { + Vector(0, 3, -0.2) + }, + [2] = { + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [3] = { + Vector(0, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [4] = { + Vector(0.4, 3, -0.9), + Vector(-0.4, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [5] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [6] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2) + }, + [7] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0, 3, 0.5) + }, + [8] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(-0.35, 3, 0.5), + Vector(0.35, 3, 0.5) + }, + [9] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5) + }, + [10] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0, 3, 1.2) + }, + [11] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(-0.35, 3, 1.2), + Vector(0.35, 3, 1.2) + }, + [12] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0.7, 3, 1.2), + Vector(0, 3, 1.2), + Vector(-0.7, 3, 1.2) + } + } + + -- stateIDs for the multi-stated resource tokens + local stateTable = { + ["resource"] = 1, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, + ["evidence"] = 5, + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 + } + + -- Table of data extracted from the token source bag, keyed by the Memo on each token which + -- should match the token type keys ("resource", "clue", etc) + local tokenTemplates + + local playerCardData + local locationData + + local TokenManager = { } + local internal = { } + + -- Spawns tokens for the card. This function is built to just throw a card at it and let it do + -- the work once a card has hit an area where it might spawn tokens. It will check to see if + -- the card has already spawned, find appropriate data from either the uses metadata or the Data + -- Helper, and spawn the tokens. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + TokenManager.spawnForCard = function(card, extraUses) + if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then + return + end + local metadata = JSON.decode(card.getGMNotes()) + if metadata ~= nil then + internal.spawnTokensFromUses(card, extraUses) + else + internal.spawnTokensFromDataHelper(card) + end + end + + -- Spawns a set of tokens on the given card. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the + -- spawned state object rather than spawning multiple tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) + local optionPanel = optionPanelApi.getOptions() + + if tokenType == "damage" or tokenType == "horror" then + TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then + TokenManager.spawnResourceCounterToken(card, tokenCount) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then + TokenManager.spawnResourceCounterToken(card, tokenCount) + else + TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) + end + end + + -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror + -- tokens. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other + -- types should use spawnMultipleTokens() + ---@param tokenValue number Value to set the damage/horror to + TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) + if tokenValue < 1 or tokenValue > 50 then return end + + local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) end) + end + + TokenManager.spawnResourceCounterToken = function(card, tokenCount) + local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) + spawned.call("updateVal", tokenCount) + end) + end + + -- Spawns a number of tokens. + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". + -- Other types should use spawnCounterToken() + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) + -- not checking the max at this point since clue offsets are calculated dynamically + if tokenCount < 1 then return end + + local offsets = {} + if tokenType == "clue" then + offsets = internal.buildClueOffsets(card, tokenCount) + else + -- only up to 12 offset tables defined + if tokenCount > 12 then return end + for i = 1, tokenCount do + offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) + -- Fix the y-position for the spawn, since positionToWorld considers rotation which can + -- have bad results for face up/down differences + offsets[i].y = card.getPosition().y + 0.15 + end + end + + if shiftDown ~= nil then + -- Copy the offsets to make sure we don't change the static values + local baseOffsets = offsets + offsets = { } + + -- get a vector for the shifting (downwards local to the card) + local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) + for i, baseOffset in ipairs(baseOffsets) do + offsets[i] = baseOffset + shiftDownVector + end + end + + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + return + end + + -- handling for not provided subtype (for example when spawning from custom data helpers) + if subType == nil then + subType = "" + end + + -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") + local callback = nil + local stateID = stateTable[string.lower(subType)] + if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then + callback = function(spawned) spawned.setState(stateID) end + end + + for i = 1, tokenCount do + TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) + end + end + + -- Spawns a single token at the given global position by copying it from the template bag. + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", + -- "resource", "doom", or "clue" + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, + -- x and z will use the default rotation from the source bag + ---@param callback? function A callback function triggered after the new token is spawned + TokenManager.spawnToken = function(position, tokenType, rotation, callback) + internal.initTokenTemplates() + local loadTokenType = tokenType + if tokenType == "clue" or tokenType == "doom" then + loadTokenType = "clueDoom" + end + if tokenTemplates[loadTokenType] == nil then + error("Unknown token type '" .. tokenType .. "'") + return + end + local tokenTemplate = tokenTemplates[loadTokenType] + + -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag + local rot = Vector(tokenTemplate.Transform.rotX, + 270, + tokenTemplate.Transform.rotZ) + if rotation ~= nil then + rot.y = rotation.y + end + if tokenType == "doom" then + rot.z = 180 + end + + tokenTemplate.Nickname = "" + return spawnObjectData({ + data = tokenTemplate, + position = position, + rotation = rot, + callback_function = callback + }) + end + + -- Checks a card for metadata to maybe replenish it + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + TokenManager.maybeReplenishCard = function(card, uses, mat) + -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) + if uses[1].count and uses[1].replenish then + internal.replenishTokens(card, uses, mat) + end + end + + -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some + -- callers. + ---@param card tts__Object Card object to reset the tokens for + TokenManager.resetTokensSpawned = function(card) + tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) + end + + -- Pushes new player card data into the local copy of the Data Helper player data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addPlayerCardData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + playerCardData[k] = v + end + end + + -- Pushes new location data into the local copy of the Data Helper location data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addLocationData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + locationData[k] = v + end + end + + -- Checks to see if the given card has location data in the DataHelper + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise + TokenManager.hasLocationData = function(card) + internal.initDataHelperData() + return internal.getLocationData(card) ~= nil + end + + internal.initTokenTemplates = function() + if tokenTemplates ~= nil then + return + end + tokenTemplates = {} + local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") + for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do + local tokenName = tokenTemplate.Memo + tokenTemplates[tokenName] = tokenTemplate + end + end + + -- Copies the data from the DataHelper. Will only happen once. + internal.initDataHelperData = function() + if playerCardData ~= nil then + return + end + local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") + playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') + locationData = dataHelper.getTable('LOCATIONS_DATA') + end + + -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + internal.spawnTokensFromUses = function(card, extraUses) + local uses = internal.getUses(card) + if uses == nil then return end + + -- go through tokens to spawn + local tokenCount + for i, useInfo in ipairs(uses) do + tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() + if extraUses ~= nil and extraUses[useInfo.type] ~= nil then + tokenCount = tokenCount + extraUses[useInfo.type] + end + -- Shift each spawned group after the first down so they don't pile on each other + TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) + end + + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + internal.spawnTokensFromDataHelper = function(card) + internal.initDataHelperData() + local playerData = internal.getPlayerCardData(card) + if playerData ~= nil then + internal.spawnPlayerCardTokensFromDataHelper(card, playerData) + end + local locationData = internal.getLocationData(card) + if locationData ~= nil then + internal.spawnLocationTokensFromDataHelper(card, locationData) + end + end + + -- Spawn tokens for a player card using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) + local token = playerData.tokenType + local tokenCount = playerData.tokenCount + TokenManager.spawnTokenGroup(card, token, tokenCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a location using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnLocationTokensFromDataHelper = function(card, locationData) + local clueCount = internal.getClueCountFromData(card, locationData) + if clueCount > 0 then + TokenManager.spawnTokenGroup(card, "clue", clueCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + end + + internal.getPlayerCardData = function(card) + return playerCardData[card.getName() .. ':' .. card.getDescription()] + or playerCardData[card.getName()] + end + + internal.getLocationData = function(card) + return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] + end + + internal.getClueCountFromData = function(card, locationData) + -- Return the number of clues to spawn on this location + if locationData == nil then + error('attempted to get clue for unexpected object: ' .. card.getName()) + return 0 + end + + if ((card.is_face_down and locationData.clueSide == 'back') + or (not card.is_face_down and locationData.clueSide == 'front')) then + if locationData.type == 'fixed' then + return locationData.value + elseif locationData.type == 'perPlayer' then + return locationData.value * playAreaApi.getInvestigatorCount() + end + error('unexpected location type: ' .. locationData.type) + end + return 0 + end + + -- Gets the right uses structure for this card, based on metadata and face up/down state + ---@param card tts__Object Card to pull the uses from + internal.getUses = function(card) + local metadata = JSON.decode(card.getGMNotes()) or { } + if metadata.type == "Location" then + if card.is_face_down and metadata.locationBack ~= nil then + return metadata.locationBack.uses + elseif not card.is_face_down and metadata.locationFront ~= nil then + return metadata.locationFront.uses + end + elseif not card.is_face_down then + return metadata.uses + end + + return nil + end + + -- Dynamically create positions for clues on a card. + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at + internal.buildClueOffsets = function(card, count) + local pos = card.getPosition() + local cluePositions = { } + for i = 1, count do + local row = math.floor(1 + (i - 1) / 4) + local column = (i - 1) % 4 + table.insert(cluePositions, Vector(pos.x + 1.5 - 0.55 * row, pos.y + 0.15, pos.z - 0.825 + 0.55 * column)) + end + return cluePositions + end + + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + internal.replenishTokens = function(card, uses, mat) + local cardPos = card.getPosition() + + -- don't continue for cards on the deck (Norman) or in the discard pile + if mat.positionToLocal(cardPos).x < -1 then return end + + -- get current amount of resource tokens on the card + local clickableResourceCounter = nil + local foundTokens = 0 + + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do + local memo = obj.getMemo() + + if (stateTable[memo] or 0) > 0 then + foundTokens = foundTokens + math.abs(obj.getQuantity()) + obj.destruct() + elseif memo == "resourceCounter" then + foundTokens = obj.getVar("val") + clickableResourceCounter = obj + break + end + end + + -- this is the theoretical new amount of uses (to be checked below) + local newCount = foundTokens + uses[1].replenish + + -- if there are already more uses than the replenish amount, keep them + if foundTokens > uses[1].count then + newCount = foundTokens + -- only replenish up until the replenish amount + elseif newCount > uses[1].count then + newCount = uses[1].count + end + + -- update the clickable counter or spawn a group of tokens + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", newCount) + else + TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) + end + end + + return TokenManager +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) __bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) diff --git a/unpacked.yaml b/unpacked.yaml index 9a012aae0..3b7add335 100644 --- a/unpacked.yaml +++ b/unpacked.yaml @@ -224,7 +224,7 @@ CustomUIAssets: - Name: box-cover-mask-wide Type: 0 URL: http://cloud-3.steamusercontent.com/ugc/2115061298538827369/A20C2ECB8ECDC1B0AD8B2B38F68CA1C1F5E07D37/ -Date: Thu Jan 25 01:22:12 UTC 2024 +Date: Fri Feb 16 18:27:41 UTC 2024 DecalPallet: - ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/ Name: Achivement Checkmark @@ -233,7 +233,7 @@ DecalPallet: Name: Victory Display Size: 15 Decals: [] -EpochTime: 1706145732 +EpochTime: 1708108061 GameComplexity: '' GameMode: Arkham Horror LCG - Super Complete Edition GameType: '' @@ -342,6 +342,7 @@ MusicPlayer: Note: '' ObjectStates: - !include 'unpacked/go_game_piece_white GUID Reference Handler 123456.yaml' +- !include 'unpacked/Checker_white Token Spawn Tracker e3ffc9.yaml' - !include 'unpacked/HandTrigger 5fe087.yaml' - !include 'unpacked/HandTrigger be2f17.yaml' - !include 'unpacked/HandTrigger 0285cc.yaml' @@ -429,7 +430,8 @@ ObjectStates: - !include 'unpacked/Custom_Assetbundle_Bag Barkham Horror 308439.yaml' - !include 'unpacked/Custom_Token Chaos Bag Stat Tracker 766620.yaml' - !include 'unpacked/Checker_white Token Spawn Tool 36b4ee.yaml' -- !include 'unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml' +- !include 'unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml' +- !include 'unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.yaml' - !include 'unpacked/Deck Tarot Deck 77f1e5.yaml' - !include 'unpacked/Bag Tarot Deck (Scripted) a230f9.yaml' - !include 'unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38.yaml' @@ -450,6 +452,7 @@ ObjectStates: - !include 'unpacked/ScriptingTrigger a2f932.yaml' - !include 'unpacked/Custom_Model Edge of the Earth 895eaa.yaml' - !include 'unpacked/Custom_Model The Dream-Eaters a16a1a.yaml' +- !include 'unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml' - !include 'unpacked/Custom_Model Return to The Circle Undone 757324.yaml' - !include 'unpacked/Custom_Token Other Doom in Play 652ff3.yaml' - !include 'unpacked/Custom_Tile Playermat 1 White 8b081b.yaml' @@ -483,13 +486,12 @@ ObjectStates: - !include 'unpacked/Custom_Token Investigator Skill Tracker b4a5f7.yaml' - !include 'unpacked/Custom_Token Investigator Skill Tracker e74881.yaml' - !include 'unpacked/Custom_Model The Scarlet Keys 300fcc.yaml' -- !include 'unpacked/Custom_Token Search-A-Card 24051a.yaml' +- !include 'unpacked/Custom_Tile Search-A-Card 24051a.yaml' - !include 'unpacked/Custom_Tile Phase Tracker d0c8fa.yaml' - !include 'unpacked/Custom_Tile Phase Tracker Cache 557104.yaml' - !include 'unpacked/Custom_Tile Phase Tracker Cache 49922d.yaml' - !include 'unpacked/Custom_Tile Phase Tracker Cache 16832f.yaml' - !include 'unpacked/Custom_Tile Phase Tracker Cache 645841.yaml' -- !include 'unpacked/Checker_white Token Spawn Tracker e3ffc9.yaml' - !include 'unpacked/Bag Token Source 124381.yaml' - !include 'unpacked/FogOfWarTrigger Game Data 3dbe47.yaml' - !include 'unpacked/Custom_Token Instruction Generator 240522.yaml' @@ -520,9 +522,9 @@ ObjectStates: - !include 'unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml' - !include 'unpacked/Custom_Tile Campaign ImporterExporter 334ee3.yaml' - !include 'unpacked/Custom_Token Token Arranger 022907.yaml' -- !include 'unpacked/Custom_Token Chaos Bag Manager 023240.yaml' +- !include 'unpacked/Custom_Tile Chaos Bag Manager 023240.yaml' - !include 'unpacked/BlockRectangle Placeholder Box Dummy a93466.yaml' -- !include 'unpacked/Custom_Model Baldur''s Gate III 695abd.yaml' +- !include 'unpacked/Custom_Model The Matter of Britain 194cc5.yaml' - !include 'unpacked/Custom_Tile Tokencache_+1 a15273.yaml' - !include 'unpacked/Custom_Tile Tokencache_0 0a8592.yaml' - !include 'unpacked/Custom_Tile Tokencache_-1 b644d2.yaml' @@ -550,7 +552,7 @@ PlayerCounts: PlayingTime: - 0 - 0 -SaveName: Arkham SCE - 3.5.0 +SaveName: Arkham SCE - 3.6.0 Sky: Sky_Museum SkyURL: https://i.imgur.com/GkQqaOF.jpg SnapPoints: @@ -674,70 +676,6 @@ SnapPoints: x: -45.3 y: 1.48 z: -32.23 -- Position: - x: 65 - y: 1.48 - z: -55 -- Position: - x: 65 - y: 1.48 - z: -71 -- Position: - x: 65 - y: 1.48 - z: -87 -- Position: - x: 52 - y: 1.48 - z: -87 -- Position: - x: 52 - y: 1.48 - z: -71 -- Position: - x: 52 - y: 1.48 - z: -55 -- Position: - x: 39 - y: 1.48 - z: -55 -- Position: - x: 39 - y: 1.48 - z: -71 -- Position: - x: 39 - y: 1.48 - z: -87 -- Position: - x: 26 - y: 1.48 - z: -87 -- Position: - x: 26 - y: 1.48 - z: -71 -- Position: - x: 26 - y: 1.48 - z: -55 -- Position: - x: 13 - y: 1.48 - z: -55 -- Position: - x: 13 - y: 1.48 - z: -71 -- Position: - x: 0 - y: 1.48 - z: -55 -- Position: - x: 0 - y: 1.48 - z: -71 - Position: x: -28.64 y: 1.48 @@ -754,10 +692,6 @@ SnapPoints: x: 0 y: 135 z: 180 -- Position: - x: 6.5 - y: 1.48 - z: -87 - Position: x: -27 y: 1.48 @@ -770,6 +704,106 @@ SnapPoints: x: 0 y: 315 z: 0 +- Position: + x: 65 + y: 1.48 + z: -52 +- Position: + x: 65 + y: 1.48 + z: -65 +- Position: + x: 65 + y: 1.48 + z: -78 +- Position: + x: 65 + y: 1.48 + z: -91 +- Position: + x: 50.2 + y: 1.48 + z: -52 +- Position: + x: 50.2 + y: 1.48 + z: -65 +- Position: + x: 50.2 + y: 1.48 + z: -78 +- Position: + x: 50.2 + y: 1.48 + z: -91 +- Position: + x: 35.4 + y: 1.48 + z: -52 +- Position: + x: 35.4 + y: 1.48 + z: -65 +- Position: + x: 35.4 + y: 1.48 + z: -78 +- Position: + x: 35.4 + y: 1.48 + z: -91 +- Position: + x: 20.6 + y: 1.48 + z: -52 +- Position: + x: 20.6 + y: 1.48 + z: -65 +- Position: + x: 5.8 + y: 1.48 + z: -52 +- Position: + x: 5.8 + y: 1.48 + z: -65 +- Position: + x: -9 + y: 1.48 + z: -52 +- Position: + x: 20.6 + y: 1.48 + z: -78 +- Position: + x: 20.6 + y: 1.48 + z: -91 +- Position: + x: 5.8 + y: 1.48 + z: -78 +- Position: + x: 5.8 + y: 1.48 + z: -91 +- Position: + x: -9 + y: 1.48 + z: -65 +- Position: + x: -9 + y: 1.48 + z: -78 +- Position: + x: -9 + y: 1.48 + z: -91 +- Position: + x: -26 + y: 1.48 + z: -87 TabStates: '10': body: "Created by Whimsical\n\nAnything that passes over the remover that isn't diff --git a/unpacked/Bag Additional Player Cards 2cba6b.ttslua b/unpacked/Bag Additional Player Cards 2cba6b.ttslua index cb64768cf..a9d8e79fc 100644 --- a/unpacked/Bag Additional Player Cards 2cba6b.ttslua +++ b/unpacked/Bag Additional Player Cards 2cba6b.ttslua @@ -41,48 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("arkhamdb/HotfixBag") end) @@ -127,7 +85,7 @@ do -- it will be removed from the list and cannot be selected again until a reload -- occurs or the indexes are rebuilt, which will refresh the list to include all -- weaknesses. - ---@return id String ID of the selected weakness. + ---@return string: ID of the selected weakness. AllCardsBagApi.getRandomWeaknessId = function() return getAllCardsBag().call("getRandomWeaknessId") end @@ -147,8 +105,8 @@ do -- Searches the bag for cards which match the given name and returns a list. Note that this is -- an O(n) search without index support. It may be slow. - ---@param name String or string fragment to search for names - ---@param exact Boolean Whether the name match should be exact + ---@param name string or string fragment to search for names + ---@param exact boolean Whether the name match should be exact AllCardsBagApi.getCardsByName = function(name, exact) return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) end @@ -158,9 +116,9 @@ do end -- Returns a list of cards from the bag matching a class and level (0 or upgraded) - ---@param class String class to retrieve ("Guardian", "Seeker", etc) - ---@param upgraded Boolean true for upgraded cards (Level 1-5), false for Level 0 - ---@return: If the indexes are still being constructed, returns an empty table. + ---@param class string class to retrieve ("Guardian", "Seeker", etc) + ---@param upgraded boolean true for upgraded cards (Level 1-5), false for Level 0 + ---@return table: If the indexes are still being constructed, returns an empty table. -- Otherwise, a list of tables, each with the following fields -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata @@ -179,4 +137,48 @@ do return AllCardsBagApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07.ttslua b/unpacked/Bag All Player Cards 15bb07.ttslua index 7468598d7..3b546d88f 100644 --- a/unpacked/Bag All Player Cards 15bb07.ttslua +++ b/unpacked/Bag All Player Cards 15bb07.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/AllCardsBag") -end) __bundle_register("playercards/AllCardsBag", function(require, _LOADED, __bundle_register, __bundle_modules) local cardIdIndex = { } local classAndLevelIndex = { } @@ -52,7 +49,6 @@ local uniqueWeaknessList = { } local cycleIndex = { } local indexingDone = false -local allowRemoval = false function onLoad() self.addContextMenuItem("Rebuild Index", startIndexBuild) @@ -94,25 +90,17 @@ function clearIndexes() end -- Clears the bag indexes and starts the coroutine to rebuild the indexes -function startIndexBuild(playerColor) +function startIndexBuild() clearIndexes() startLuaCoroutine(self, "buildIndex") end -function onObjectLeaveContainer(container, object) - if (container == self and not allowRemoval) then - broadcastToAll( - "Removing cards from the All Player Cards bag may break some functions. Please replace the card.", - {0.9, 0.2, 0.2} - ) +function onObjectLeaveContainer(container, _) + if container == self then + broadcastToAll("Removing cards from the All Player Cards bag may break some functions.", "Red") end end --- Debug option to suppress the warning when cards are removed from the bag -function setAllowCardRemoval() - allowRemoval = true -end - -- Create the card indexes by iterating all cards in the bag, parsing their -- metadata, and creating the keyed lookup tables for the cards. This is a -- coroutine which will spread the workload by processing 20 cards before @@ -171,8 +159,8 @@ function buildIndex() end -- Adds a card to any indexes it should be a part of, based on its metadata. ----@param cardData: TTS object data for the card ----@param cardMetadata: SCED metadata for the card +---@param cardData table TTS object data for the card +---@param cardMetadata table SCED metadata for the card function addCardToIndex(cardData, cardMetadata) -- use the ZoopGuid as fallback if no id present if cardMetadata.id == nil and cardMetadata.TtsZoopGuid then @@ -426,4 +414,7 @@ function isBasicWeakness(cardMetadata) and cardMetadata.basicWeaknessCount > 0 end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/AllCardsBag") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07.yaml b/unpacked/Bag All Player Cards 15bb07.yaml index 11226230d..754baef77 100644 --- a/unpacked/Bag All Player Cards 15bb07.yaml +++ b/unpacked/Bag All Player Cards 15bb07.yaml @@ -1649,6 +1649,69 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml' +- !include 'Bag All Player Cards 15bb07/Card Task Force (0) a5c06a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Microscope (4) fbd296.yaml' +- !include 'Bag All Player Cards 15bb07/Card Back Injury f6c482.yaml' +- !include 'Bag All Player Cards 15bb07/Card Lightfooted (0) fe1fb6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bewitching (3) db335c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Flurry of Blows (5) 9e7bc8.yaml' +- !include 'Bag All Player Cards 15bb07/Card British Bull Dog (2) 7b7050.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bianca Die Katz (0) 897a94.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dirty Deeds (3) aa2d6a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Esoteric Method (1) 9250e1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Katana (0) f5beb5.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ethereal Weaving (3) 697efd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Putrescent Rot 2d1e60.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ravenous Myconid (4) df93ca.yaml' +- !include 'Bag All Player Cards 15bb07/Card Second Wind (2) c3c979.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fire Axe (2) 326ec3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Stir the Pot (0) c25479.yaml' +- !include 'Bag All Player Cards 15bb07/Card Keeper of the Key 014086.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bide Your Time (0) 24d3b3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Thorough Inquiry (0) c6b644.yaml' +- !include 'Bag All Player Cards 15bb07/Card Steady-Handed (1) 9181f7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dawn Star (1) 8b15d7.yaml' +- !include 'Bag All Player Cards 15bb07/Card Seal of the Elders (5) d2b649.yaml' +- !include 'Bag All Player Cards 15bb07/Card Keep Faith (2) 73e4ee.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mariner''s Compass (2) 596053.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bank Job (0) c4dfa2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Abyssal Rot bbeac6.yaml' +- !include 'Bag All Player Cards 15bb07/Card Maimed Hand cb14d3.yaml' +- !include 'Bag All Player Cards 15bb07/Card Testing Sprint (0) a4846b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blade of Yoth c61a83.yaml' +- !include 'Bag All Player Cards 15bb07/Card Call the Beyond (2) 0dd070.yaml' +- !include 'Bag All Player Cards 15bb07/Card Gabriel Carillo (1) 7e1088.yaml' +- !include 'Bag All Player Cards 15bb07/Card Diabolical Luck (0) 1fea59.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cleaning Kit (0) d07668.yaml' +- !include 'Bag All Player Cards 15bb07/Card Evanescent Ascension 9e763b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Matchbox (0) b533db.yaml' +- !include 'Bag All Player Cards 15bb07/Card British Bull Dog (0) 9b76a0.yaml' +- !include 'Bag All Player Cards 15bb07/Card Twilight Diadem a2f8f8.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rod of Carnamagos (0) 66ec64.yaml' +- !include 'Bag All Player Cards 15bb07/Card Spectral Razor (2) b38ded.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ethereal Form (2) e58c7b.yaml' +- !include 'Bag All Player Cards 15bb07/Card Cleaning Kit (3) 94c3e1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ravenous Myconid (4) ab2752.yaml' +- !include 'Bag All Player Cards 15bb07/Card Rod of Carnamagos (2) d8ef99.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fake Credentials (4) 7ebb67.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hunting Jacket (2) 5355fa.yaml' +- !include 'Bag All Player Cards 15bb07/Card Dark Horse (5) d00e4d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Antediluvian Hymn (0) ba4746.yaml' +- !include 'Bag All Player Cards 15bb07/Card Aember Rot 3e6219.yaml' +- !include 'Bag All Player Cards 15bb07/Card The Silver Moth 2c6dc1.yaml' +- !include 'Bag All Player Cards 15bb07/Card Scarlet Rot fe476c.yaml' +- !include 'Bag All Player Cards 15bb07/Card Eyes of Valusia (4) e7bfbe.yaml' +- !include 'Bag All Player Cards 15bb07/Card Mesmeric Influence (1) b13946.yaml' +- !include 'Bag All Player Cards 15bb07/Card Blessed Blade (4) 9401f4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Miracle Wish (5) d78d4a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Vow of Drzytelech c4bc35.yaml' +- !include 'Bag All Player Cards 15bb07/Card Virescent Rot 2edbdd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Ravenous Myconid (4) baa926.yaml' +- !include 'Bag All Player Cards 15bb07/Card Broken Diadem (5) b6d35d.yaml' +- !include 'Bag All Player Cards 15bb07/Card Bianca Die Katz 992ccd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml' +- !include 'Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml' +- !include 'Bag All Player Cards 15bb07/Card Elaborate Distraction (0) d1422e.yaml' Description: '' DragSelectable: true GMNotes: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml index 283877009..2296ba383 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer (2) f8a977.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml index 9021da764..c47e08cbf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .18 Derringer 101a41.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic (2) 4425b5.yaml b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic (2) 4425b5.yaml index 632046453..29a075930 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic (2) 4425b5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic (2) 4425b5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5894': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml index 45a2faa44..4088f1c3e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .25 Automatic a5087b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml index b30e8e180..e713b0d54 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt (2) c026c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4409': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml index 1b53be2a6..ef07fbf05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .32 Colt b0f851.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 22d821.yaml b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 22d821.yaml index 87246b011..35749f899 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 22d821.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester (Taboo) 22d821.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester c32e40.yaml b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester c32e40.yaml index bf2bbe39f..c00f15024 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester c32e40.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .35 Winchester c32e40.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5832': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml index 2288cfc29..d2330d9eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer (2) f57af7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml index 2d611f4d4..cad607e8a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .41 Derringer fe2db3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml index 039d5540d..a94abda50 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic (2) fe0cc0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml index fe4de87e7..927370119 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Automatic 12660b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml index d06aa73f8..17895a83f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) b492cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2928': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml index 05519da94..5db9123af 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson (3) d4dbc7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2929': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml index 053deb11d..b472e8a3d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card .45 Thompson 2c6509.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2776': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card 21 or Bust 5210c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card 21 or Bust 5210c2.yaml index 76cedead8..785851b60 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card 21 or Bust 5210c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card 21 or Bust 5210c2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml index 40b0ee5b7..4f0eba7ab 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter (2) 0edef1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml index 5bfe01079..2ad715003 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Chance Encounter 3f3488.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml index e30ef6c4f..bb3d143ff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Glimmer of Hope f21109.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4477': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml index caa0ce63a..4bea52594 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (1) 4cfcc7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml index fd33ac1c4..cc481f96f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will (2) 71a760.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml index 2f87b3d7c..e52805739 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Test of Will 48e516.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) (Taboo) 25b73a.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) (Taboo) 25b73a.yaml index 908ede546..91b045a8a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) (Taboo) 25b73a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) (Taboo) 25b73a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) 176836.yaml b/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) 176836.yaml index 75241b83d..654bf4f86 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) 176836.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card A Watchful Peace (3) 176836.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 35a7e9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 35a7e9.yaml index 90f6b3e60..1515d2ff9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 35a7e9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 35a7e9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml index 96dcf7be9..011170148 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 79b4af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3751': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 89fe92.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 89fe92.yaml index 0089876ae..dcfca18cb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 89fe92.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abandoned and Alone 89fe92.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5360': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764610861313/38FA9E4802C3B8E8FC2DB16E94E65A3FD60D92B9/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase a4b514.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase a4b514.yaml index 1c66da840..411b05b63 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase a4b514.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abbess Allegria Di Biase a4b514.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '40': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml index dd81521a0..c6967713b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abigail Foreman (4) 97e9ce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4488': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml b/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml index 7dac27a3e..88fb5636a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Able Bodied 051742.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2746': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abyssal Rot bbeac6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Rot bbeac6.yaml new file mode 100644 index 000000000..c8a82a664 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Rot bbeac6.yaml @@ -0,0 +1,54 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94732 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10086\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Spell. Rot. Cursed.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: bbeac6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Abyssal Rot +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml index 290e40959..814d4ff41 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Abyssal Tome (2) a2d392.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml index 4954a3c94..2622a9392 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Accursed Fate 85e7d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5376': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml index 2b74907f1..1a090caff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Accursed Follower ef91a9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5833': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e92f21.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e92f21.yaml index f8ed60134..25eede713 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e92f21.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) (Taboo) e92f21.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml index a4bb33fe7..dc6f97c62 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace in the Hole (3) 074858.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml index b2e176b1a..a2b9e6458 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace of Rods (1) 52a677.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3187': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml index 0d1aec508..a7322891d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ace of Swords (1) c4d436.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4310': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml index 67b953529..c57a1b60b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Across Space and Time fb943f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml index ebf1bc3a4..496836379 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Act of Desperation 0bea17.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2746': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml index 6cce4b6e4..abcd522bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Adaptable (1) 731d2a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Aember Rot 3e6219.yaml b/unpacked/Bag All Player Cards 15bb07/Card Aember Rot 3e6219.yaml new file mode 100644 index 000000000..33d90d477 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Aember Rot 3e6219.yaml @@ -0,0 +1,54 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94733 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10087\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Spell. Rot. Cursed.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 3e6219 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Aember Rot +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml index c0e7890d1..f17435ab5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Against All Odds (2) c077bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml index ecc0d34ea..ee1cf916f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agency Backup (5) d6eda3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3786': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agent Ari Quinn d61c6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agent Ari Quinn d61c6a.yaml index b45136859..d3a47e27d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agent Ari Quinn d61c6a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agent Ari Quinn d61c6a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agent Fletcher 95b0cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agent Fletcher 95b0cf.yaml index f63390f6e..585ddcd16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agent Fletcher 95b0cf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agent Fletcher 95b0cf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Back) 909f30.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Back) 909f30.yaml index 6c2206155..f296552d0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Back) 909f30.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Back) 909f30.yaml @@ -21,7 +21,14 @@ Description: The Waitress DragSelectable: true GMNotes: "{\n \"id\": \"01004-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": - 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\"\n}" + 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": + 1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n + \ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n }\n ]\n}" GUID: 909f30 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Front) 02db0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Front) 02db0a.yaml index d73fece71..9bb473915 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Front) 02db0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel Front) 02db0a.yaml @@ -21,7 +21,14 @@ Description: The Waitress DragSelectable: true GMNotes: "{\n \"id\": \"01004-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": - 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\"\n}" + 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": + 1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n + \ }\n ]\n}" GUID: 02db0a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel) 01b6ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel) 01b6ef.yaml index 6b8d71a71..7076f8efd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel) 01b6ef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker (Parallel) 01b6ef.yaml @@ -21,7 +21,14 @@ Description: The Waitress DragSelectable: true GMNotes: "{\n \"id\": \"01004-p\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"01012\": 1,\n \"90018\": 1\n },\n {\n \"01013\": + 1,\n \"90019\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"mystic\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"spell\",\n + \ \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n }\n ]\n}" GUID: 01b6ef Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker 25e2db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker 25e2db.yaml index 0933319ec..ba0b5c009 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker 25e2db.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker 25e2db.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01004\",\n \"alternate_ids\": [\n \"01504\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"01012\": 1,\n \"90018\": 1\n + \ },\n {\n \"01013\": 1,\n \"90019\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 25e2db Grid: true GridProjection: false @@ -64,7 +70,15 @@ States: GMNotes: "{\r\n \"id\": \"01004\",\r\n \"alternate_ids\": [\r\n \"01504\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\": \"Sorcerer.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\"\r\n}\r" + 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"Core\",\r\n \"deck_requirements\": + {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": + [\r\n {\r\n \"01012\": 1,\r\n \"90018\": 1\r\n },\r\n + \ {\r\n \"01013\": 1,\r\n \"90019\": 1\r\n }\r\n ]\r\n + \ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n + \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n + \ \"survivor\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: 6797bb Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Akachi Onyele 452ed8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Akachi Onyele 452ed8.yaml index f64b8f86f..fbe36c6c3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Akachi Onyele 452ed8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Akachi Onyele 452ed8.yaml @@ -21,7 +21,15 @@ Description: The Shaman DragSelectable: true GMNotes: "{\n \"id\": \"03004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Sorcerer.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03014\": 1\n },\n {\n \"03015\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"uses\": [\n \"charge\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 4\n }\n },\n {\n \"trait\": + [\n \"occult\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n }\n }\n ]\n}" GUID: 452ed8 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Distillation 502a4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Distillation 502a4d.yaml index 30e874456..ebf5a698f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Distillation 502a4d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Distillation 502a4d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml index 75c322719..972d6a48f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation (2) 283e54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4440': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml index c04e8f3b5..449a5ce64 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alchemical Transmutation 54832d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml index dc5dbf517..c7fba6add 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alejandro Vela c49b4b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml index e34e6174e..f550af0a7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alice Luxley ae20e0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) 5db655.yaml b/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) 5db655.yaml index b7d406d2c..d6d4010f0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) 5db655.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card All In (5) (Taboo) 5db655.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml b/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml index fc8f83672..da9ab4907 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card All In (5) 7d3a27.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2655': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml index f5d0bfd24..bebc57bb0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (1) 9e4e11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml index 83f0ef045..4e3b57b81 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alter Fate (3) 83c86b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml index baaa5caa2..3e1c0d8d9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Alyssa Graham 53867b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Amanda Sharpe 05b950.yaml b/unpacked/Bag All Player Cards 15bb07/Card Amanda Sharpe 05b950.yaml index 8574e641f..9da628d09 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Amanda Sharpe 05b950.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Amanda Sharpe 05b950.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Miskatonic. Scholar.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" + Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"07008\": 1\n },\n {\n \"07009\": + 1\n }\n ]\n \n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"practiced\"\n + \ ],\n \"type\": [\n \"skill\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 3\n }\n }\n ]\n}" GUID: 05b950 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml index 4231c2c93..7b651db25 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ambush (1) a1fd61.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Amina Zidane 4c2a3d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Amina Zidane 4c2a3d.yaml index abb7a3ab8..a18333f09 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Amina Zidane 4c2a3d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Amina Zidane 4c2a3d.yaml @@ -21,7 +21,14 @@ Description: The Operator DragSelectable: true GMNotes: "{\n \"id\": \"09011\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Chosen. Cursed.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09012\": 1,\n \"09013\": 1\n + \ },\n {\n \"09014\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"trait\": [\n \"charm\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 4\n }\n }\n ]\n}" GUID: 4c2a3d Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml index 83a0cb977..4512bffa1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml index 615f17a40..e64a1822a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml index 306caa016..1ed718f39 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Analytical Mind 7b6ab5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3745': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml index 15a8f27bf..b791f50bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Anatomical Diagrams a8e495.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancestral Knowledge (3) 7b7d14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancestral Knowledge (3) 7b7d14.yaml index 39ebc35be..0ecfc146f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancestral Knowledge (3) 7b7d14.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancestral Knowledge (3) 7b7d14.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5892': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Covenant (2) (Taboo) e01cc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Covenant (2) (Taboo) e01cc7.yaml index 7347e6510..55ca25bea 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Covenant (2) (Taboo) e01cc7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Covenant (2) (Taboo) e01cc7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml index 6ac2669c1..342bcc204 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (1) 9bc46e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml index 2757fd883..a1c953aa7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 3289b0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml index e889d7187..484ffb9f8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 863f91.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2622': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml index e67b4005e..860be844b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Stone (4) 9c56d3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2622': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml index 329762d5b..fb7b602bd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Angered Spirits d8705c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3747': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml index ad8901051..07f5946e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Anna Kaslow (4) 03a4de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3739': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml index 2e57ff183..aa445a7cd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Another Day, Another Dollar (3) 006d44.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Antediluvian Hymn (0) ba4746.yaml b/unpacked/Bag All Player Cards 15bb07/Card Antediluvian Hymn (0) ba4746.yaml new file mode 100644 index 000000000..1aadce6fb --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Antediluvian Hymn (0) ba4746.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94737 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10093\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Augury. Double.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of + Hemlock Vale\"\n}" +GUID: ba4746 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Antediluvian Hymn (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Antiquary (3) 452db2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Antiquary (3) 452db2.yaml index e224a82b3..7c9b03d17 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Antiquary (3) 452db2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Antiquary (3) 452db2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml index 27826ef89..38367c25c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Anything You Can Do, Better 2c563c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml b/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml index 300c76cb0..9152f5fc8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml index de220d14f..07441e85d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (1) 9393ec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml index ce508beb3..e26f69cd9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Aquinnah (3) fb9dbb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml index d5ef125c3..3eb4f78d7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arbiter of Fates 4fbdb2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml index db0ada6db..e029e33a8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Enlightenment e69708.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml index ba3261f4f..bca1be927 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate (3) 65b30d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml index b7f5cc190..733cc91fc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Initiate 7307c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml index d0aaaf60c..8968a9a18 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Insight (4) 536b52.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml index 935d87f1e..e7174915f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Research e425d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml index a88eb68a3..11139a60c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (2) 644af9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml index 9142deb07..33c891983 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies (4) ca23d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml index 92fd24618..df94a5d5a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arcane Studies 9e4505.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml index c49d875b4..45578f70e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 3d35aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml index d8056d03d..89c2ad38f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) 66d5a3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4410': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml index deb59579b..aa909345b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs (3) a14a11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml index 21152195a..ab5155091 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archaic Glyphs cbfc12.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 098132.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 098132.yaml index c0325e004..f8c0d5670 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 098132.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 098132.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 1fdf4c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 1fdf4c.yaml index 0eaf2bc7b..b08b27103 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 1fdf4c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 1fdf4c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 4b1b99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 4b1b99.yaml index 990b02378..3f237b881 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 4b1b99.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 4b1b99.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 88ff66.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 88ff66.yaml index 352ec528c..da6d6eace 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 88ff66.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits (4) 88ff66.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits 8023f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits 8023f5.yaml index 414e43508..3c8830976 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits 8023f5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Archive of Conduits 8023f5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ariadne's Twine (3) 27f6aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ariadne's Twine (3) 27f6aa.yaml index 7e4afa28c..fe2eaef8e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ariadne's Twine (3) 27f6aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ariadne's Twine (3) 27f6aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5893': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arm Injury 8f1420.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arm Injury 8f1420.yaml index db4664cf0..20ea4096f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arm Injury 8f1420.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arm Injury 8f1420.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Armageddon (4) 32e5a4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Armageddon (4) 32e5a4.yaml index 449bbceee..0d0df6d44 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Armageddon (4) 32e5a4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Armageddon (4) 32e5a4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml index 9aa3cd5d9..d16c3598f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml index 18a882463..3be17f95a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Armor of Ardennes (5) f7a9ab.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml index f7c35a2a0..40dcafd79 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml index fdfe6fa47..4288ddb81 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Art Student 07a8f0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card As you wish 4b891d.yaml b/unpacked/Bag All Player Cards 15bb07/Card As you wish 4b891d.yaml index 6d810a2c3..21dc34750 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card As you wish 4b891d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card As you wish 4b891d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5877': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Back) 5294c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Back) 5294c3.yaml index 503b864b7..2d65a2bec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Back) 5294c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Back) 5294c3.yaml @@ -21,7 +21,19 @@ Description: The Drifter DragSelectable: true GMNotes: "{\n \"id\": \"02005-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n + \ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\": + [\n \"improvised\",\n \"tactic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 4\n }\n },\n {\n \"level\": {\n \"min\": + 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"faction\": [\n \"guardian\"\n + \ ],\n \"error\": \"You cannot have more than 5 level 0 Guardian cards\"\n + \ }\n ]\n}" GUID: 5294c3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Front) 5294c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Front) 5294c3.yaml index 8ffb11e6d..991046208 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Front) 5294c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Front) 5294c3.yaml @@ -21,7 +21,15 @@ Description: The Drifter DragSelectable: true GMNotes: "{\n \"id\": \"02005-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n + \ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Survivor or Neutral\"\n }\n ]\n}" GUID: 5294c3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel) 5294c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel) 5294c3.yaml index 197e28b80..e5c63c8fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel) 5294c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel) 5294c3.yaml @@ -21,7 +21,19 @@ Description: The Drifter DragSelectable: true GMNotes: "{\n \"id\": \"02005-p\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n + \ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"trait\": + [\n \"improvised\",\n \"tactic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 4\n }\n },\n {\n \"level\": {\n \"min\": + 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"faction\": [\n \"guardian\"\n + \ ],\n \"error\": \"You cannot have more than 5 level 0 Guardian cards\"\n + \ }\n ]\n}" GUID: 5294c3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete 5294c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete 5294c3.yaml index bef1c985c..03edcf70e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete 5294c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ashcan Pete 5294c3.yaml @@ -21,7 +21,15 @@ Description: The Drifter DragSelectable: true GMNotes: "{\n \"id\": \"02005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90047\": 1,\n \"02014\": 1\n + \ },\n {\n \"90048\": 1,\n \"02015\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Survivor or Neutral\"\n }\n ]\n}" GUID: 5294c3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml index 31410d1fc..d012e7073 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Astounding Revelation 7686cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4410': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astral Mirror (2) b5d894.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astral Mirror (2) b5d894.yaml index 919d2af0d..e1de297ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Astral Mirror (2) b5d894.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Astral Mirror (2) b5d894.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml index d3cce696f..29d821d94 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Astral Travel 31d087.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Astronomical Atlas (3) 804397.yaml b/unpacked/Bag All Player Cards 15bb07/Card Astronomical Atlas (3) 804397.yaml index fc45ae431..faf68b238 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Astronomical Atlas (3) 804397.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Astronomical Atlas (3) 804397.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card At a Crossroads (1) 48e90b.yaml b/unpacked/Bag All Player Cards 15bb07/Card At a Crossroads (1) 48e90b.yaml index ac4570d74..41ac7947e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card At a Crossroads (1) 48e90b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card At a Crossroads (1) 48e90b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml index 823dce37a..457a05c7f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml index c0dfb5e0a..ac3fa103d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml b/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml index 1e6110d78..af5b74d4d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card August Lindquist 83b588.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Awakened Mantle e81861.yaml b/unpacked/Bag All Player Cards 15bb07/Card Awakened Mantle e81861.yaml index 63de74abd..a4ed84eec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Awakened Mantle e81861.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Awakened Mantle e81861.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4511': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml index 7fe2ceef8..b5348d80f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (3) c5fb42.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml index 842ea62ef..2c0f11290 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame (5) 0ee874.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml index fbcc94b8c..d4c860938 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Azure Flame 17319c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Back Injury f6c482.yaml b/unpacked/Bag All Player Cards 15bb07/Card Back Injury f6c482.yaml new file mode 100644 index 000000000..e26a04bc7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Back Injury f6c482.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94760 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10136\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: f6c482 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Back Injury +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml index 3b8e6fcb1..b04e64b8b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backpack (2) 389a34.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml index bc6f0fa0f..4c7c4d054 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml index a79efc6b2..e37439414 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backstab (3) 7baf75.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml index bdc0e94fe..3d96c9c96 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) f9a232.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) f9a232.yaml index 5a012a93f..c88096bc1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) f9a232.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch (3) f9a232.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5903': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml index bc98df85b..68fb99bd7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bait and Switch 2c2d9a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml index 7f11fb04d..383985ca6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml index 1774dc361..5bb3daedb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandolier (2) e8b7ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3142': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml index e733285d4..e37fc63f1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bangle of Jinxes (1) a65852.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bangle of Jinxes (1) a65852.yaml index 8edd6d549..aa40e7496 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bangle of Jinxes (1) a65852.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bangle of Jinxes (1) a65852.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Banish (1) (Taboo) 1a3b10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) (Taboo) 1a3b10.yaml index adaae15b5..a810b8f7f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Banish (1) (Taboo) 1a3b10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) (Taboo) 1a3b10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml index c92588a13..c1e2a20bd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Banish (1) a00fca.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2775': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bank Job (0) c4dfa2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bank Job (0) c4dfa2.yaml new file mode 100644 index 000000000..6cdcd933d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bank Job (0) c4dfa2.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94723 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10069\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Gambit. Double. Illicit.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: c4dfa2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bank Job (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml index c67b40438..f90265bb2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Baron Samedi 16ad5d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5275': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 3689dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 3689dd.yaml index 472884e92..f9cd1b9a2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 3689dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Barricade (3) 3689dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5809': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml b/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml index 4dc3de74f..fc4de9dd0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat (2) 567525.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat (2) 567525.yaml index 99b41dc80..e039210d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat (2) 567525.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat (2) 567525.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 14d8ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 14d8ff.yaml index cbdb34247..3d2893534 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 14d8ff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 14d8ff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml index f38d3e04f..6cec83936 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Baseball Bat 48e103.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml index 7b93de7d8..2b75c8620 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2956': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml index 5da0dcba5..90d1d0559 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bear Trap 74840a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4541': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml index fee7d5d65..3ca724036 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml index d30a7eea6..ad59f3bfe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Beat Cop 7d4749.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml b/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml index 936512d0a..12b5e1c63 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5812': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml index 009f4b268..c25151396 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Belly of the Beast dffa9d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2779': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml index cd15213f4..041f0bcd3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5870': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml index 2fb063124..c5b36292d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Beretta M1918 (4) 91da6b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bestow Resolve (2) 39e14a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bestow Resolve (2) 39e14a.yaml index adcb5d959..e359776df 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bestow Resolve (2) 39e14a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bestow Resolve (2) 39e14a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bewitching (3) db335c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bewitching (3) db335c.yaml new file mode 100644 index 000000000..13d216344 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bewitching (3) db335c.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94728 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10079\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent. Trick.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: db335c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bewitching (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz (0) 897a94.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz (0) 897a94.yaml new file mode 100644 index 000000000..0a1a20b28 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz (0) 897a94.yaml @@ -0,0 +1,59 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94720 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Singing Your Songs +DragSelectable: true +GMNotes: "{\n \"id\": \"10062\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Criminal. Socialite.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": + \"10063\"\n }\n ],\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 10,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 897a94 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bianca "Die Katz" (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz 992ccd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz 992ccd.yaml new file mode 100644 index 000000000..faa156016 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bianca Die Katz 992ccd.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94721 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10063\",\n \"type\": \"Enemy\",\n \"traits\": \"Humanoid. + Criminal. Socialite.\",\n \"victory\": 0,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 992ccd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bianca "Die Katz" +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- ScenarioCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bide Your Time (0) 24d3b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bide Your Time (0) 24d3b3.yaml new file mode 100644 index 000000000..592ea7349 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Bide Your Time (0) 24d3b3.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94755 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10129\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Double.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 24d3b3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Bide Your Time (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml index ebc029a9a..863885d34 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bind Monster (2) ba1460.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Binder's Jar (1) c72750.yaml b/unpacked/Bag All Player Cards 15bb07/Card Binder's Jar (1) c72750.yaml index 2743a7602..2815ea2db 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Binder's Jar (1) c72750.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Binder's Jar (1) c72750.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bizarre Diagnosis 2423d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bizarre Diagnosis 2423d4.yaml index a70d4e095..0e0f622e9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bizarre Diagnosis 2423d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bizarre Diagnosis 2423d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) (Taboo) 4d085b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) (Taboo) 4d085b.yaml index 9ee8a2e79..671b85f32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) (Taboo) 4d085b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) (Taboo) 4d085b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) 20da53.yaml b/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) 20da53.yaml index 565a9aa7c..53c958815 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) 20da53.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Black Market (2) 20da53.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml index d1c23aa24..1f3595da8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blackjack (2) 37a2b5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3141': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml index 31a5971c3..d0434337b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at e89f48.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at e89f48.yaml index 0c97904df..9aee15e7f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at e89f48.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blade of Ark'at e89f48.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5826': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600953065965648/5A0D88CCA811A490C2FEF2675A397E1CEE010870/ NumHeight: 4 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blade of Yoth c61a83.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blade of Yoth c61a83.yaml new file mode 100644 index 000000000..9da403822 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blade of Yoth c61a83.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94707 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Father's Ire +DragSelectable: true +GMNotes: "{\n \"id\": \"10036\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Guardian\",\n \"traits\": \"Item. Relic. Weapon. Melee.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"type\": \"Charge\",\n + \ \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: c61a83 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blade of Yoth +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade (4) 9401f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade (4) 9401f4.yaml new file mode 100644 index 000000000..208b23f66 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade (4) 9401f4.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94705 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10034\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Weapon. Melee. Blessed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 9401f4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Blessed Blade (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml index 063081f43..17ecc4451 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blessed Blade cf4571.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5816': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blessing of Isis (3) 205385.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blessing of Isis (3) 205385.yaml index 63d1862d3..47e811489 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blessing of Isis (3) 205385.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blessing of Isis (3) 205385.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5808': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml index 9d5cf05ee..7ad22d00c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light (2) 8254d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml index afd585575..975452582 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blinding Light 30f860.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml index 7e80c2ab9..d317bb061 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (1) 5efc92.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml index f14dc51e0..924528f47 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Eclipse (3) 53d765.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3140': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml index 215d34878..79da3c8bc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact (3) 64e131.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml index 76591595a..546bcaaf8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Pact fc709b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood Will Have Blood (2) e81f1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood Will Have Blood (2) e81f1e.yaml index 196f169c3..9ee958120 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood Will Have Blood (2) e81f1e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood Will Have Blood (2) e81f1e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml index 9f5be9961..bdc82855c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blood-Rite eafd12.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5916': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml index 5327979d2..bc206fa6b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4409': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml index 13117fd63..8796bccf2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bloodstained Dagger d71f11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2741': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blur (1) 5be76d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blur (1) 5be76d.yaml index e0325cdfa..73a2cce61 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blur (1) 5be76d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blur (1) 5be76d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Blur (4) 5ade28.yaml b/unpacked/Bag All Player Cards 15bb07/Card Blur (4) 5ade28.yaml index a6d652ce7..ddac27aca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blur (4) 5ade28.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blur (4) 5ade28.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bob Jenkins 419b0c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bob Jenkins 419b0c.yaml index 2307b6870..a89af910c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bob Jenkins 419b0c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bob Jenkins 419b0c.yaml @@ -21,7 +21,17 @@ Description: The Salesman DragSelectable: true GMNotes: "{\n \"id\": \"08016\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": - 4,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\"\n}" + 4,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08017\": 1\n },\n {\n \"08018\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": + [\n \"rogue\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": + \"You cannot have more than 5 level 0 Rogue cards\"\n }\n ]\n}" GUID: 419b0c Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml index 9dccfc90d..9dba63249 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml index c0411a9e8..96e38ac66 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5877': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bonnie Walsh 634e9e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bonnie Walsh 634e9e.yaml index 18d6c1ab6..424c48e5b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bonnie Walsh 634e9e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bonnie Walsh 634e9e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml index 9cf277532..3622f8882 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Psalms cc1ef3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5880': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml index e811ed248..329ba296f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (1) 35166c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml index b4aac060f..3f6043236 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Book of Shadows (3) 296dc8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml b/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml index 7eef89aca..53a9c72c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Borrowed Time (3) 0db666.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml index 027549283..c2b7485c5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bought in Blood 275dc3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3771': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml index d7facf07f..4573ec955 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bounty Contracts 4d9b32.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5822': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml index 4ef0efcee..03e5eb67a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves (3) 54293e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml index 30085d8df..930a81669 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Boxing Gloves db4a43.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (1) 0fff60.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (1) 0fff60.yaml index b9d13fabb..d9d7f24d0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (1) 0fff60.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (1) 0fff60.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (4) 200b64.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (4) 200b64.yaml index e93929b0d..57aabe798 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (4) 200b64.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Brand of Cthugha (4) 200b64.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Breach the Door 74969c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Breach the Door 74969c.yaml index 25e66e219..df5108887 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Breach the Door 74969c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Breach the Door 74969c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering (2) 3411dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering (2) 3411dd.yaml index c8c348f39..f0a0b52c8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering (2) 3411dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering (2) 3411dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml index dac66c728..be77489c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Breaking and Entering 31cfbf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (0) 9b76a0.yaml b/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (0) 9b76a0.yaml new file mode 100644 index 000000000..dd7b4bea2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (0) 9b76a0.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94722 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10065\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. FIrearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 9b76a0 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: British Bull Dog (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (2) 7b7050.yaml b/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (2) 7b7050.yaml new file mode 100644 index 000000000..943b8a7fa --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card British Bull Dog (2) 7b7050.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94727 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10077\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 7b7050 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: British Bull Dog (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Broken Diadem (5) b6d35d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Broken Diadem (5) b6d35d.yaml new file mode 100644 index 000000000..d418fd36f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Broken Diadem (5) b6d35d.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94757 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Crown of Dying Light +DragSelectable: true +GMNotes: "{\n \"id\": \"10133\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Item. Charm. Mask.\",\n \"bonded\": + [\n {\n \"count\": 1,\n \"id\": \"10134\"\n }\n ],\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Offering\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: b6d35d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Broken Diadem (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml index 94c2a4d07..0a98d0ffa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Brother Xavier (1) 3c9617.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bruiser (3) 8ec9cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bruiser (3) 8ec9cb.yaml index 1fc8abbd8..6a0503396 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bruiser (3) 8ec9cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bruiser (3) 8ec9cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml index c0a0e7413..c4f035df3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Brute Force (1) fb9b7e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3802': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml index 1f6a81812..86148704e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bulletproof Vest (3) c4cf62.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burden of Destiny 45c19e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burden of Destiny 45c19e.yaml index ddf2f5a0d..3101f33aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burden of Destiny 45c19e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burden of Destiny 45c19e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burden of Leadership 22e624.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burden of Leadership 22e624.yaml index 4a924497b..a95550a06 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burden of Leadership 22e624.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burden of Leadership 22e624.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml index 1c137e69c..d6ff32ac6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary (2) 2aeb8a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4476': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml index cce9284ca..0c17893bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml index b3abbaaca..6db8fc69e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Buried Secrets 28080d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Buried Secrets 28080d.yaml index 405b3ab17..a469cc632 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Buried Secrets 28080d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Buried Secrets 28080d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) (Taboo) 2ced40.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) (Taboo) 2ced40.yaml index 3e9490cea..ce573327b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) (Taboo) 2ced40.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) (Taboo) 2ced40.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) eedd0b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) eedd0b.yaml index 1dde1b39b..02787d828 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) eedd0b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burn After Reading (1) eedd0b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml index ccac8690c..a4c843ba7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burning the Midnight Oil 0d29be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml index fa23b090a..52a6ffd60 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bury Them Deep e6efe6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4318': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml index 594390a2c..74141d90c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Effect (1) 22fc6c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (2) 5779d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (2) 5779d3.yaml index 6a360fffb..4b128694e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (2) 5779d3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (2) 5779d3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (5) 0a312f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (5) 0a312f.yaml index b23433839..2652e9ad3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (5) 0a312f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Butterfly Swords (5) 0a312f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Calculated Risk dfbed9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Calculated Risk dfbed9.yaml index 95f56c164..3b1458f1d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Calculated Risk dfbed9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Calculated Risk dfbed9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Call for Backup (2) 1d1901.yaml b/unpacked/Bag All Player Cards 15bb07/Card Call for Backup (2) 1d1901.yaml index 88b5a6a90..ede672df4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Call for Backup (2) 1d1901.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Call for Backup (2) 1d1901.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml b/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml index 55d140ab2..e971aa9ff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Call of the Unknown 86feae.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3772': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Call the Beyond (2) 0dd070.yaml b/unpacked/Bag All Player Cards 15bb07/Card Call the Beyond (2) 0dd070.yaml new file mode 100644 index 000000000..49ebfa379 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Call the Beyond (2) 0dd070.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94740 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10099\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Ritual. Cursed.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 0dd070 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Call the Beyond (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml index d705c5bed..697947649 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Called by the Mists e628de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml index 9d77395ec..a72c8ac82 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Calling in Favors 9b9e8b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Calvin Wright b02a1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Calvin Wright b02a1e.yaml index 156a4baf1..d437e48da 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Calvin Wright b02a1e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Calvin Wright b02a1e.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"04005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Cursed. Drifter.\",\n \"willpowerIcons\": 0,\n \"intellectIcons\": 0,\n \"combatIcons\": 0,\n \"agilityIcons\": 0,\n \"cycle\": \"The Forgotten - Age\"\n}" + Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"04015\": 1\n },\n {\n \"04016\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"spirit\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}" GUID: b02a1e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Captivating Discovery 498bc8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Captivating Discovery 498bc8.yaml index c5cd2f72f..30fa408d7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Captivating Discovery 498bc8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Captivating Discovery 498bc8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3794': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119525055/928CCA871D837CB4FB8E847957747E1E56F14449/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern b03b12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern b03b12.yaml index efae00ff4..d0d3e66b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern b03b12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern b03b12.yaml @@ -22,7 +22,20 @@ DragSelectable: true GMNotes: "{\n \"id\": \"05001\",\n \"alternate_ids\": [\n \"98010\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Medic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": - \"The Circle Undone\"\n}" + \"The Circle Undone\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"05007\": 1,\n \"98011\": 1\n },\n + \ {\n \"05008\": 1,\n \"98012\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"not\": true,\n \"trait\": [\n \"weapon\"\n ],\n + \ \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n },\n {\n + \ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"special\": [\n \"heals_horror\"\n ],\n \"tag\": + [\n \"hh\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\",\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n + \ \"limit\": 15,\n \"error\": \"You cannot have more than 15 level 0-1 + Seeker and/or Mystic cards\"\n }\n ]\n}" GUID: b03b12 Grid: true GridProjection: false @@ -64,7 +77,23 @@ States: GMNotes: "{\r\n \"id\": \"05001\",\r\n \"alternate_ids\": [\r\n \"98010\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Guardian\",\r\n \"traits\": \"Medic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 4,\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" + 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\",\r\n \"deck_requirements\": + {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": + [\r\n {\r\n \"05007\": 1,\r\n \"98011\": 1\r\n },\r\n {\r\n + \ \"05008\": 1,\r\n \"98012\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\": + [\r\n {\r\n \"not\": true,\r\n \"trait\": [\r\n \"weapon\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 1,\r\n \"max\": 5\r\n + \ }\r\n },\r\n {\r\n \"faction\": [\r\n \"guardian\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 3\r\n + \ }\r\n },\r\n {\r\n \"faction\": [\r\n \"neutral\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n + \ }\r\n },\r\n {\r\n \"special\": [\r\n \"heals_horror\"\r\n + \ ],\r\n \"tag\": [\r\n \"hh\"\r\n ],\r\n \"level\": + {\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n + \ \"faction\": [\r\n \"seeker\",\r\n \"mystic\"\r\n ],\r\n + \ \"level\": {\r\n \"min\": 0,\r\n \"max\": 1\r\n },\r\n + \ \"limit\": 15,\r\n \"error\": \"You cannot have more than 15 level + 0-1 Seeker and/or Mystic cards\"\r\n }\r\n ]\r\n}\r\n" GUID: 9900a3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Carson Sinclair dc96d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Carson Sinclair dc96d1.yaml index fd650c3ee..dcd57458f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Carson Sinclair dc96d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Carson Sinclair dc96d1.yaml @@ -21,7 +21,21 @@ Description: The Butler DragSelectable: true GMNotes: "{\n \"id\": \"09001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Assistant.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09002\": 2\n },\n {\n \"09003\": + 1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"guardian\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": \"Seeker\",\n + \ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Mystic\",\n + \ \"faction\": [\n \"mystic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n + \ \"faction\": [\n \"survivor\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n }\n ]\n}" GUID: dc96d1 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml index 54d1e8615..9833c3f1d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cat Burglar (1) 2fe723.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml b/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml index 52d526558..d229e75b5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Caught Red-Handed ecd087.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3768': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml index 384a01459..ea3f3d48a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Celaeno Fragments d287bc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle (4) 4a6a9f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle (4) 4a6a9f.yaml index d95e7acdc..bb4ff1ef8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle (4) 4a6a9f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle (4) 4a6a9f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle b5e78c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle b5e78c.yaml index ca17423c0..7efb0e7f2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle b5e78c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ceremonial Sickle b5e78c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml index 88618fa7c..ed2a50b19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chainsaw (4) d40f4e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml index 29a2e684f..232b863ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Charisma (3) 9e6c55.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2925': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml index 1d38487d4..57da52082 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Charles Ross, Esq. 4a2a36.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charlie Kane 95fb5e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charlie Kane 95fb5e.yaml index f3c7f5b48..623f99907 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Charlie Kane 95fb5e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Charlie Kane 95fb5e.yaml @@ -21,7 +21,23 @@ Description: The Politician DragSelectable: true GMNotes: "{\n \"id\": \"09018\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n \ \"traits\": \"Civic. Socialite.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": - 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09019\": 1\n },\n {\n \"09020\": + 1\n }\n ],\n \"choices\": 2\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"ally\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": + \"Guardian\",\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n },\n {\n \"choiceName\": + \"Seeker\",\n \"faction\": [\n \"seeker\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n },\n {\n \"choiceName\": + \"Rogue\",\n \"faction\": [\n \"rogue\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n },\n {\n \"choiceName\": + \"Mystic\",\n \"faction\": [\n \"mystic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n },\n {\n \"choiceName\": + \"Survivor\",\n \"faction\": [\n \"survivor\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 95fb5e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml b/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml index afd4208f7..faacb3bb2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Charon's Obol (1) 1dbc95.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml index 0d3739302..f88f0b08b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot (2) 0b963c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml index 2a98bb0fa..432bebf7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheap Shot b8c93a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml index 9a020b880..7687e1580 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheat Death (5) 3add54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cheat the System (1) f6d572.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cheat the System (1) f6d572.yaml index 2a8cff945..830a9b18f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cheat the System (1) f6d572.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cheat the System (1) f6d572.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chemistry Set da9727.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chemistry Set da9727.yaml index a5d86af65..1ac1204c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chemistry Set da9727.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chemistry Set da9727.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml index be9b194a0..2a34efd78 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake (1) 5a2b49.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml index fe59d50d3..0c67ef99d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cherished Keepsake 215cec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml index a2a71727d..b1d45a929 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chicago Typewriter (4) ecfa42.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml index 22dae9557..bf78e8b2c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4312': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (2) ea31c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (2) ea31c2.yaml index 29c8fcb0f..c2f59f30c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (2) ea31c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (2) ea31c2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml index 815f41f4d..538eb330f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chuck Fergus (5) 0e72b6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml index 1c9788b47..49d198e89 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (3) f5d382.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml index 6c46707e2..902dd215e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance (5) e21200.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml index 5c3f2d8d9..08546a104 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml index aa5719e2a..ac3b349b8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind (3) a53344.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3136': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml index c945cfe94..9414c2360 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clarity of Mind 8e57b8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml index 8eb9121f3..fcc99850f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clasp of Black Onyx f295d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2323': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Claypool's Furs c1f999.yaml b/unpacked/Bag All Player Cards 15bb07/Card Claypool's Furs c1f999.yaml index 5ced7c5a5..dac2b9c32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Claypool's Furs c1f999.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Claypool's Furs c1f999.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clean Sneak (4) 537171.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clean Sneak (4) 537171.yaml index 701d48f8b..1b61879fa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clean Sneak (4) 537171.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clean Sneak (4) 537171.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml index f071f9b8d..c292cbf4d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clean Them Out 3319be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (0) d07668.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (0) d07668.yaml new file mode 100644 index 000000000..6c98cfdf4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (0) d07668.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94700 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10020\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: d07668 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cleaning Kit (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (3) 94c3e1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (3) 94c3e1.yaml new file mode 100644 index 000000000..89bad32f8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Cleaning Kit (3) 94c3e1.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94704 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10033\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 4,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 94c3e1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Cleaning Kit (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm e4ab48.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm e4ab48.yaml index aa42ca9d7..59b37ddae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm e4ab48.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cloak of the Outer Realm e4ab48.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5879': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600953065965648/5A0D88CCA811A490C2FEF2675A397E1CEE010870/ NumHeight: 4 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml b/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml index cf064af59..8bfd0af20 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Close Call (2) 6aae86.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Close the Circle (1) d02825.yaml b/unpacked/Bag All Player Cards 15bb07/Card Close the Circle (1) d02825.yaml index 7833cce38..6dd9cf388 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Close the Circle (1) d02825.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Close the Circle (1) d02825.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Collected Works of Poe d6f719.yaml b/unpacked/Bag All Player Cards 15bb07/Card Collected Works of Poe d6f719.yaml index 38cacd478..5e9b5e4f2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Collected Works of Poe d6f719.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Collected Works of Poe d6f719.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml index 9f04de07d..66358f46f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket (2) 8dda2d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml index 128fce9f9..8f88bc7df 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Colt Vest Pocket 5a305e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2761': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml index 3f66b2119..5f2413ce8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (1) bd3ecc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Combat Training (3) 36efa2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (3) 36efa2.yaml index 8a61db632..47b4a9335 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Combat Training (3) 36efa2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Combat Training (3) 36efa2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml index df5341556..2fbd52642 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Connect the Dots 13413d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4308': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml index 0c9b7b703..6a88a7032 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Contraband (2) 620b6e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3153': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml b/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml index 39d4b736e..42c63f828 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cookie's Custom .32 34e723.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cookie's Custom .32 34e723.yaml index e90799daa..1c99b06fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cookie's Custom .32 34e723.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cookie's Custom .32 34e723.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml index c1bef3adf..b887178c0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Copycat (3) de40c8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml index fc9395044..5575b41ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cornered (2) c6c260.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterespionage (1) fad52a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterespionage (1) fad52a.yaml index 5dc37afbd..523d0ef12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterespionage (1) fad52a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterespionage (1) fad52a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml index ff1ee76fc..d4762fb2e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch (2) 92436b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml index f5b9edc08..1549001a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) (Taboo) 9c9177.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) (Taboo) 9c9177.yaml index 7b7272ded..6150dfe48 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) (Taboo) 9c9177.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) (Taboo) 9c9177.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml index 16a096855..7ba47267d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterspell (2) 2236f6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml index 9391abd41..59186cf12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Coup de Grâce 2240f9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2762': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml index 27228c71f..5c708c6eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cover Up ca25bc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5524': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cover Up f802e3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cover Up f802e3.yaml index 858299c6d..1987a9ac2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cover Up f802e3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cover Up f802e3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml index ca4a6c543..5bc018f0f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crack the Case 8dce44.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2778': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crafty (3) fa994a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crafty (3) fa994a.yaml index 301f64a05..2db55164c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crafty (3) fa994a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crafty (3) fa994a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml index 58066f180..d8ac2ba5e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Faith 8b68f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5820': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity (Taboo) 17cab7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity (Taboo) 17cab7.yaml index 1414d0b11..314defc76 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity (Taboo) 17cab7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity (Taboo) 17cab7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml index 98611a7a3..fe1e8b8ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crisis of Identity 367aac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3749': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) 416f12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) 416f12.yaml index bdf908f89..e88e28ea2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) 416f12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) 416f12.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5842': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) e8b179.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) e8b179.yaml index 94fb2ffbf..48df2060f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) e8b179.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire (4) e8b179.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5881': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml index 7b73be8d6..e9e833707 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Grimoire fbfa24.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5871': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml index a5594c6c0..d5a9c0c1d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Research (4) 5d25b1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml index 2ebe06f8a..7c95dcf19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings (2) 870bdc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml index fa3cf9051..f8d8255b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptic Writings ff2776.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml index 5f35f18a7..de35ca3b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cryptographic Cipher 4f3142.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5803': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml index 554c686b7..df4b02311 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystal Pendulum 6c3156.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.ttslua index d9e069527..18b61d4dc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.ttslua @@ -41,133 +41,114 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/CrystallineElderSign3") end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("playercards/cards/CrystallineElderSign3", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["+1"] = true, @@ -254,6 +235,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -280,6 +263,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -441,39 +433,17 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end end) __bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -494,35 +464,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -530,4 +506,412 @@ do return BlessCurseManagerApi end end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.yaml index 72892a10b..8fc48ea0e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystalline Elder Sign (3) 949ca2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams 6692de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams 6692de.yaml index 3ec029305..b7b211449 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams 6692de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Crystallizer of Dreams 6692de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5905': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml index e102e759f..5fc480715 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cunning Distraction e8ea95.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml index 327b8947a..121f9b3b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5276': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml index deb10a2bc..d5e07cda1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4308': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Curse of Aeons (3) 3199f2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Curse of Aeons (3) 3199f2.yaml index 26bf612f5..809c24f9c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Curse of Aeons (3) 3199f2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Curse of Aeons (3) 3199f2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5801': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 2e33f7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 2e33f7.yaml index 728333df2..5fdb402bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 2e33f7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Curse of the Rougarou 2e33f7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '89': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml index 3cd9376e1..58ee76a55 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Custom Ammunition (3) f03baa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Custom Modifications d2252d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Custom Modifications d2252d.yaml index 55dbb3c51..9ab29e795 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Custom Modifications d2252d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Custom Modifications d2252d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) (Taboo) 42336b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) (Taboo) 42336b.yaml index e60798559..99f1f7a2c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) (Taboo) 42336b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) (Taboo) 42336b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) 4df3b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) 4df3b9.yaml index 3634bfd73..8fbdeda76 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) 4df3b9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cyclopean Hammer (5) 4df3b9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Back) 2f2e0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Back) 2f2e0d.yaml index a371b16f3..d4d2c85b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Back) 2f2e0d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Back) 2f2e0d.yaml @@ -21,7 +21,18 @@ Description: The Librarian DragSelectable: true GMNotes: "{\n \"id\": \"01002-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" + 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": + 1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\": + [\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n + \ \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + Guardian and/or Mystic cards\"\n }\n ]\n}" GUID: 2f2e0d Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Front) e8cafc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Front) e8cafc.yaml index 840dab32e..cbea542a6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Front) e8cafc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel Front) e8cafc.yaml @@ -21,7 +21,14 @@ Description: The Librarian DragSelectable: true GMNotes: "{\n \"id\": \"01002-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": - 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" + 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": + 1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n + \ }\n ]\n}" GUID: e8cafc Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel) 282857.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel) 282857.yaml index abfd62c34..2165f3125 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel) 282857.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker (Parallel) 282857.yaml @@ -21,7 +21,18 @@ Description: The Librarian DragSelectable: true GMNotes: "{\n \"id\": \"01002-p\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": - 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" + 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90002\": 1,\n \"01008\": 1\n },\n {\n \"90003\": + 1,\n \"01009\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\": + [\n \"tome\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 3\n }\n },\n {\n \"faction\": [\n \"guardian\",\n + \ \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + Guardian and/or Mystic cards\"\n }\n ]\n}" GUID: '282857' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker 6938eb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker 6938eb.yaml index 2a8497553..819197aa1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker 6938eb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker 6938eb.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01002\",\n \"alternate_ids\": [\n \"01502\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90002\": 1,\n \"01008\": 1\n + \ },\n {\n \"90003\": 1,\n \"01009\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 6938eb Grid: true GridProjection: false @@ -64,7 +70,15 @@ States: GMNotes: "{\r\n \"id\": \"01002\",\r\n \"alternate_ids\": [\r\n \"01502\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Seeker\",\r\n \"traits\": \"Miskatonic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 5,\r\n - \ \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" + \ \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n + \ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": + 1,\r\n \"signatures\": [\r\n {\r\n \"90002\": 1,\r\n \"01008\": + 1\r\n },\r\n {\r\n \"90003\": 1,\r\n \"01009\": 1\r\n + \ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\": + [\r\n \"seeker\",\r\n \"neutral\"\r\n ],\r\n \"level\": + {\r\n \"min\": 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n + \ \"faction\": [\r\n \"mystic\"\r\n ],\r\n \"level\": {\r\n + \ \"min\": 0,\r\n \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: ac7047 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 96c9be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 96c9be.yaml index b7ddbc626..69c429ed1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 96c9be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag 96c9be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5818': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag d72b97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag d72b97.yaml index 5cdc1999d..8a1876647 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag d72b97.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy's Tote Bag d72b97.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml index 798f4b0db..822ebb520 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Damning Testimony 3369a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Damning Testimony 3369a5.yaml index 31927363b..06cf0a92c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Damning Testimony 3369a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Damning Testimony 3369a5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daniela Reyes 444830.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daniela Reyes 444830.yaml index 47c7a0ff0..6cd4e2b69 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daniela Reyes 444830.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daniela Reyes 444830.yaml @@ -21,7 +21,18 @@ Description: The Mechanic DragSelectable: true GMNotes: "{\n \"id\": \"08001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Entrepreneur.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 1,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" + 1,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08002\": 1\n },\n {\n \"08003\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": + [\n \"survivor\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": + 5,\n \"error\": \"You cannot have more than 5 level 0 Survivor cards\"\n }\n + \ ]\n}" GUID: '444830' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml index a7b059a5e..fc5ab7cff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (2) b3cad4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4476': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daredevil (Taboo) cd1e54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (Taboo) cd1e54.yaml index 013ba727f..65596d13b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daredevil (Taboo) cd1e54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil (Taboo) cd1e54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml index 4e1d83580..cfe12d08d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml index 31aca458c..39ab4b055 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml index 6c0bea09e..ae48c13a6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver (2) fc82a5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml index 2666b0bad..fe7add646 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring Maneuver cc6b14.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml index 8f6ae7299..24f7435ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dario El-Amin 5ec1a2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml index caa4fecc6..39e0ec54a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Future 3aa40e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Horse (5) d00e4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse (5) d00e4d.yaml new file mode 100644 index 000000000..f9e1d2570 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse (5) d00e4d.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94754 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10127\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"level\": 5,\n \"traits\": \"Condition.\",\n \"permanent\": true,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: d00e4d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dark Horse (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml index a61cb683b..c000b29f1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Horse 1b4434.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml index 485f493ea..b81f03630 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Insight f08934.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4442': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml index 80e48ece8..22b7a8e0b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 580a4d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5841': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 98c8d8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 98c8d8.yaml index 083206249..475b6fa8c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 98c8d8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory 98c8d8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml index 1ca81ff0a..c480376cc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Memory c025bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2305': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml index 4df40ed54..4ce4caf08 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Pact dd3d09.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4408': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy (Taboo) 448db7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy (Taboo) 448db7.yaml index cffab9773..45848fcb1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy (Taboo) 448db7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy (Taboo) 448db7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml index 06d41da97..7d27f3c16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Prophecy da7613.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.ttslua index a2c391b0e..465561dc9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.ttslua @@ -41,14 +41,79 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playercards/cards/DarkRitual", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Curse"] = true -} +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } -KEEP_OPEN = true + -- 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 + }) -require("playercards/CardsThatSealTokens") + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/DarkRitual") end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens @@ -128,6 +193,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -154,6 +221,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -315,6 +391,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -322,8 +410,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -332,7 +420,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -350,6 +438,336 @@ do return TokenArrangerApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("playercards/cards/DarkRitual", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Curse"] = true +} + +KEEP_OPEN = true + +require("playercards/CardsThatSealTokens") +end) __bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local BlessCurseManagerApi = {} @@ -368,35 +786,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -409,7 +833,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -436,29 +860,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -467,14 +892,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -486,49 +915,4 @@ do return ChaosBagApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/DarkRitual") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.yaml index 4812fdb04..cea87e9e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dark Ritual 272e6c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5541': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Darrell Simmons 5d3d67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Darrell Simmons 5d3d67.yaml index 2c02a355f..ab3b70c26 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Darrell Simmons 5d3d67.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Darrell Simmons 5d3d67.yaml @@ -21,7 +21,13 @@ Description: The Photographer DragSelectable: true GMNotes: "{\n \"id\": \"09015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 5,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09016\": 1\n },\n {\n \"09017\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 5d3d67 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Darrell's Kodak caa382.yaml b/unpacked/Bag All Player Cards 15bb07/Card Darrell's Kodak caa382.yaml index 7cbba5e17..128170231 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Darrell's Kodak caa382.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Darrell's Kodak caa382.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dauntless Spirit (1) adc8b6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dauntless Spirit (1) adc8b6.yaml index 21d85c681..a49bf9d48 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dauntless Spirit (1) adc8b6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dauntless Spirit (1) adc8b6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card David Renfield (Taboo) 4c7c54.yaml b/unpacked/Bag All Player Cards 15bb07/Card David Renfield (Taboo) 4c7c54.yaml index adf236f63..649f8f346 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card David Renfield (Taboo) 4c7c54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card David Renfield (Taboo) 4c7c54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml b/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml index 6f81beabb..749d9675b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card David Renfield 1f8539.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dawn Star (1) 8b15d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dawn Star (1) 8b15d7.yaml new file mode 100644 index 000000000..1696851cc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dawn Star (1) 8b15d7.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94756 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10131\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ritual. Blessed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 8b15d7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dawn Star (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.ttslua index 495cc3f55..22d284cbc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.ttslua @@ -41,6 +41,93 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -49,29 +136,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -83,6 +172,77 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/DayofReckoning") end) @@ -171,6 +331,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -197,6 +359,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -358,6 +529,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -365,8 +548,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -375,7 +558,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -411,35 +594,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -447,86 +636,281 @@ do return BlessCurseManagerApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local ChaosBagApi = {} + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } end - return chaosBagContents end - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 end - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end end - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end end - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end end - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end end - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end end - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end end - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end end - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end end - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 end - return ChaosBagApi + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.yaml index b0e54cfd2..95e23e624 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5863': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml index 39597b9a9..b86148c47 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dayana Esperence (3) 4f2489.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml b/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml index e7c99dfed..a21ac4c99 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card De Vermis Mysteriis (2) b40b98.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2933': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deafening Silence 0821d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deafening Silence 0821d4.yaml index ff8957bcd..bc148a55f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deafening Silence 0821d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deafening Silence 0821d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Death ∙ XIII (1) 2e5b03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Death ∙ XIII (1) 2e5b03.yaml index 986bdeced..09433d4d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Death ∙ XIII (1) 2e5b03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Death ∙ XIII (1) 2e5b03.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2902': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml index 8e07e432f..929160210 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deciphered Reality (5) 8b0193.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml index 57d4daf6d..c8bda0112 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull (3) 946a58.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml index 4966996fb..d6a40095c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Decorated Skull 07350b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml index 83c68bbbe..a1252cf4e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2929': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml index 4aa6dd2c3..138279576 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction (2) 95272b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml index f61e06ad0..3aa173534 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml index a90b5e904..ee24ba724 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml index d7cc3f847..c7088f467 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deep Knowledge b176fc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5815': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Defensive Stance (1) 62e4f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Defensive Stance (1) 62e4f4.yaml index 658c52835..e6e6ded6e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Defensive Stance (1) 62e4f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Defensive Stance (1) 62e4f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml index f78ed1fa8..fecb41896 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Defiance (2) bf3dd1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml index f73933c0e..d09a8fd7b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml index 0dc3f3137..2fe0d93ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Delay the Inevitable 683937.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4310': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml index 24fe39ca4..b5507c49c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Delilah O'Rourke (3) 97a795.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4490': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) ca5603.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) ca5603.yaml index b05c094c1..345f71a9f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) ca5603.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep (Taboo) ca5603.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml index 3b32643ec..131338f60 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Delve Too Deep 14e212.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml index a999df1b5..b546b48ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml index 88befc0cd..89f583074 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence (5) d24531.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml index 40646300e..364bc48e4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deny Existence 8aa0c3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4309': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml index cac272834..df4b3b563 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Desperate Search 45bdf0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml b/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml index 63e6ee1d6..086c813f2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Detached from Reality d12359.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5875': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml index dc319bf71..223c6b8dd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Detective's Colt 1911s f4bac6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5920': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml b/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml index 8fc0c3aed..9d25a49fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Devil's Luck (1) 812685.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake e015f8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake e015f8.yaml index 2e6f3d5af..12009a3b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake e015f8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake e015f8.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07004\",\n \"alternate_ids\": [\n \"98016\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Sorcerer. Veteran.\",\n \ \"willpowerIcons\": 5,\n \"intellectIcons\": 2,\n \"combatIcons\": 3,\n \"agilityIcons\": - 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" + 2,\n \"cycle\": \"The Innsmouth Conspiracy\",\n \"deck_requirements\": {\n \"size\": + 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"98017\": + 1,\n \"07012\": 1\n },\n {\n \"98018\": 1,\n \"07013\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: e015f8 Grid: true GridProjection: false @@ -65,7 +71,15 @@ States: \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\": \"Sorcerer. Veteran.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The - Innsmouth Conspiracy\"\r\n}\r" + Innsmouth Conspiracy\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n + \ \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": [\r\n {\r\n + \ \"98017\": 1,\r\n \"07012\": 1\r\n },\r\n {\r\n \"98018\": + 1,\r\n \"07013\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\": + [\r\n {\r\n \"faction\": [\r\n \"mystic\",\r\n \"neutral\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n + \ }\r\n },\r\n {\r\n \"faction\": [\r\n \"rogue\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n + \ }\r\n }\r\n ]\r\n}\r\n" GUID: 3925ce Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Diabolical Luck (0) 1fea59.yaml b/unpacked/Bag All Player Cards 15bb07/Card Diabolical Luck (0) 1fea59.yaml new file mode 100644 index 000000000..0195bd5e3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Diabolical Luck (0) 1fea59.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94725 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10075\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Fortune. Cursed.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 1fea59 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Diabolical Luck (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Diana Stanley 32b091.yaml b/unpacked/Bag All Player Cards 15bb07/Card Diana Stanley 32b091.yaml index e076560f1..6decbd27a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Diana Stanley 32b091.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Diana Stanley 32b091.yaml @@ -21,7 +21,14 @@ Description: The Redeemed Cultist DragSelectable: true GMNotes: "{\n \"id\": \"05004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Cultist. Silver Twilight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Circle Undone\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Circle Undone\",\n + \ \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"05013\": 1\n },\n {\n \"05014\": + 1\n },\n {\n \"05015\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"mystic\",\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"faction\": [\n \"guardian\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 32b091 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml index 1b096fdb8..67c687d16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (2) 0414b4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (4) 734b45.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (4) 734b45.yaml index 8f0add130..b348f1180 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (4) 734b45.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep (4) 734b45.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml index 27684f84a..c81fc6790 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dig Deep fc9e1b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dimensional Beam Machine fb4fff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dimensional Beam Machine fb4fff.yaml index 1a59ad67a..71b80661d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dimensional Beam Machine fb4fff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dimensional Beam Machine fb4fff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5580': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764609761078/E05F39D952FE0C4E6473E744D64221DD1150F00A/ NumHeight: 4 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml index 3f85bbc97..082d69891 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml index ffef6be68..b83e9fbb8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml b/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml index b85d48156..6f6c0e4c6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml b/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml index a250fe822..754bf892b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml b/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml index 061c8810f..ab736a2e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dirty Deeds (3) aa2d6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dirty Deeds (3) aa2d6a.yaml new file mode 100644 index 000000000..6c3c0820c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Dirty Deeds (3) aa2d6a.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94729 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10080\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Favor. Double. Illicit.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: aa2d6a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Dirty Deeds (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dirty Fighting (2) fa1be0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dirty Fighting (2) fa1be0.yaml index f3ec913f9..5266893d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dirty Fighting (2) fa1be0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dirty Fighting (2) fa1be0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml index a31867e54..1662c5a1c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna (2) b00b76.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml index d7a1253d1..17c757177 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Disc of Itzamna d6c44a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml index 51dba6253..cb5bca692 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dissection Tools 95ca5d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dissection Tools 95ca5d.yaml index 001606088..e6e09388b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dissection Tools 95ca5d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dissection Tools 95ca5d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Divination (1) 658588.yaml b/unpacked/Bag All Player Cards 15bb07/Card Divination (1) 658588.yaml index f008e80a4..d0c2cfa30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Divination (1) 658588.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Divination (1) 658588.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Divination (4) 58f2af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Divination (4) 58f2af.yaml index 0c08b27d0..ce7f6cff7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Divination (4) 58f2af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Divination (4) 58f2af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dodge (2) 9ab750.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dodge (2) 9ab750.yaml index 346cd3d5c..0e7fbe5ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dodge (2) 9ab750.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dodge (2) 9ab750.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml index d27d06d33..eb8e23500 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml index b179d07c4..a353fbcdc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4408': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) 9aa0de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) 9aa0de.yaml index 1a657a0ba..dba99473f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) 9aa0de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing (Taboo) 9aa0de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml index 1950fd3b5..814f09092 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Double or Nothing efb09b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2617': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml b/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml index f7e87168c..41160ff5e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Double, Double (4) 0e0530.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Down the Rabbit Hole b925fc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Down the Rabbit Hole b925fc.yaml index de8bd8d1e..dca57a3d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Down the Rabbit Hole b925fc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Down the Rabbit Hole b925fc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod (4) bcb13d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod (4) bcb13d.yaml index badf50220..f0ecea301 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod (4) bcb13d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod (4) bcb13d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod 851e3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod 851e3a.yaml index 45b24d739..ed4ef19d8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod 851e3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dowsing Rod 851e3a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Charles West III 72efed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Charles West III 72efed.yaml index 991c7ca1f..58fd4d672 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Charles West III 72efed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Charles West III 72efed.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Dewi Irawan c76a06.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Dewi Irawan c76a06.yaml index 6cea830ef..736a9de55 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Dewi Irawan c76a06.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Dewi Irawan c76a06.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml index 91783c583..3c373ce91 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Elli Horowitz 27e7b3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml index 07b8d1113..5f81acda9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Francis Morgan f03306.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 9229a8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 9229a8.yaml index add91b840..1e9c02fed 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 9229a8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Henry Armitage 9229a8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5889': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 2a6fd1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 2a6fd1.yaml index 660e2bfd3..c49de05de 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 2a6fd1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher (Taboo) 2a6fd1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml index f420a8850..472703f94 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. Milan Christopher 9934d2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson (2) 3ee7a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson (2) 3ee7a5.yaml index cc67a17f7..74010e5b0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson (2) 3ee7a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson (2) 3ee7a5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 14d04f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 14d04f.yaml index d24c95a14..c6e157141 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 14d04f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dr. William T. Maleson 14d04f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5811': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dragon Pole 331b58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dragon Pole 331b58.yaml index d19b7177d..a26647b8c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dragon Pole 331b58.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dragon Pole 331b58.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 49361a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 49361a.yaml index 76a1ad093..665a02514 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 49361a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin (Taboo) 49361a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml index f63b30370..ad5ab8edb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing Thin 6d9881.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2779': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 438cca.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 438cca.yaml index 47de6c231..1ce6dc2ab 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 438cca.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawing the Sign 438cca.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5806': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml index 4a23c65a2..ef1266318 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Drawn to the Flame a8298f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml index 737f17807..38ff88783 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dread Curse c54d7e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5834': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 1a94ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 1a94ad.yaml index f36437386..649142b4c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 1a94ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dreaded End 1a94ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5878': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600953065965648/5A0D88CCA811A490C2FEF2675A397E1CEE010870/ NumHeight: 4 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml index 579563eed..0dd839447 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) 5f9a10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4478': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml index 3df303483..ca7d67ef9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) e5f9cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4478': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml index fad480ae5..a5df040cf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary (3) ea40f6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4478': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml index 98f7b04e0..f7dd7e46d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Diary b81dcf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3799': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml index 7d725a185..472ef6804 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream Parasite ae16e8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4487': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml index 3b66ac9cf..2d4d73ff2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream-Enhancing Serum 98c5af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3799': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml index 6257c07c1..d9edc39c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dreams of the Deep 13eaf0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4441': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml b/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml index b1ed6bd4a..2fbfaed24 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3711': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml index 3f9d926d4..ec46b924d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck (2) 0c433b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml index 790917457..f7359679b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dumb Luck f0e425.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dyer's Sketches b12d89.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dyer's Sketches b12d89.yaml index a4ab2443e..acc1b7369 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dyer's Sketches b12d89.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dyer's Sketches b12d89.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml index 2fc30d0f1..5758a343a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml index 5316a66e7..1c5be1c1e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (2) e35bc2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml index d02055c9f..c3c0700a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast (3) 14dcc4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml index d88df7b0e..1fc1e58cf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite Blast 97986a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml b/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml index b68f7a20f..861647d23 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Déjà Vu (5) 719a45.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml index 4aade2321..f33a0e6e7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Earl Sawyer f14dce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (1) 1d6d47.yaml b/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (1) 1d6d47.yaml index f9b03e8b0..f5ba18b5f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (1) 1d6d47.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (1) 1d6d47.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (4) 57f037.yaml b/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (4) 57f037.yaml index 120b139a1..5fd894dda 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (4) 57f037.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Earthly Serenity (4) 57f037.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml b/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml index db53524c2..039aea60a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Easy Mark (1) cdbb37.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4407': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml index 2e347d43b..834d89742 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! (2) fc2629.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml index 0f5a121a1..b190e33b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eat lead! a2c7ef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4409': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml index e36be7c8b..a9769b7ec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ectoplasmic Horror 379582.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ectoplasmic Horror 379582.yaml index 6262bf7b9..7eb5b0f07 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ectoplasmic Horror 379582.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ectoplasmic Horror 379582.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml index ca01948f0..16f810906 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eidetic Memory (3) 814ce2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elaborate Distraction (0) d1422e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elaborate Distraction (0) d1422e.yaml new file mode 100644 index 000000000..a11488e89 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Elaborate Distraction (0) d1422e.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94749 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10112\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Trick. Double.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: d1422e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Elaborate Distraction (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml index 1b99cba86..c1a8efc08 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elder Sign Amulet (3) 324e49.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Initiation 223eb2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Initiation 223eb2.yaml index 633f864b1..e82ac1759 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Initiation 223eb2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Initiation 223eb2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml index 852de8f22..c175626aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration (1) e84eff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration 24eb36.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration 24eb36.yaml index bd71d7b03..f05c10077 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration 24eb36.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eldritch Inspiration 24eb36.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5836': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml index 2b600c373..b83332ce3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elina Harper 7e2896.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3698': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elle Rubash (2) 43c3e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elle Rubash (2) 43c3e0.yaml index 11109bd18..323893a21 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elle Rubash (2) 43c3e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elle Rubash (2) 43c3e0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ellsworth's Boots 1c751d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ellsworth's Boots 1c751d.yaml index aad9b7529..167fb692a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ellsworth's Boots 1c751d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ellsworth's Boots 1c751d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 3c046a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 3c046a.yaml index ba5889ad3..eed0f1c33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 3c046a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elusive (Taboo) 3c046a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml b/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml index 92723b648..fafbf5bdf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Embezzled Treasure 8fd043.yaml b/unpacked/Bag All Player Cards 15bb07/Card Embezzled Treasure 8fd043.yaml index 01d65618f..5050325d2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Embezzled Treasure 8fd043.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Embezzled Treasure 8fd043.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml index d4207ccb9..3821e8fdc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Aid 9c46da.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml index dc4dcb469..50e9cc778 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (2) 8948c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml index b6dbc4c5b..efd94323e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache (3) 408cb5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml index 56d6ddce6..f4310667e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Emergency Cache 510c0d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.ttslua index 087ae4f02..d2e8eae7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/EmpiricalHypothesis") -end) __bundle_register("playercards/cards/EmpiricalHypothesis", function(require, _LOADED, __bundle_register, __bundle_modules) -- this helper creates buttons to help the user track which hypothesis has been chosen each round -- (if user forgot to choose one at round start, the old one stays active) @@ -97,7 +94,7 @@ function onLoad(savedData) end -- marks a button as active ----@param index Number Index of the button to mark (starts at 0 from the top) +---@param index number Index of the button to mark (starts at 0 from the top) function selectButton(index) local lastindex = #hypothesisList - 1 for i = 0, lastindex do @@ -383,7 +380,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -616,8 +613,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -627,7 +624,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -641,7 +638,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -649,7 +646,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -660,7 +657,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -668,7 +665,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -676,7 +673,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -684,7 +681,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -692,8 +689,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -701,7 +698,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -709,8 +706,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -729,8 +726,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -738,8 +735,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -747,7 +744,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -758,8 +755,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -767,8 +764,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -776,8 +773,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -785,7 +782,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -793,7 +790,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -803,10 +800,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -814,8 +811,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -823,8 +820,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -848,7 +845,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -856,8 +853,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -869,7 +866,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -894,29 +891,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -941,14 +940,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -961,7 +963,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -996,4 +998,7 @@ do return SearchLib end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/EmpiricalHypothesis") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.yaml index 12f4c2f51..79e8dc032 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml index 74fa1e3ca..6941c0907 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 3d22c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml index 67fecd194..4fe00e3a5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) 4c0f00.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml index 989421a02..2f75f26c9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Empower Self (2) ffe4dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml index a03b16699..9cc7ccb08 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Empty Vessel (4) c0d236.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4489': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchant Weapon (3) 33455f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchant Weapon (3) 33455f.yaml index 738b805ed..c1eb40bbc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchant Weapon (3) 33455f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchant Weapon (3) 33455f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Armor (2) 9509e3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Armor (2) 9509e3.yaml index db380fb9a..8aeb13ec1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Armor (2) 9509e3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Armor (2) 9509e3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5888': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml index c980bcbd3..f7eea4dc7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) 84b918.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2928': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml index 1482c02db..d2bca0520 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade (3) d0de54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2933': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml index 0c14bbf06..ab71e7343 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Blade c7d9b5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2776': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Bow (2) f85d4e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Bow (2) f85d4e.yaml index aac555435..bd8673ed5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Bow (2) f85d4e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Bow (2) f85d4e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull a4775a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull a4775a.yaml index d88c7b7e1..6b238638a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull a4775a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enchanted Skull a4775a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5852': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600953065965648/5A0D88CCA811A490C2FEF2675A397E1CEE010870/ NumHeight: 4 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml index 7f04f6d00..976bf4323 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia (2) f5bcec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml index fe5f7492a..f1211276e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card End of the Road a3d041.yaml b/unpacked/Bag All Player Cards 15bb07/Card End of the Road a3d041.yaml index 5839fd83a..086b3fa18 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card End of the Road a3d041.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card End of the Road a3d041.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml b/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml index 02bc5d654..849903d33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) (Taboo) 389610.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) (Taboo) 389610.yaml index 9b5670fa9..0b682d1aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) (Taboo) 389610.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) (Taboo) 389610.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) be4332.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) be4332.yaml index cb84ae425..5dd849375 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) be4332.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (1) be4332.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) (Taboo) 41c449.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) (Taboo) 41c449.yaml index 79c6a6287..8cd1b540e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) (Taboo) 41c449.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) (Taboo) 41c449.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) d3ad2d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) d3ad2d.yaml index 26edb83d8..513cf5852 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) d3ad2d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eon Chart (4) d3ad2d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Erynn MacAoidh 6abfbc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Erynn MacAoidh 6abfbc.yaml index 29fb24973..80d015460 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Erynn MacAoidh 6abfbc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Erynn MacAoidh 6abfbc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml index 24b0785c1..6069298a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (1) 0ce005.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2932': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml index cc1a9d47b..90f533e12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Atlas (2) 2172e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Esoteric Method (1) 9250e1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Method (1) 9250e1.yaml new file mode 100644 index 000000000..8fa584215 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Esoteric Method (1) 9250e1.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94715 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10055\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 1,\n \"traits\": \"Practiced. Cursed.\",\n \"wildIcons\": 4,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 9250e1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Esoteric Method (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml index a5f5d0f94..155714aa8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Essence of the Dream 6ad46b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3799': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form (2) e58c7b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form (2) e58c7b.yaml new file mode 100644 index 000000000..d7fe7d527 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form (2) e58c7b.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94741 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10100\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: e58c7b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ethereal Form (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml index 82fb1bdae..bf8794d2d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Form db90e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3801': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip (2) 39cb5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip (2) 39cb5b.yaml index 74c3223e2..a8d04ff95 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip (2) 39cb5b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip (2) 39cb5b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip 31539a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip 31539a.yaml index ebc22ec9b..a6a937e95 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip 31539a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Slip 31539a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ethereal Weaving (3) 697efd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Weaving (3) 697efd.yaml new file mode 100644 index 000000000..04c23dcae --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ethereal Weaving (3) 697efd.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94744 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10103\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Spirit. Double.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 697efd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ethereal Weaving (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) (Taboo) 8be540.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) (Taboo) 8be540.yaml index a19281cd5..cd99cea4d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) (Taboo) 8be540.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) (Taboo) 8be540.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml index 6601026c2..712112251 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eucatastrophe (3) eaaee9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3744': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml index d0c477c1d..0161c3927 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Evanescent Ascension 9e763b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Evanescent Ascension 9e763b.yaml new file mode 100644 index 000000000..c5cc6ce0b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Evanescent Ascension 9e763b.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94710 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Morning Star +DragSelectable: true +GMNotes: "{\n \"id\": \"10039\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"traits\": \"Ritual. Pact. Blessed.\",\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 9e763b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Evanescent Ascension +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml index 7186f1e32..508970d92 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (1) bb640d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (4) ac910a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (4) ac910a.yaml index 7a54da930..a79823243 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (4) ac910a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ever Vigilant (4) ac910a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml index 3c80a5c6d..97bb1d42f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Evidence! (1) 3df5fb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml b/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml index 9ec267d86..6aea25182 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Existential Riddle (1) 38a30a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Existential Riddle (1) 38a30a.yaml index 5859cdd9f..4d7de516e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Existential Riddle (1) 38a30a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Existential Riddle (1) 38a30a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expedited Ticket 8fbd1b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expedited Ticket 8fbd1b.yaml index 515924123..3e41697e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Expedited Ticket 8fbd1b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Expedited Ticket 8fbd1b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml index bde7edc6f..0cc4893f0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Expedition Journal 9dc3d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml index bd67dc8eb..d24179379 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Expeditious Retreat (1) ea8324.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4477': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Exploit Weakness b6857b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Exploit Weakness b6857b.yaml index 92fb0336b..04b9e47aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Exploit Weakness b6857b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Exploit Weakness b6857b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Explosive Ward f86c67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Explosive Ward f86c67.yaml index aabde5dca..31efa232f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Explosive Ward f86c67.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Explosive Ward f86c67.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml index 3172be56b..31cd19ca4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (1) 2e93fd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml index d89ce8743..421eae591 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Expose Weakness (3) 77f92c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2622': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml index 74544b06d..232d7421a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research (1) 3dc25c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4478': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml index f78155519..ae7e00e29 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Extensive Research 013446.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml b/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml index c55318dd9..abef361af 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Extra Ammunition (1) f60263.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos (4) f68105.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos (4) f68105.yaml index cee2f2b11..21b006020 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos (4) f68105.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos (4) f68105.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5797': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml index 836cc11eb..899ccad80 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eye of Chaos 9a5782.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eye of the Djinn (2) df182a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eye of the Djinn (2) df182a.yaml index cee70c1eb..bd43e376d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eye of the Djinn (2) df182a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eye of the Djinn (2) df182a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5901': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Eyes of Valusia (4) e7bfbe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Eyes of Valusia (4) e7bfbe.yaml new file mode 100644 index 000000000..75737b8a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Eyes of Valusia (4) e7bfbe.yaml @@ -0,0 +1,59 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94706 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: The Mother's Cunning +DragSelectable: true +GMNotes: "{\n \"id\": \"10035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Relic. Spell.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"10036\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: e7bfbe +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Eyes of Valusia (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ezra Graves efe0dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ezra Graves efe0dd.yaml index 57821cbe6..74aa7071c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ezra Graves efe0dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ezra Graves efe0dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5580': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764609761078/E05F39D952FE0C4E6473E744D64221DD1150F00A/ NumHeight: 4 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fake Credentials (4) 7ebb67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fake Credentials (4) 7ebb67.yaml new file mode 100644 index 000000000..2de46d27e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fake Credentials (4) 7ebb67.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94730 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10082\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Feast of Hemlock Vale\"\n}" +GUID: 7ebb67 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fake Credentials (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml index af160444d..638ffa920 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card False Awakening 3bf831.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4485': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/780749631103449151/FFAADF06C9BF9D1F4F3FE22D45CEBBB15D9B58CF/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml index e14fe36e2..7dfaf21fa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card False Covenant (2) 3442f5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml index bf3440188..f6b0dd610 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Familiar Spirit 971d52.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.ttslua index 74b4f587e..ebf012ebc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.ttslua @@ -41,6 +41,135 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("playercards/cards/FamilyInheritance", function(require, _LOADED, __bundle_register, __bundle_modules) +local playmatApi = require("playermat/PlaymatApi") +local searchLib = require("util/SearchLib") +local tokenManager = require("core/token/TokenManager") + +local clickableResourceCounter = nil +local foundTokens = 0 + +function onLoad() + self.addContextMenuItem("Add 4 resources", function(playerColor) add4(playerColor) end) + self.addContextMenuItem("Take all resources", function(playerColor) takeAll(playerColor) end) + self.addContextMenuItem("Discard all resources", function(playerColor) loseAll(playerColor) end) +end + +function searchSelf() + clickableResourceCounter = nil + foundTokens = 0 + + for _, obj in ipairs(searchLib.onObject(self, "isTileOrToken")) do + local image = obj.getCustomObject().image + if image == "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/" then + foundTokens = foundTokens + math.abs(obj.getQuantity()) + obj.destruct() + elseif obj.getMemo() == "resourceCounter" then + foundTokens = obj.getVar("val") + clickableResourceCounter = obj + return + end + end +end + +function add4(playerColor) + searchSelf() + + local newCount = foundTokens + 4 + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", newCount) + else + if newCount > 12 then + printToColor("Count increased to " .. newCount .. " resources. Spawning clickable counter instead.", playerColor) + tokenManager.spawnResourceCounterToken(self, newCount) + else + tokenManager.spawnTokenGroup(self, "resource", newCount) + end + end +end + +function takeAll(playerColor) + searchSelf() + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + playmatApi.updateCounter(matColor, "ResourceCounter", _, foundTokens) + + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", 0) + end + printToColor("Moved " .. foundTokens .. " resource(s) to " .. matColor .. "'s resource pool.", playerColor) +end + +function loseAll(playerColor) + searchSelf() + + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", 0) + end + printToColor("Discarded " .. foundTokens .. " resource(s).", playerColor) +end +end) __bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) do local guidReferenceApi = require("core/GUIDReferenceApi") @@ -157,12 +286,13 @@ do -- stateIDs for the multi-stated resource tokens local stateTable = { ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 } -- Table of data extracted from the token source bag, keyed by the Memo on each token which @@ -179,8 +309,8 @@ do -- the work once a card has hit an area where it might spawn tokens. It will check to see if -- the card has already spawned, find appropriate data from either the uses metadata or the Data -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 TokenManager.spawnForCard = function(card, extraUses) if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then @@ -195,13 +325,12 @@ do end -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) local optionPanel = optionPanelApi.getOptions() @@ -218,10 +347,10 @@ do -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to + ---@param tokenValue number Value to set the damage/horror to TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) if tokenValue < 1 or tokenValue > 50 then return end @@ -239,11 +368,11 @@ do end -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) -- not checking the max at this point since clue offsets are calculated dynamically if tokenCount < 1 then return end @@ -297,12 +426,12 @@ do end -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned + ---@param callback? function A callback function triggered after the new token is spawned TokenManager.spawnToken = function(position, tokenType, rotation, callback) internal.initTokenTemplates() local loadTokenType = tokenType @@ -336,9 +465,9 @@ do end -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) TokenManager.maybeReplenishCard = function(card, uses, mat) -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) if uses[1].count and uses[1].replenish then @@ -348,13 +477,13 @@ do -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some -- callers. - ---@param card Object Card object to reset the tokens for + ---@param card tts__Object Card object to reset the tokens for TokenManager.resetTokensSpawned = function(card) tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) end -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addPlayerCardData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -363,7 +492,7 @@ do end -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addLocationData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -372,8 +501,8 @@ do end -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise TokenManager.hasLocationData = function(card) internal.initDataHelperData() return internal.getLocationData(card) ~= nil @@ -403,8 +532,8 @@ do -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 internal.spawnTokensFromUses = function(card, extraUses) local uses = internal.getUses(card) @@ -426,7 +555,7 @@ do -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for + ---@param card tts__Object Card to maybe spawn tokens for internal.spawnTokensFromDataHelper = function(card) internal.initDataHelperData() local playerData = internal.getPlayerCardData(card) @@ -440,8 +569,8 @@ do end -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) local token = playerData.tokenType @@ -451,8 +580,8 @@ do end -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnLocationTokensFromDataHelper = function(card, locationData) local clueCount = internal.getClueCountFromData(card, locationData) @@ -491,7 +620,7 @@ do end -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from + ---@param card tts__Object Card to pull the uses from internal.getUses = function(card) local metadata = JSON.decode(card.getGMNotes()) or { } if metadata.type == "Location" then @@ -508,9 +637,9 @@ do end -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at internal.buildClueOffsets = function(card, count) local pos = card.getPosition() local cluePositions = { } @@ -522,9 +651,9 @@ do return cluePositions end - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) internal.replenishTokens = function(card, uses, mat) local cardPos = card.getPosition() @@ -570,6 +699,283 @@ do return TokenManager end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local TokenSpawnTracker = {} @@ -606,6 +1012,9 @@ do return TokenSpawnTracker end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/FamilyInheritance") +end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -619,14 +1028,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -639,7 +1051,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -674,66 +1086,6 @@ do return SearchLib end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -748,60 +1100,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -818,13 +1165,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -844,7 +1191,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -856,351 +1203,4 @@ do return PlayAreaApi end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/FamilyInheritance") -end) -__bundle_register("playercards/cards/FamilyInheritance", function(require, _LOADED, __bundle_register, __bundle_modules) -local playmatApi = require("playermat/PlaymatApi") -local searchLib = require("util/SearchLib") -local tokenManager = require("core/token/TokenManager") - -local clickableResourceCounter = nil -local foundTokens = 0 - -function onLoad() - self.addContextMenuItem("Add 4 resources", function(playerColor) add4(playerColor) end) - self.addContextMenuItem("Take all resources", function(playerColor) takeAll(playerColor) end) - self.addContextMenuItem("Discard all resources", function(playerColor) loseAll(playerColor) end) -end - -function searchSelf() - clickableResourceCounter = nil - foundTokens = 0 - - for _, obj in ipairs(searchLib.onObject(self, "isTileOrToken")) do - local image = obj.getCustomObject().image - if image == "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/" then - foundTokens = foundTokens + math.abs(obj.getQuantity()) - obj.destruct() - elseif obj.getMemo() == "resourceCounter" then - foundTokens = obj.getVar("val") - clickableResourceCounter = obj - return - end - end -end - -function add4(playerColor) - searchSelf() - - local newCount = foundTokens + 4 - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", newCount) - else - if newCount > 12 then - printToColor("Count increased to " .. newCount .. " resources. Spawning clickable counter instead.", playerColor) - tokenManager.spawnResourceCounterToken(self, newCount) - else - tokenManager.spawnTokenGroup(self, "resource", newCount) - end - end -end - -function takeAll(playerColor) - searchSelf() - local matColor = playmatApi.getMatColorByPosition(self.getPosition()) - playmatApi.updateCounter(matColor, "ResourceCounter", _, foundTokens) - - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", 0) - end - printToColor("Moved " .. foundTokens .. " resource(s) to " .. matColor .. "'s resource pool.", playerColor) -end - -function loseAll(playerColor) - searchSelf() - - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", 0) - end - printToColor("Discarded " .. foundTokens .. " resource(s).", playerColor) -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml index 680789afc..aa2061084 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Family Inheritance 394603.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4315': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fang of Tyr'thrha (4) e2dc13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fang of Tyr'thrha (4) e2dc13.yaml index 361dd1c04..94d96843a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fang of Tyr'thrha (4) e2dc13.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fang of Tyr'thrha (4) e2dc13.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml index 53238754e..2b5261bc8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Farsight (4) b4121c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Father Mateo eb96e6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Father Mateo eb96e6.yaml index 69cc601d2..40d0af6f7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Father Mateo eb96e6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Father Mateo eb96e6.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"04004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Believer. Warden.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Forgotten - Age\"\n}" + Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"04013\": 1\n },\n {\n \"04014\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"blessed\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}" GUID: eb96e6 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml index 034e95061..7f982a7dc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Faustian Bargain 17d34b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5866': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.ttslua index 2ad027651..1e672475b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.ttslua @@ -41,6 +41,40 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) __bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local BlessCurseManagerApi = {} @@ -59,35 +93,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -95,128 +135,75 @@ do return BlessCurseManagerApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local ChaosBagApi = {} + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) + -- 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 - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 + 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 }) + + -- filtering the result + 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 end - return GUIDReferenceApi + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -229,6 +216,7 @@ VALID_TOKENS = { SHOW_SINGLE_RELEASE = true KEEP_OPEN = true +RESOLVE_TOKEN = true require("playercards/CardsThatSealTokens") end) @@ -310,6 +298,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -336,6 +326,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -497,39 +496,425 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } end end - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 end - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end end - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end end - return TokenArrangerApi + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.yaml b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.yaml index 5c06a3f57..28ab65d72 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.ttslua index cca3f2310..0d0ab674b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.ttslua @@ -41,197 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/FavoroftheSun1") -end) -__bundle_register("playercards/cards/FavoroftheSun1", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Bless"] = true -} - -SHOW_SINGLE_RELEASE = true -KEEP_OPEN = true - -require("playercards/CardsThatSealTokens") -end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -310,6 +119,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -336,6 +147,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -497,6 +317,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -504,8 +336,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -514,7 +346,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -532,4 +364,557 @@ do return TokenArrangerApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/FavoroftheSun1") +end) +__bundle_register("playercards/cards/FavoroftheSun1", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Bless"] = true +} + +SHOW_SINGLE_RELEASE = true +KEEP_OPEN = true +RESOLVE_TOKEN = true + +require("playercards/CardsThatSealTokens") +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.yaml b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.yaml index bb52c7813..119c577b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml index d11476b55..ca5583412 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fearless (2) b2e27e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml index 11711afde..a043eff8d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml index 59f45ef59..450978aab 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind (3) bc4788.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2622': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml index 6cd4b5762..bd8048530 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Feed the Mind a614de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml index 69368f953..a8a07e6a7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fence (1) 2423e7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fend Off (3) 0c2449.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fend Off (3) 0c2449.yaml index f81a49c42..f16c9ee26 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fend Off (3) 0c2449.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fend Off (3) 0c2449.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fey (1) f10690.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fey (1) f10690.yaml index 19075f28a..445e75628 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fey (1) f10690.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fey (1) f10690.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5794': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fickle Fortune (3) 1b4684.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fickle Fortune (3) 1b4684.yaml index 7a7fe4f37..4471fc419 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fickle Fortune (3) 1b4684.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fickle Fortune (3) 1b4684.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Field Agent (2) babfb6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Field Agent (2) babfb6.yaml index 79346f472..464e605aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Field Agent (2) babfb6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Field Agent (2) babfb6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml index 5a46ae6fd..c1900ad9b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml index 45b966df2..6624c1480 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fight or Flight 00af4f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fighting Lessons fc2432.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fighting Lessons fc2432.yaml index aaf313657..23d95a0c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fighting Lessons fc2432.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fighting Lessons fc2432.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml index 9282d044f..681fd56ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 2c901b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3720': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 561775.yaml b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 561775.yaml index 657731a9c..01bad3164 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 561775.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Final Rhapsody 561775.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8470': BackIsHidden: false - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2149964195986880793/517FBB4FF8F72900B9E123DB865BCAD625F6506C/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml index a375b649f..5e066e5bc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Clothes 5cb973.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml index ece526fa8..e51b8a628 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Print 39452d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml index 17bf185a9..48fabe1be 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '25': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447674651244793/501B12FC5970ACC35866C564F2AF1635D23377CD/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit (4) 33b09e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit (4) 33b09e.yaml index 03b67a7b7..e4fc08381 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit (4) 33b09e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit (4) 33b09e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml index fa7b732be..578ebe771 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit b9bb2a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4308': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml index d6d4f07ff..cf814e229 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml @@ -21,7 +21,18 @@ Description: The Bootlegger DragSelectable: true GMNotes: "{\n \"id\": \"04003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"04010\": 1\n },\n {\n \"04011\": + 1\n },\n {\n \"04012\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"trait\": [\n \"illicit\"\n ],\n \"level\": {\n + \ \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": + [\n \"rogue\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"faction\": [\n \"seeker\",\n \"survivor\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": + \"You cannot have more than 5 Seeker and/or Survivor cards\"\n }\n ]\n}" GUID: dd40c0 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml index 4876d4bb8..786c73f51 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Finn's Trusty .38 848d9c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3767': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Axe (2) 326ec3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe (2) 326ec3.yaml new file mode 100644 index 000000000..cdb55305d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe (2) 326ec3.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94750 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10120\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 2,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 326ec3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fire Axe (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml index ff52ef854..3c18bf40e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Axe 9da37c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml index acc793daf..b647b3e5d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (1) 8a4673.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (3) fb019d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (3) fb019d.yaml index 13a339806..1053be895 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (3) fb019d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fire Extinguisher (3) fb019d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) 3c7eb1.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) 3c7eb1.yaml index aeb1e5738..94d0f7ae2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) 3c7eb1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) 3c7eb1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml index 2df243f27..b13482e15 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid (3) bc80ab.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid 56b8ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid 56b8ad.yaml index a9b74263a..7a39f0089 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card First Aid 56b8ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid 56b8ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml index 5d3362af7..62c7e51b1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card First Aid 5cd622.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml b/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml index f6c6cecec..28d5affad 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card First Watch 0bb3da.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml index 5cfed161a..3da23defa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fishing Net c7b748.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '75': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml index 786232386..3552bef1d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Five of Pentacles (1) 46187b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2746': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 62ceb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 62ceb5.yaml index 91904eebe..7773bf9b0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 62ceb5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) (Taboo) 62ceb5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml index abf830cd6..635dd4296 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flamethrower (5) cf4f15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3140': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml index 24ca70b5b..3f841cef2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flare (1) 017821.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flashlight (3) 2b3301.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flashlight (3) 2b3301.yaml index 8c0d579fe..9b333c0c8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flashlight (3) 2b3301.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flashlight (3) 2b3301.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml index d46ff226e..ff343af52 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml index 43e423eaa..e1b800e0e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flesh Ward 52c686.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flurry of Blows (5) 9e7bc8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flurry of Blows (5) 9e7bc8.yaml new file mode 100644 index 000000000..c439a29ec --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Flurry of Blows (5) 9e7bc8.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94708 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10037\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Tactic. Double. Fated.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 9e7bc8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Flurry of Blows (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.ttslua index 9d4e129af..34a9d6ccc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.ttslua @@ -41,6 +41,167 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/FluteoftheOuterGods4") +end) __bundle_register("playercards/cards/FluteoftheOuterGods4", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Curse"] = true @@ -129,6 +290,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -155,6 +318,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -316,6 +488,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -323,8 +507,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -333,7 +517,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -369,35 +553,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -405,88 +595,6 @@ do return BlessCurseManagerApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -495,29 +603,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -529,7 +639,281 @@ do return GUIDReferenceApi end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/FluteoftheOuterGods4") +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.yaml index bebb941f7..225136a3f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) (Taboo) 453fd1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.ttslua index 1bbec6962..1ec848cf8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.ttslua @@ -41,6 +41,592 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/FluteoftheOuterGods4") +end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("playercards/cards/FluteoftheOuterGods4", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Curse"] = true +} + +SHOW_SINGLE_RELEASE = true +KEEP_OPEN = true + +require("playercards/CardsThatSealTokens") +end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -119,6 +705,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -145,6 +733,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -306,230 +903,17 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/FluteoftheOuterGods4") -end) -__bundle_register("playercards/cards/FluteoftheOuterGods4", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Curse"] = true -} - -SHOW_SINGLE_RELEASE = true -KEEP_OPEN = true - -require("playercards/CardsThatSealTokens") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.yaml index dcee023e2..4ee123ad2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flute of the Outer Gods (4) 3cc1e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml index 222b6ffe8..ab9f11936 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml index ab5167cc0..f001234ed 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fool me once... (1) b6506d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml index 685605b80..538fcc744 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2305': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml index 02554d3b3..2c273f1f3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Knowledge 80acd2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml index 16804895b..bc1371df9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) 2f4507.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml index ea02f96fa..4edff6c4a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome (3) f375bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml index bf2a01247..43ad1cd95 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forbidden Tome 0a4d22.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forced Learning fa06f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forced Learning fa06f9.yaml index 290bebf97..edce674a3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forced Learning fa06f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forced Learning fa06f9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Foresight (1) c09a15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Foresight (1) c09a15.yaml index 582176002..a7e4a9e27 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Foresight (1) c09a15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Foresight (1) c09a15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml index 5ef5d6f7d..638a331d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Forewarned (1) c17f2c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml index 93ccb01f5..d3b6a7483 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fortuitous Discovery dacbf0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml index 85681cccf..e010b7fc7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fortune or Fate (2) e674e8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2930': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Foundation Intel a72f6f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Foundation Intel a72f6f.yaml index f8a33e572..5a3c5c5cb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Foundation Intel a72f6f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Foundation Intel a72f6f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml index 65243bc25..3a0c61824 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Four of Cups (1) dd4e2a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4309': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Friends in Low Places c332af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Friends in Low Places c332af.yaml index c48357420..5f0e2f0e5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Friends in Low Places c332af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Friends in Low Places c332af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml b/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml index 0b86a2c64..31e2d395c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gabriel Carillo (1) 7e1088.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gabriel Carillo (1) 7e1088.yaml new file mode 100644 index 000000000..59c75a8d1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Gabriel Carillo (1) 7e1088.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94713 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Trusted Confidante +DragSelectable: true +GMNotes: "{\n \"id\": \"10052\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 1,\n \"traits\": \"Ally. + Scholar. Cursed.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 7e1088 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Gabriel Carillo (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml index f5147b1f5..1766b2baf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Galvanize (1) 9e7f6a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gang Up (1) 09cc35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gang Up (1) 09cc35.yaml index 140a3d83a..987a9a3f7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gang Up (1) 09cc35.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gang Up (1) 09cc35.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml b/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml index f01cf383a..cc710d72c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Garrote Wire (2) b45c82.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4490': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml index f0a71181e..983592e19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gate Box b8c891.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5825': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml index 5ba26f74d..4424c0268 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gavriella Mizrah 2237f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gaze of Ouraxsh (2) b7c316.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gaze of Ouraxsh (2) b7c316.yaml index 4b298bf98..bc0f83564 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gaze of Ouraxsh (2) b7c316.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gaze of Ouraxsh (2) b7c316.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Geared Up (Taboo) 83af5e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Geared Up (Taboo) 83af5e.yaml index 016dee0f7..2c19ccd13 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Geared Up (Taboo) 83af5e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Geared Up (Taboo) 83af5e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Geared Up 028cf7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Geared Up 028cf7.yaml index 4de46fa13..652cedce8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Geared Up 028cf7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Geared Up 028cf7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Geas (2) b7223c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Geas (2) b7223c.yaml index b4b28b9dd..61e3d3529 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Geas (2) b7223c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Geas (2) b7223c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) (Taboo) d300bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) (Taboo) d300bf.yaml index 3dbba17b6..80b4da1bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) (Taboo) d300bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) (Taboo) d300bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) 255aa3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) 255aa3.yaml index c597aac06..085292436 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) 255aa3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gené Beauregard (3) 255aa3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Get behind me! 76270e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Get behind me! 76270e.yaml index 76d864e1e..ec21fe37f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Get behind me! 76270e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Get behind me! 76270e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml index 10f3af895..0f0a1646f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Get over here! (2) 415ca2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml b/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml index d1a66b6f9..41765581a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Get over here! 5b0f86.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ghastly Possession (1) 63282f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Possession (1) 63282f.yaml index 9817ad73c..0b0b31c01 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ghastly Possession (1) 63282f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Possession (1) 63282f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml index c8ccbc7e1..fa39715fa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ghastly Revelation b7c503.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5923': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml index 82734d605..2632dc267 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gilded Volto d0e108.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2956': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Girish Kadakia (4) bdd70d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Girish Kadakia (4) bdd70d.yaml index a7e7ae0cc..af21cc9bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Girish Kadakia (4) bdd70d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Girish Kadakia (4) bdd70d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml index e2d1fb50d..cbf8f71ff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (1) 6e4d54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml index 7cf0e07ce..5a5f46dea 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Glimpse the Unthinkable (5) 090fcf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5919': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gloria Goldberg 571596.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gloria Goldberg 571596.yaml index ce1c759b6..81f91e778 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gloria Goldberg 571596.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gloria Goldberg 571596.yaml @@ -21,7 +21,21 @@ Description: The Writer DragSelectable: true GMNotes: "{\n \"id\": \"98019\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Clairvoyant.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": - 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Promo\"\n}" + 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Promo\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"98020\": 3\n },\n {\n \"98021\": 3\n }\n + \ ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"choiceName\": \"Guardian\",\n \"faction_select\": + [\n \"guardian\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n + \ \"limit\": 10\n },\n {\n \"choiceName\": \"Seeker\",\n \"faction_select\": + [\n \"seeker\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n + \ \"limit\": 10\n },\n {\n \"choiceName\": \"Rogue\",\n \"faction_select\": + [\n \"rogue\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n ],\n + \ \"limit\": 10\n }\n ]\n}" GUID: '571596' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml b/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml index 41696358e..d3608a772 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml index d6a667fdf..249e31da6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne (3) 52a66f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml index b96c8b914..fa4d5c950 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Granny Orne 1cccfe.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grappling Hook 09f1a2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grappling Hook 09f1a2.yaml index 68f9dc7e0..c04206d5b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grappling Hook 09f1a2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grappling Hook 09f1a2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml index 9a451e5e6..72269f427 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel (2) 96a440.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml index 8d3935522..6bd614b4b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gravedigger's Shovel 3fe6de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml index 0ff541ed8..8b9cc4ccd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Graveyard Ghouls 80b7c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3738': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gray's Anatomy (5) f4e7f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gray's Anatomy (5) f4e7f3.yaml index 7c19ad6c5..585e38c89 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gray's Anatomy (5) f4e7f3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gray's Anatomy (5) f4e7f3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml index 3d46173c4..c1c914b9b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml b/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml index 0766a6346..d5e99cb72 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Green Man Medallion c729ab.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3715': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Green Soapstone d36d80.yaml b/unpacked/Bag All Player Cards 15bb07/Card Green Soapstone d36d80.yaml index 21badb325..9ff3aa923 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Green Soapstone d36d80.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Green Soapstone d36d80.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml index d5e2eb98e..dd3ee4453 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gregory Gry 90bf93.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml index 9274fdd72..fbdc4e61d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner (3) b39b78.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml index bee881bb3..415fc4fe4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grete Wagner f6dfe5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grievous Wound d7c63c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grievous Wound d7c63c.yaml index 86def5a29..cdb6f2a0a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grievous Wound d7c63c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grievous Wound d7c63c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grim Memoir d1f1d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grim Memoir d1f1d9.yaml index bb8b5fa6a..58b3841d4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grim Memoir d1f1d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grim Memoir d1f1d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml index b0e747082..4ed82e52b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grimm's Fairy Tales 1d75d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml index 335c72bde..2df6521e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 1433eb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2932': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml index 931123ba9..c3f235478 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem (3) 5fae20.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2930': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml index d674dbf9c..cc1b4ce19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grisly Totem a20887.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2776': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml index 2838da68b..206f72cf7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grit Your Teeth a92a90.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml index 254a7be4d..5016ceb36 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml index c827f5823..f62ccf25b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (2) 6b2e97.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml index b7c16a0f6..eefd1bf07 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grotesque Statue (4) 07bc04.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml index 9c1d2f096..c9f2a37d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grounded (1) 98fc57.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Grounded (3) edb064.yaml b/unpacked/Bag All Player Cards 15bb07/Card Grounded (3) edb064.yaml index 30979b2c8..c56fa986f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grounded (3) edb064.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grounded (3) edb064.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog (2) 9009db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog (2) 9009db.yaml index cc6348724..4afad1788 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog (2) 9009db.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog (2) 9009db.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 001ae8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 001ae8.yaml index 1f20ee593..545034d48 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 001ae8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 001ae8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml index 6841d3650..0ef869ac0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guard Dog 08bdf1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml index 61f2d715d..288268397 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guardian Angel 3c0249.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5805': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml index 1ea8bbf82..52f620eaa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guardian of the Crystallizer aec357.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4407': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guidance (1) 425841.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guidance (1) 425841.yaml index 1233beb23..8728dbf57 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guidance (1) 425841.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guidance (1) 425841.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml index e0d5bf90a..f88fa6f04 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guided by the Unseen (3) 477e79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guided by the Unseen (3) 477e79.yaml index a7bb12376..015be59a9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guided by the Unseen (3) 477e79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guided by the Unseen (3) 477e79.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5907': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) 9375f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) 9375f4.yaml index 379c898f6..82378e7f4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) 9375f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guiding Spirit (1) 9375f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5884': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Gumption (1) 4cb0c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Gumption (1) 4cb0c9.yaml index a56182711..6d02e19f9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Gumption (1) 4cb0c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Gumption (1) 4cb0c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml index b8e9a593f..57d1815bc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guts (2) 219c78.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml b/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml index d2dea0260..47c93a153 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) (Taboo) 175810.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) (Taboo) 175810.yaml index 69fa6a31b..59cdf1093 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) (Taboo) 175810.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) (Taboo) 175810.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) e40802.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) e40802.yaml index 722b9d38b..738352f75 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) e40802.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallow (3) e40802.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5891': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Chalice 3fa5b8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Chalice 3fa5b8.yaml index 9a15cb69d..4c6269bac 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Chalice 3fa5b8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Chalice 3fa5b8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror (3) 78858f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror (3) 78858f.yaml index a7026fca2..66b8b7253 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror (3) 78858f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror (3) 78858f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml index 0191d3035..b3d9ae720 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hallowed Mirror 312d38.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3786': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml index 60e86b884..b0fe8df28 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hand of Fate 1ad931.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5883': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml index e6b067bf8..5d433fd15 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '21': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279446315725170600/22FCF4406C090610E507C757FAEECC820E7F1E23/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs (2) 07c480.yaml b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs (2) 07c480.yaml index ab7b6f78a..8c5922b2d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs (2) 07c480.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs (2) 07c480.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml index d89de96f6..97f667ea0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3133': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml index 3869b67d0..e493c81f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (2) 15643b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (4) 9565f0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (4) 9565f0.yaml index eb8bafbbd..2c43cb788 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (4) 9565f0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks (4) 9565f0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 132069.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 132069.yaml index de2c47e32..67df33615 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 132069.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 132069.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml index 92fa1b5e5..dc6ff72c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Knocks 68744b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hard Times 876557.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hard Times 876557.yaml index 63078e9be..d0bd09b85 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hard Times 876557.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hard Times 876557.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3811': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021604542994812442/CC009EA96D868F7ED096DF8877B0416EE12A6D14/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Harmony Restored (2) 7885cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Harmony Restored (2) 7885cf.yaml index b5e26cabe..b83b3170f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Harmony Restored (2) 7885cf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Harmony Restored (2) 7885cf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Harvey Walters 1fa944.yaml b/unpacked/Bag All Player Cards 15bb07/Card Harvey Walters 1fa944.yaml index 36af8beb9..5c5a32d41 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Harvey Walters 1fa944.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Harvey Walters 1fa944.yaml @@ -21,7 +21,12 @@ Description: The Professor DragSelectable: true GMNotes: "{\n \"id\": \"60201\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" + 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"60202\": 1\n },\n {\n \"60203\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n }\n ]\n}" GUID: 1fa944 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml b/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml index 6107731e8..6174eb3ea 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Haste (2) 1bd139.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4476': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hasty Repairs 0821d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hasty Repairs 0821d5.yaml index 95828a9f2..295029829 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hasty Repairs 0821d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hasty Repairs 0821d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '9103': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2223150865961116492/B9D47B63A4285734AC59208BA2F5509EF4B8C138/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml index 1a842aa07..04e81bc6d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hatchet Man 857238.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2617': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml b/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml index cec522d44..fff0a2de5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml index ea73caefe..838d56db6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hawk-Eye Folding Camera 5ada0a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2778': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Headdress of Y'ha-nthlei e44c96.yaml b/unpacked/Bag All Player Cards 15bb07/Card Headdress of Y'ha-nthlei e44c96.yaml index daeb5677f..b9d3a8d4b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Headdress of Y'ha-nthlei e44c96.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Headdress of Y'ha-nthlei e44c96.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4511': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Healing Words (3) f2726b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Healing Words (3) f2726b.yaml index 1448aac06..cb4fa9a82 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Healing Words (3) f2726b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Healing Words (3) f2726b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml index e72a39ff0..464bd62b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Healing Words bba97a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3801': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heavy Furs 275450.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heavy Furs 275450.yaml index 7ea510bab..e046f800c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heavy Furs 275450.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heavy Furs 275450.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heed the Dream (2) 3b7419.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heed the Dream (2) 3b7419.yaml index 98f45bddb..9e1a6e4fc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heed the Dream (2) 3b7419.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heed the Dream (2) 3b7419.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml index f168bf439..0d2bf31e0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea bf151d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5854': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655599785038865190/8B0106D5599808B6E00387C2535AC1C3F2330034/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea e929f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea e929f9.yaml index 486bd1830..ab5db63d6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea e929f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heirloom of Hyperborea e929f9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2904': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Helping Hand 7d93b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Helping Hand 7d93b4.yaml index 0943c410b..c8ea31eb4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Helping Hand 7d93b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Helping Hand 7d93b4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml index 470d99922..8d92778e7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hemispheric Map (3) d2663c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2611': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml b/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml index f24813b26..1efbdb86b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Henry Wan 9df9df.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2777': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml index 1618392c7..4420c6b30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue (2) 93381d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4479': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml index fbe7fb146..90cb03faa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Heroic Rescue bb0f6a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hidden Pocket 9bef61.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hidden Pocket 9bef61.yaml index d5409c568..38cb4dbec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hidden Pocket 9bef61.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hidden Pocket 9bef61.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml index c29547ad0..a3daa0433 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hiding Spot dd130e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml b/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml index 55cc84eb9..0793f191f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card High Roller (2) ce1b89.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml index 0fef297fc..bb71c3dfe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Higher Education (3) d48b25.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml index 251b3cfcd..564f641b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Higher Education 8595fb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hiking Boots (1) b03e83.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hiking Boots (1) b03e83.yaml index c6e98f85a..a084b9fd2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hiking Boots (1) b03e83.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hiking Boots (1) b03e83.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml index 7b8c9d28a..aa87486eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hired Muscle (1) cdd6aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hit and Run 408bce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hit and Run 408bce.yaml index 646f7bebe..bfdc774fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hit and Run 408bce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hit and Run 408bce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hit me! 431c15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hit me! 431c15.yaml index 02cbb801c..765c86d49 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hit me! 431c15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hit me! 431c15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary (2) 2d2246.yaml b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary (2) 2d2246.yaml index cea6a84dd..361f9ad24 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary (2) 2d2246.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary (2) 2d2246.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5793': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml index 1772c99e8..b261c6726 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Holy Rosary fa1d67.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.ttslua index 8d91ee556..938c7ed36 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.ttslua @@ -41,142 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -185,29 +49,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -219,19 +85,286 @@ do return GUIDReferenceApi end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/HolySpear5") end) -__bundle_register("playercards/cards/HolySpear5", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Bless"] = true -} - -SHOW_SINGLE_RELEASE = true -SHOW_MULTI_SEAL = 2 - -require("playercards/CardsThatSealTokens") -end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -310,6 +443,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -336,6 +471,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -497,6 +641,159 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("playercards/cards/HolySpear5", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Bless"] = true +} + +SHOW_SINGLE_RELEASE = true +SHOW_MULTI_SEAL = 2 + +require("playercards/CardsThatSealTokens") end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -504,8 +801,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -514,7 +811,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -532,4 +829,91 @@ do return TokenArrangerApi end end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.yaml index 952dc65ba..0bcf1214b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5900': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Honed Instinct 1cde62.yaml b/unpacked/Bag All Player Cards 15bb07/Card Honed Instinct 1cde62.yaml index e576d83e7..805d12b06 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Honed Instinct 1cde62.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Honed Instinct 1cde62.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml index 51136ecc7..5546af88c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3788': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml index 362c48918..685b957db 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml index 4b2be40a1..fcb26a131 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hospital Debts 47d6c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4314': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml index d80cc2967..a3e7b7f1e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (2) f2508d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml index ed2b9e285..65b9fd8fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hot Streak (4) 4eb231.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hunter's Armor a85f1d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hunter's Armor a85f1d.yaml index 631505812..8c8a97952 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hunter's Armor a85f1d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hunter's Armor a85f1d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hunting Jacket (2) 5355fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hunting Jacket (2) 5355fa.yaml new file mode 100644 index 000000000..be09339fc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hunting Jacket (2) 5355fa.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94751 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10121\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Clothing.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 5355fa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hunting Jacket (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml index 5e9448a9e..f4baba7cf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (2) 23c3e5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (4) 78adda.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (4) 78adda.yaml index 57003c43a..e4a5e970e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (4) 78adda.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness (4) 78adda.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml index 9cff9de01..a04fc7d94 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hyperphysical Shotcaster 2a6e0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hyperphysical Shotcaster 2a6e0d.yaml index 2c1320b9c..8e8256544 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hyperphysical Shotcaster 2a6e0d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperphysical Shotcaster 2a6e0d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml index b9e938790..a20c0dea4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (2) e2bc49.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (Taboo) 47d782.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (Taboo) 47d782.yaml index 8f5db4eb8..18b4a227a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (Taboo) 47d782.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze (Taboo) 47d782.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml index 502fa76ce..462e81555 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Gaze 8f3c8e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml index f08ddbc4c..3729b79cf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypnotic Therapy 7f1b48.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5917': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml index 8df0049e6..2184628e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml index 81951e206..f06b6e347 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I'll see you in hell! 84ba9d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'll take that! 691652.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'll take that! 691652.yaml index 66a7b8122..761577993 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I'll take that! 691652.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I'll take that! 691652.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml index 85557f271..5b256b2ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I'm done runnin'! d8a324.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3787': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml b/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml index 960afc0b5..09c73f1d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I'm outta here! 62cf25.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml index d18f9b916..4038242cd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! (2) 344e90.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml index 1bdbf1645..fa45c85be 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I've got a plan! acd0da.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've had worse (4) 3b6834.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've had worse (4) 3b6834.yaml index f6589e14e..7759721d4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I've had worse (4) 3b6834.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I've had worse (4) 3b6834.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card I've had worse... (2) 76147b.yaml b/unpacked/Bag All Player Cards 15bb07/Card I've had worse... (2) 76147b.yaml index 48ae6816d..97b6a939f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card I've had worse... (2) 76147b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card I've had worse... (2) 76147b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3786': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (1) 8b065c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (1) 8b065c.yaml index 23e17d35d..a950a3c64 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (1) 8b065c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (1) 8b065c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (3) 70f9f7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (3) 70f9f7.yaml index b878db798..92ff79c7a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (3) 70f9f7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ice Pick (3) 70f9f7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml index 6aca83a28..332f0d732 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Idol of Xanatos 8f6f39.yaml b/unpacked/Bag All Player Cards 15bb07/Card Idol of Xanatos 8f6f39.yaml index bc71cb632..d2872c3de 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Idol of Xanatos 8f6f39.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Idol of Xanatos 8f6f39.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml index 1dfa99783..d23228f6b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ikiaq (3) 9d7d4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ikiaq (3) 9d7d4a.yaml index 8f95a3242..0db35921d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ikiaq (3) 9d7d4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ikiaq (3) 9d7d4a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml index 990c0648c..4e417b49f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Impromptu Barrier 9591ac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4305': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml index 1df399eb3..9b5c73dc9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3748': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvised Shield 616c43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvised Shield 616c43.yaml index cc8f7ef19..8a6513a16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Improvised Shield 616c43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvised Shield 616c43.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml index 7d5085fc4..520b49dc2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvised Weapon 30f90b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml b/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml index 71040bbaf..6bbbf28c2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card In the Know (1) 7b42b6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml index 6f7cd2d3e..70a3561fa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card In the Shadows 2561b9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5829': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card In the Thick of It bdd102.yaml b/unpacked/Bag All Player Cards 15bb07/Card In the Thick of It bdd102.yaml index 25f803f70..76bc0c05c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card In the Thick of It bdd102.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card In the Thick of It bdd102.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml index 0e55f6635..99f52f23c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4312': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml index a8da7b6bd..e655a73b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (3) 943332.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml index e27e17fb4..8fec0c807 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth (5) f00301.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml index 2639f2286..5b0ca9a81 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ineffable Truth c6caf6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml index 791de7148..b03477acf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Infighting (3) c803ba.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml index c7027e203..77418eea4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Inquiring Mind 5c3aea.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Inspector Flint 8247a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Inspector Flint 8247a5.yaml index 75f14f508..76365f947 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Inspector Flint 8247a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Inspector Flint 8247a5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml index 7106e5ab9..880c5adc1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Inspiring Presence 80628f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml index e40999fe0..c6966114f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Intel Report 5115d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2777': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml b/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml index 17a38a202..f4f35449a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Internal Injury 4fb446.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4312': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Interrogate (Taboo) a6726e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Interrogate (Taboo) a6726e.yaml index 64846e734..1541c6f68 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Interrogate (Taboo) a6726e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Interrogate (Taboo) a6726e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml index e42ae36f3..7023774a9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4310': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml b/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml index 6a7166214..be79f1ddf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml b/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml index b4f11f254..b7132671e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2929': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Isamara Ordoñez 860cd7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Isamara Ordoñez 860cd7.yaml index c69e27113..088654aa8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Isamara Ordoñez 860cd7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Isamara Ordoñez 860cd7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5509': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1874087305860138601/7094CA9FD63C5320D7AD2F3142B30DE5221A2657/ NumHeight: 6 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jacob Morrison (3) aa38d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jacob Morrison (3) aa38d0.yaml index 3f961b539..479ff3279 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jacob Morrison (3) aa38d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jacob Morrison (3) aa38d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5898': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jacqueline Fine a2cd75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jacqueline Fine a2cd75.yaml index 92a568f75..587f1f8a3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jacqueline Fine a2cd75.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jacqueline Fine a2cd75.yaml @@ -21,7 +21,12 @@ Description: The Psychic DragSelectable: true GMNotes: "{\n \"id\": \"60401\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Clairvoyant.\",\n \"willpowerIcons\": 5,\n \"intellectIcons\": - 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" + 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"60402\": 1\n },\n {\n \"60403\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n }\n ]\n}" GUID: a2cd75 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml index 5e6298594..b3e06a4b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jake Williams 7c958e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3773': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 9058d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 9058d3.yaml index 53ebb10b8..f908ed9c5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 9058d3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 9058d3.yaml @@ -22,7 +22,14 @@ DragSelectable: true GMNotes: "{\n \"id\": \"02003\",\n \"alternate_ids\": [\n \"98001\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": - \"The Dunwich Legacy\"\n}" + \"The Dunwich Legacy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"98002\": 1,\n \"02010\": 1\n + \ },\n {\n \"98003\": 1,\n \"02011\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n + \ \"limit\": 5,\n \"error\": \"You cannot have more than 5 cards that are + not Rogue or Neutral\"\n }\n ]\n}" GUID: 9058d3 Grid: true GridProjection: false @@ -61,10 +68,18 @@ States: UniqueBack: true Description: The Dilettante DragSelectable: true - GMNotes: "{\r\n \"id\": \"02003\",\r\n \"alternate_ids\": [\r\n \"98001\"\r\n - \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Rogue\",\r\n \"traits\": - \"Drifter.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": - 3,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" + GMNotes: "{\n \"id\": \"02003\",\n \"alternate_ids\": [\n \"98001\"\n ],\n + \ \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Drifter.\",\n + \ \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n \"combatIcons\": 3,\n + \ \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"98002\": 1,\n \"02010\": 1\n },\n {\n + \ \"98003\": 1,\n \"02011\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n + \ {\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n + \ \"limit\": 5,\n \"error\": \"You cannot have more than 5 cards that + are not Rogue or Neutral\"\n }\n ]\n}\n" GUID: b954f6 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml index 6a58d1e0f..2dd343097 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jenny's Twin .45s d87128.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3713': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby (Taboo) a03cd7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby (Taboo) a03cd7.yaml index eadbf59ba..d281d16f7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby (Taboo) a03cd7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby (Taboo) a03cd7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby 98e5f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby 98e5f5.yaml index a0a1c30dc..607b6cb84 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby 98e5f5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jeremiah Kirby 98e5f5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml index a1ce590a9..33299b27c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jerome Davids d99735.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml index 476e48042..2abe82321 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jessica Hyde (1) b8380d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3802': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) (Taboo) 5f4d1c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) (Taboo) 5f4d1c.yaml index 599457256..8dd7424ec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) (Taboo) 5f4d1c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) (Taboo) 5f4d1c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml index 77a05b0bb..f8f9f836f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jewel of Aureolus (3) 6bae15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Back) aba863.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Back) aba863.yaml index b6e0a1f5e..2fa59c659 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Back) aba863.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Back) aba863.yaml @@ -21,7 +21,22 @@ Description: The Musician DragSelectable: true GMNotes: "{\n \"id\": \"02004-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Performer.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 39,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90050\": 1,\n \"02012\": 1\n + \ },\n {\n \"90051\": 1,\n \"02013\": 1\n },\n {\n + \ \"90052\": 1\n },\n {\n \"90053\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"mystic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"faction\": + [\n \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + Survivor cards\"\n },\n {\n \"trait\": [\n \"spell\",\n \"cursed\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 4\n }\n + \ },\n {\n \"trait\": [\n \"ally\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n },\n \"limit\": 9,\n \"error\": + \"You must have exactly 9 Ally cards\"\n }\n ]\n}" GUID: aba863 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Front) c5fc80.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Front) c5fc80.yaml index a403a3ee6..daf6430e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Front) c5fc80.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel Front) c5fc80.yaml @@ -21,7 +21,15 @@ Description: The Musician DragSelectable: true GMNotes: "{\n \"id\": \"02004-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Performer. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90050\": 1,\n \"02012\": 1\n + \ },\n {\n \"90051\": 1,\n \"02013\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Mystic or Neutral\"\n }\n ]\n}" GUID: c5fc80 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel) 72bf31.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel) 72bf31.yaml index 2fb477150..c5996597d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel) 72bf31.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver (Parallel) 72bf31.yaml @@ -21,7 +21,22 @@ Description: The Musician DragSelectable: true GMNotes: "{\n \"id\": \"02004-p\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Performer. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 39,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90050\": 1,\n \"02012\": 1\n + \ },\n {\n \"90051\": 1,\n \"02013\": 1\n },\n {\n + \ \"90052\": 1\n },\n {\n \"90053\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"mystic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"faction\": + [\n \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + Survivor cards\"\n },\n {\n \"trait\": [\n \"spell\",\n \"cursed\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 4\n }\n + \ },\n {\n \"trait\": [\n \"ally\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n },\n \"limit\": 9,\n \"error\": + \"You must have exactly 9 Ally cards\"\n }\n ]\n}" GUID: 72bf31 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver ca079b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver ca079b.yaml index 1e0a3e782..204abfb45 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim Culver ca079b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim Culver ca079b.yaml @@ -21,7 +21,15 @@ Description: The Musician DragSelectable: true GMNotes: "{\n \"id\": \"02004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Performer.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 3,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90050\": 1,\n \"02012\": 1\n + \ },\n {\n \"90051\": 1,\n \"02013\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Mystic or Neutral\"\n }\n ]\n}" GUID: ca079b Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml index 1c833738b..8c8d3b81f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 03c6a7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3721': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 7dfd5f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 7dfd5f.yaml index bed1b465c..47c845c29 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 7dfd5f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jim's Trumpet 7dfd5f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8470': BackIsHidden: false - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2149964195986880793/517FBB4FF8F72900B9E123DB865BCAD625F6506C/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Joe Diamond 6dc626.yaml b/unpacked/Bag All Player Cards 15bb07/Card Joe Diamond 6dc626.yaml index 12c1e9e62..3035bd2ec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Joe Diamond 6dc626.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Joe Diamond 6dc626.yaml @@ -21,7 +21,13 @@ Description: The Private Investigator DragSelectable: true GMNotes: "{\n \"id\": \"05002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Detective.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" + \ \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Circle Undone\",\n + \ \"deck_requirements\": {\n \"size\": 40,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"05009\": 1\n },\n {\n \"05010\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 6dc626 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml index 3c5d274b7..eff13647e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil (3) 48c9ff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4490': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml index 4882ba8cf..a2daa8c36 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Joey The Rat Vigil b51688.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Join the Caravan (1) 6367dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Join the Caravan (1) 6367dd.yaml index d7a4bb73e..9a81f86bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Join the Caravan (1) 6367dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Join the Caravan (1) 6367dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jury-Rig 29d06d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jury-Rig 29d06d.yaml index 779ca2758..5e8c64d91 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jury-Rig 29d06d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jury-Rig 29d06d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Justify the Means (3) 025ed2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Justify the Means (3) 025ed2.yaml index 4acc6af5f..512ee20cf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Justify the Means (3) 025ed2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Justify the Means (3) 025ed2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5895': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Katana (0) f5beb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Katana (0) f5beb5.yaml new file mode 100644 index 000000000..c2568b248 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Katana (0) f5beb5.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94701 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10021\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: f5beb5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Katana (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Katja Eastbank (2) 2f100c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Katja Eastbank (2) 2f100c.yaml index 424b5cd40..aa9ee0f0d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Katja Eastbank (2) 2f100c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Katja Eastbank (2) 2f100c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml index 4f203bb9b..a1a502a02 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye (3) 2f9de4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml index 1b3eb63fc..041e61e71 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Keen Eye 0dc75e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keep Faith (2) 73e4ee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith (2) 73e4ee.yaml new file mode 100644 index 000000000..4a2fc17e4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith (2) 73e4ee.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94753 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10124\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Fortune. Blessed.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 73e4ee +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keep Faith (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml index eb1ea0df5..b73899d5e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Keep Faith 8b46b2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5843': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Keeper of the Key 014086.yaml b/unpacked/Bag All Player Cards 15bb07/Card Keeper of the Key 014086.yaml new file mode 100644 index 000000000..3d84fc6b4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Keeper of the Key 014086.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94746 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Celestial Ward +DragSelectable: true +GMNotes: "{\n \"id\": \"10106\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Summon.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 014086 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Keeper of the Key +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kensler's Log 8d5c12.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kensler's Log 8d5c12.yaml index 5382fe427..925b6ff67 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kensler's Log 8d5c12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kensler's Log 8d5c12.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml index f556ab8ba..3de4af24f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kerosene (1) 25ad44.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3140': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 9451ee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 9451ee.yaml index 27464f0f3..37d9fd473 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 9451ee.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) (Taboo) 9451ee.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml index a281be64a..c79c589f6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Key of Ys (5) 1c98ff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kicking the Hornet's Nest 4d6da5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kicking the Hornet's Nest 4d6da5.yaml index 72cba9d5b..6f8045052 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kicking the Hornet's Nest 4d6da5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kicking the Hornet's Nest 4d6da5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml index 81febde55..3ed6acdeb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml index 31ab5ad62..9c16478b7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knight of Swords (3) 159f82.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knight of Swords (3) 159f82.yaml index e1272c7f6..b14e1a117 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knight of Swords (3) 159f82.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knight of Swords (3) 159f82.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) 0dd658.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) 0dd658.yaml index 3de9f5b16..9ed6a400f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) 0dd658.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power (Taboo) 0dd658.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml index d5cce020a..da9ac9592 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knowledge is Power 6de21b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2932': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml index 243574d4a..78adbc4a7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml index a5c32a345..02778be5c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Kymani Jones 9a9830.yaml b/unpacked/Bag All Player Cards 15bb07/Card Kymani Jones 9a9830.yaml index a9fb4dd12..2dbf0d6ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kymani Jones 9a9830.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kymani Jones 9a9830.yaml @@ -21,7 +21,13 @@ Description: The Security Consultant DragSelectable: true GMNotes: "{\n \"id\": \"09008\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"The Scarlet Keys\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09009\": 1\n },\n {\n \"09010\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\",\n + \ \"rogue\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"tool\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 4\n }\n }\n ]\n}" GUID: 9a9830 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lab Coat (1) a825ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lab Coat (1) a825ad.yaml index 4b813a1f7..99b45bfef 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lab Coat (1) a825ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lab Coat (1) a825ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant 147cb2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant 147cb2.yaml index 294068ffd..bb0bc18f3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant 147cb2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Laboratory Assistant 147cb2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5865': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit ab24a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit ab24a6.yaml index 75ba39e37..3059643ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit ab24a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lady Esprit ab24a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml index 1564901ef..c953cb2ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lantern (2) bda4fd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml index d0ff7895d..62daf35ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml b/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml index f3f0f7750..86fc48fdd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Last Chance 1fe462.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml index 3e835dca6..e8233e140 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leadership (2) 80fafa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4479': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml index 80ade8e15..006431457 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml index e121fafcb..7aa1b9e17 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat (1) 5b1550.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml index 8e0bf42bb..1588d57b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Coat 593deb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml index 57cb08b7c..388f19bb7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leather Jacket dfbc13.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leg Injury 46b4a0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leg Injury 46b4a0.yaml index 9ec3956ba..60986457d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leg Injury 46b4a0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leg Injury 46b4a0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leo Anderson 126932.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leo Anderson 126932.yaml index 5a2b364a0..b00520bd5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leo Anderson 126932.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leo Anderson 126932.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"04001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Veteran. Wayfarer.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten - Age\"\n}" + Age\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"04006\": 1\n },\n {\n \"04007\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: '126932' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml index d9fac3cc6..11bc6c0c3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca (1) 27446e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml index 35b878969..50565c182 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leo De Luca eaa415.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml index 7ab7cd798..8f0c15f9b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lesson Learned (2) 037b2e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml index f9331a4ad..c6ac24fc2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Let God sort them out... d3dcf1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml index e09d7e515..309332cc4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Let me handle this! 36c0cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml index 775e2e50b..fb2aa5c4e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Library Docent (1) fab3a9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lifeline (1) 895047.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lifeline (1) 895047.yaml index d0fa93f12..ae0af2aa4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lifeline (1) 895047.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lifeline (1) 895047.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lightfooted (0) fe1fb6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lightfooted (0) fe1fb6.yaml new file mode 100644 index 000000000..929662769 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Lightfooted (0) fe1fb6.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94726 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10076\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Practiced. Trick.\",\n \"agilityIcons\": 1,\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: fe1fb6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Lightfooted (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml index 8377e4d92..7d860848a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lightning Gun (5) 2d362c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lily Chen cc21e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lily Chen cc21e0.yaml index 7e45483c1..add309de9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lily Chen cc21e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lily Chen cc21e0.yaml @@ -21,7 +21,20 @@ Description: The Martial Artist DragSelectable: true GMNotes: "{\n \"id\": \"08010\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Chosen. Warden.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\"\n}" + 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 3,\n \"cycle\": \"Edge of the Earth\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08011a\": 1,\n \"08012a\": + 1,\n \"08013a\": 1,\n \"08014a\": 1\n },\n {\n \"08015\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\": true,\n \"trait\": + [\n \"firearm\"\n ]\n },\n {\n \"faction\": [\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": + [\n \"guardian\"\n ],\n \"level\": {\n \"min\": 1,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": + 5,\n \"error\": \"You cannot have more than 5 level 0 Guardian cards\"\n }\n + \ ]\n}" GUID: cc21e0 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml index 9948a109d..213199f88 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage (1) 5065a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml index 8c4893805..e161f4cb9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Liquid Courage c33a10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml index b27d466de..386de4b19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lita Chantler 3c1944.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2951': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642393244/74ADDF83D8B03DBF4AD5DC7230C2D12E84685317/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml index b2ca0a845..c7d58c16e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Live and Learn 050ba1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Living Ink 42b36d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Living Ink 42b36d.yaml index 64ce920fc..bd55aa66a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Living Ink 42b36d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Living Ink 42b36d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Livre d'Eibon 55001f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Livre d'Eibon 55001f.yaml index a5c317b87..6be951aa6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Livre d'Eibon 55001f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Livre d'Eibon 55001f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml index d8abc1ffd..24214e9f8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks (1) edd6c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml index 8eb5530ab..570b75e28 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml index 3cfaaa6f3..732894cad 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lodge Debts acce72.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5918': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml index 2c11057b0..27814d093 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning (4) 1258c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4410': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml index 38e799653..0318a0b77 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Logical Reasoning 812175.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml index bd82e5ef1..ff9036dda 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes (Taboo) 52956d.yaml @@ -21,7 +21,15 @@ Description: The Actress DragSelectable: true GMNotes: "{\n \"id\": \"03006-t\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n \ \"traits\": \"Performer.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03018\": 2\n },\n {\n \"03019\": + 2\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"guardian\",\n \"seeker\",\n \"rogue\",\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n },\n + \ \"error\": \"You must have at least 7 cards from 3 different factions\"\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}" GUID: 52956d Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes d37332.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes d37332.yaml index 76c44a81c..775ff37fc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes d37332.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lola Hayes d37332.yaml @@ -21,7 +21,15 @@ Description: The Actress DragSelectable: true GMNotes: "{\n \"id\": \"03006\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n \ \"traits\": \"Performer.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03018\": 2\n },\n {\n \"03019\": + 2\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"guardian\",\n \"seeker\",\n \"rogue\",\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n },\n + \ \"error\": \"You must have at least 7 cards from 3 different factions\"\n + \ },\n {\n \"faction\": [\n \"neutral\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}" GUID: d37332 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml index cf2a3eaf6..d4be55e49 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lola Santiago (3) 8bec05.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml index 6936af8d7..9d9bf9471 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lone Wolf dc3b07.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Long Shot dc8c4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Long Shot dc8c4d.yaml index 063385fcf..fcb5636de 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Long Shot dc8c4d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Long Shot dc8c4d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml index 24eb5c8ef..7af97d1a2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lonnie Ritter ad0ef0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml index 74162c1b5..49859560a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! (2) fd393b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml index 5fd3da87e..7656a85c3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Look what I found! 88d3c0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml index aa88d5b4e..450598166 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lost Soul 4f903e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2323': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml index 85fbed303..3a948229f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lt. Wilson Stewart 4120f3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2336': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml index 09ec8a741..40ef89c9c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucid Dreaming (2) 122e98.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5273': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml index 51d7cd5bd..d5ead697a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case (3) 0feb74.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml index 3d2813b57..775087630 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Cigarette Case c607c5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 07b163.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 07b163.yaml index 5edb5c214..a43b30c84 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 07b163.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (2) 07b163.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5807': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (3) c8bb2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (3) c8bb2a.yaml index f2551a643..4ba259000 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (3) c8bb2a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Dice (3) c8bb2a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5896': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky Penny (2) aae31c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky Penny (2) aae31c.yaml index 92352b775..0d685c970 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky Penny (2) aae31c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky Penny (2) aae31c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5795': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml index a282cbc85..ee0a1853a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (2) 439af2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml index 32dbf27a9..b2aaab414 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! (3) 04d33d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml index a1ebe7188..0ece7f853 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Luke Robinson c59b75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Luke Robinson c59b75.yaml index 16a4279c4..be3e57791 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Luke Robinson c59b75.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Luke Robinson c59b75.yaml @@ -21,7 +21,13 @@ Description: The Dreamer DragSelectable: true GMNotes: "{\n \"id\": \"06004\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Dreamer. Drifter. Wayfarer.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\"\n}" + 3,\n \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06013\": 1\n },\n {\n \"06014\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"mystic\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: c59b75 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml index d5cba385f..a6135faca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lupara (3) a6af13.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml index 3baea5a78..167e76c24 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lure (1) d88407.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml index 08151e08c..85e124583 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lure (2) 1a90a4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3744': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Lurker in the Dark 79cc11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Lurker in the Dark 79cc11.yaml index 0c11b8027..3371bf659 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lurker in the Dark 79cc11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lurker in the Dark 79cc11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml b/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml index 3081d8fa7..bfb622de4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card M1918 BAR (4) b1ad65.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml b/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml index c93e36b87..722fcadc8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml b/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml index 0f288cab9..7e6fafb50 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Madame Labranche 1ee492.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml index 2bf323bbb..2b15d9554 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass (1) 378e84.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml index 44b0f3e71..26ad9b7bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Magnifying Glass 8cc0a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Maimed Hand cb14d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Maimed Hand cb14d3.yaml new file mode 100644 index 000000000..03a432a6c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Maimed Hand cb14d3.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94759 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10135\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: cb14d3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Maimed Hand +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Makeshift Trap aa897f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Makeshift Trap aa897f.yaml index b2d610d5d..9e8f107e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Makeshift Trap aa897f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Makeshift Trap aa897f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Making Preparations 18247d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Making Preparations 18247d.yaml index c82001b4a..1c5071b87 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Making Preparations 18247d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Making Preparations 18247d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml index aeb23d711..312b071cb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson (Taboo) 4f3637.yaml @@ -21,7 +21,21 @@ Description: The Researcher DragSelectable: true GMNotes: "{\n \"id\": \"06002-t\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Assistant. Scholar.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\"\n}" + 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 50,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06008\": 3\n },\n {\n \"06009\": + 1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": \"Mystic\",\n + \ \"faction\": [\n \"mystic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Rogue\",\n + \ \"faction\": [\n \"rogue\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n + \ \"faction\": [\n \"survivor\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n }\n ]\n}" GUID: 4f3637 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson 57d586.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson 57d586.yaml index 40948f2a6..1e1e53e33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson 57d586.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mandy Thompson 57d586.yaml @@ -21,7 +21,21 @@ Description: The Researcher DragSelectable: true GMNotes: "{\n \"id\": \"06002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Assistant. Scholar.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\"\n}" + 5,\n \"combatIcons\": 1,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06008\": 1\n },\n {\n \"06009\": + 1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"seeker\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"choiceName\": \"Mystic\",\n + \ \"faction\": [\n \"mystic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Rogue\",\n + \ \"faction\": [\n \"rogue\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n },\n {\n \"choiceName\": \"Survivor\",\n + \ \"faction\": [\n \"survivor\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 1\n },\n \"type\": [\n \"event\",\n \"skill\"\n + \ ],\n \"limit\": 10\n }\n ]\n}" GUID: 57d586 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Manipulate Destiny (2) 5606b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Manipulate Destiny (2) 5606b3.yaml index aff2a1433..1d3179f4f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Manipulate Destiny (2) 5606b3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Manipulate Destiny (2) 5606b3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml index 269fd8643..6449a9b58 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (1) c55160.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml index 351baffec..2a3a9a10d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mano a Mano (2) 14424c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml index f690ac2cc..ddc610c24 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity (2) 982716.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml index e79df6608..9d303ed2c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Manual Dexterity 679b13.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Map the Area 1760be.yaml b/unpacked/Bag All Player Cards 15bb07/Card Map the Area 1760be.yaml index 7c6e848db..00003f1b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Map the Area 1760be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Map the Area 1760be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau 11122f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau 11122f.yaml index b6d47bf0c..499773165 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau 11122f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau 11122f.yaml @@ -22,7 +22,19 @@ DragSelectable: true GMNotes: "{\n \"id\": \"05006\",\n \"alternate_ids\": [\n \"99001\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \"traits\": \"Performer. Sorcerer.\",\n \ \"willpowerIcons\": 4,\n \"intellectIcons\": 4,\n \"combatIcons\": 1,\n \"agilityIcons\": - 3,\n \"cycle\": \"The Circle Undone\"\n}" + 3,\n \"cycle\": \"The Circle Undone\",\n \"deck_requirements\": {\n \"size\": + 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n {\n \"05018\": + 1\n },\n {\n \"05019\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"trait\": [\n \"spell\"\n ],\n \"level\": {\n + \ \"min\": 0,\n \"max\": 5\n }\n },\n {\n \"faction\": + [\n \"mystic\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"trait\": [\n \"occult\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 0\n }\n },\n {\n \"faction\": [\n \"seeker\",\n + \ \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + Seeker and/or Survivor cards\"\n }\n ]\n}" GUID: 11122f Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass (2) 596053.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass (2) 596053.yaml new file mode 100644 index 000000000..ed54d51c2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass (2) 596053.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94752 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10122\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 2,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: '596053' +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mariner's Compass (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml index de17860a9..efd8f82d2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mariner's Compass 4e2d75.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mark Harrigan 01ac1b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mark Harrigan 01ac1b.yaml index dd22c526a..bd3e8427d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mark Harrigan 01ac1b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mark Harrigan 01ac1b.yaml @@ -21,7 +21,14 @@ Description: The Soldier DragSelectable: true GMNotes: "{\n \"id\": \"03001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Veteran.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03007\": 1\n },\n {\n \"03008\": + 1\n },\n {\n \"03009\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"guardian\",\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"trait\": [\n \"tactic\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 0\n }\n }\n ]\n}" GUID: 01ac1b Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml b/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml index ff12f7e5f..37b12c017 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Marksmanship (1) 6a9021.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Martyr's Vambrace (3) c795c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Martyr's Vambrace (3) c795c8.yaml index 885f9aeb7..b686caafc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Martyr's Vambrace (3) c795c8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Martyr's Vambrace (3) c795c8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Matchbox (0) b533db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Matchbox (0) b533db.yaml new file mode 100644 index 000000000..2723149f9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Matchbox (0) b533db.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94748 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10108\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Tool.\",\n \"intellectIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: b533db +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Matchbox (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml index c45087c10..963b5960c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 (2) 725690.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml index 1b9967d43..3acfed4e0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mauser C96 f32343.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml b/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml index bf1fc1dc6..4672e4409 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Meat Cleaver a57f19.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2779': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mechanic's Wrench 598ba0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mechanic's Wrench 598ba0.yaml index f98a694d2..040333ee7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mechanic's Wrench 598ba0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mechanic's Wrench 598ba0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medical Student e419b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medical Student e419b4.yaml index 95bbfe458..4f7876e92 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Medical Student e419b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Medical Student e419b4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts (2) 0d3bfa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts (2) 0d3bfa.yaml index 9d8633299..d8db3e0ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts (2) 0d3bfa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts (2) 0d3bfa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts 85822c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts 85822c.yaml index 8adad14d0..2d6c8f5e4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts 85822c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts 85822c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml index 6d2e1e725..2a5a0736c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Medical Texts ba16cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml index 941655bb2..86de948be 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Medico Della Peste 6179d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2956': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Meditative Trance ef46e9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Meditative Trance ef46e9.yaml index 04da9c4d2..f7fb369d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Meditative Trance ef46e9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Meditative Trance ef46e9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mesmeric Influence (1) b13946.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mesmeric Influence (1) b13946.yaml new file mode 100644 index 000000000..9e37b6335 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Mesmeric Influence (1) b13946.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94738 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10096\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 1,\n \"traits\": \"Practiced.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: b13946 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Mesmeric Influence (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml index 41ea480a7..65e569b12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mi-Go Weapon 2fc31c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2336': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miasmic Crystal bad631.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miasmic Crystal bad631.yaml index 14cd8d71b..a59a6e107 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Miasmic Crystal bad631.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Miasmic Crystal bad631.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Michael Leigh (5) 573765.yaml b/unpacked/Bag All Player Cards 15bb07/Card Michael Leigh (5) 573765.yaml index 60cd54279..e111cd558 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Michael Leigh (5) 573765.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Michael Leigh (5) 573765.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Microscope (4) fbd296.yaml b/unpacked/Bag All Player Cards 15bb07/Card Microscope (4) fbd296.yaml new file mode 100644 index 000000000..bd425a516 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Microscope (4) fbd296.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94716 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10058\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Tool. Science.\",\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: fbd296 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Microscope (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml index b625dbecf..102b3830b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml index 0d6a6d71d..b32ad51e9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (1) 5d6e57.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml index ba8f88001..346ca3a2a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind Wipe (3) e72762.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter (2) 9b1c5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter (2) 9b1c5b.yaml index 12e643376..dfbc1dac1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter (2) 9b1c5b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter (2) 9b1c5b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml index a6443efc2..034952e4d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind over Matter 8cf335.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml index 3d8d5ca07..e30acde2e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mind's Eye (2) ad58aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5272': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mineral Specimen 08dd86.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mineral Specimen 08dd86.yaml index 6d668a185..c327d6998 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mineral Specimen 08dd86.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mineral Specimen 08dd86.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Minh Thi Phan 6c4c58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Minh Thi Phan 6c4c58.yaml index bcb5f0943..441ed7d37 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Minh Thi Phan 6c4c58.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Minh Thi Phan 6c4c58.yaml @@ -21,7 +21,13 @@ Description: The Secretary DragSelectable: true GMNotes: "{\n \"id\": \"03002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Assistant.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03010\": 1\n },\n {\n \"03011\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 6c4c58 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miracle Wish (5) d78d4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miracle Wish (5) d78d4a.yaml new file mode 100644 index 000000000..3e37d29a8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Miracle Wish (5) d78d4a.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94709 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10038\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"level\": 5,\n \"traits\": \"Favor. Blessed.\",\n \"bonded\": [\n {\n \"count\": + 1,\n \"id\": \"10039\"\n }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: d78d4a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Miracle Wish (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml index d3fc3fb06..2b8d439b0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Miskatonic Archaeology Funding (4) 1a1b58.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml index 27d3a373b..ea7db176c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Miss Doyle (1) e1aedf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml index 77b351509..93980177a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (2) 3d57b4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml index c0c5d3e7b..e5958002d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh (4) 68fce2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml index d3a9b86f0..48c9a8d23 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mists of R'lyeh 5558f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml index d59633d52..96338f18f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mitch Brown f91fd9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3770': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml index 9e508e1f2..89b9423b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mk 1 Grenades (4) 0ab574.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3786': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml index b81d05078..78c0c21b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mob Enforcer b239d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mob Goons fc1506.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mob Goons fc1506.yaml index 3dfaaf7da..e48576fae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mob Goons fc1506.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mob Goons fc1506.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml b/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml index 193594996..bf776e841 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Molly Maxwell 692ced.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4661': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml index d641a9a68..8ef639c51 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moment of Respite (3) 523b76.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml index c016632d2..1c3aadee2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Momentum (1) d753d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Money Talks (2) 67eb69.yaml b/unpacked/Bag All Player Cards 15bb07/Card Money Talks (2) 67eb69.yaml index 0ee07d12c..770d71ee4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Money Talks (2) 67eb69.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Money Talks (2) 67eb69.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml b/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml index 17b01e6fb..a58dcc7ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Money Talks 276477.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5276': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml index 6dc1a834a..6d51543cd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer (5) e21854.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml index 807d7feda..e17868af2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Monster Slayer 63b3e5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation a49751.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation a49751.yaml index 483170e91..33056f502 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation a49751.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Monstrous Transformation a49751.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2968': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/138879070086634183/2856A2C2077CFA2C61B9EF2498CAE6865024DB72/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml b/unpacked/Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml index 40e8e5eb3..48366eec6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml @@ -21,7 +21,18 @@ Description: The Archeologist DragSelectable: true GMNotes: "{\n \"id\": \"08007\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Wayfarer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Edge of the Earth\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Edge of the Earth\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08008\": 1,\n \"90063\": 1\n + \ },\n {\n \"08009\": 1,\n \"90064\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n },\n {\n + \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n + \ ],\n \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"seeker\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": + \"You cannot have more than 5 level 0 Seeker cards\"\n }\n ]\n}" GUID: 46b145 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moon Pendant (2) 72deff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moon Pendant (2) 72deff.yaml index 6d57b3da3..b10a3be90 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moon Pendant (2) 72deff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moon Pendant (2) 72deff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual (2) ad3efc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual (2) ad3efc.yaml index ca575aa43..6b35db785 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual (2) ad3efc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual (2) ad3efc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml index e4209160e..828ae10d9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonlight Ritual 1cd2bd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml index 8a6dac020..5e9c4a3af 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4477': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Motivational Speech 1b2331.yaml b/unpacked/Bag All Player Cards 15bb07/Card Motivational Speech 1b2331.yaml index c7604b633..cf3bd78fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Motivational Speech 1b2331.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Motivational Speech 1b2331.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119534890/F45F9E6F67C91566D8CC5EC783E4372B264A349D/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml index cd89d200a..5f8859ea8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moxie (1) 5fe780.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Moxie (3) 6b3a27.yaml b/unpacked/Bag All Player Cards 15bb07/Card Moxie (3) 6b3a27.yaml index da234f154..52e872062 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moxie (3) 6b3a27.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moxie (3) 6b3a27.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) 522279.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) 522279.yaml index 3f147cc05..86c112f13 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) 522279.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook (Taboo) 522279.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml index 640189ac2..d042ab5df 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mr. Rook 1339b0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2778': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml index 5525e6672..40a7946ff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mysteries Remain 274daa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3700': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml index 135478134..6a0e36d88 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mysterious Raven 59e40d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml index 52970c328..a673ad8d7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Mystifying Song 3b8cb7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4444': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml index 924973cf1..4cf089916 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Naomi O'Bannion 7f7ecc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2331': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241296009359/3EF850792428E467A4475333CCBBF6E6B5975186/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml b/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml index c7af3daca..a13bc4d05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml index dd18abbb7..f6586e9f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Narrow Escape f6ff32.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nathaniel Cho 65588a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nathaniel Cho 65588a.yaml index 7570b8c71..e085ca8da 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nathaniel Cho 65588a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nathaniel Cho 65588a.yaml @@ -21,7 +21,12 @@ Description: The Boxer DragSelectable: true GMNotes: "{\n \"id\": \"60101\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Criminal. Warden.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 2,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" + 2,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"60102\": 1\n },\n {\n \"60103\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n }\n ]\n}" GUID: 65588a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nature of the Beast (1) 9c4015.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nature of the Beast (1) 9c4015.yaml index c6fb7abcd..89f909cee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nature of the Beast (1) 9c4015.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nature of the Beast (1) 9c4015.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml index 44719340d..e0082b1aa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nautical Prowess 9d6e9a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4443': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml index 3354fb84d..3adf8b271 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Neither Rain nor Snow 6da7c4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.ttslua index 92beb519a..7bb7ee199 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/Nephthys4") -end) __bundle_register("playercards/cards/Nephthys4", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Bless"] = true @@ -132,6 +129,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -158,6 +157,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -319,6 +327,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -326,8 +346,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -336,7 +356,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -354,66 +374,12 @@ do return TokenArrangerApi end end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) __bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -440,29 +406,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -471,14 +438,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -498,29 +469,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -532,4 +505,415 @@ do return GUIDReferenceApi end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/Nephthys4") +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.yaml index a12ba3a03..4e811c617 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nephthys (4) 5659d1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml index 6d84ecb97..5c3bbd241 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Newspaper (2) 9bcdee.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml index 7d93ce489..610ce13fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml index eaa5fc5ea..9e2497c68 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nightmare Bauble (3) d6f6f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4487': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml index 31632b394..8666aa252 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nikola Tesla 03695f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nikola Tesla 03695f.yaml index 7b00c527b..d16ce1296 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nikola Tesla 03695f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nikola Tesla 03695f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5580': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764609761078/E05F39D952FE0C4E6473E744D64221DD1150F00A/ NumHeight: 4 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml index e794f2c33..b17608c32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nine of Rods (3) c7fe4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nine of Rods (3) c7fe4a.yaml index ba7aa7101..e995640dc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nine of Rods (3) c7fe4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nine of Rods (3) c7fe4a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nkosi Mabati (3) 6c5628.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nkosi Mabati (3) 6c5628.yaml index d4946f996..d34b60864 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nkosi Mabati (3) 6c5628.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nkosi Mabati (3) 6c5628.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml index 8bba5fbe8..0ea390580 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned (5) 1f3f16.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml index c822e956a..27e8413e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card No Stone Unturned 44cf4a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Norman Withers e0a155.yaml b/unpacked/Bag All Player Cards 15bb07/Card Norman Withers e0a155.yaml index 3bf428822..51b5528de 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Norman Withers e0a155.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Norman Withers e0a155.yaml @@ -22,7 +22,17 @@ DragSelectable: true GMNotes: "{\n \"id\": \"08004\",\n \"alternate_ids\": [\n \"98007\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n \"agilityIcons\": 1,\n \"cycle\": - \"Edge of the Earth\"\n}" + \"Edge of the Earth\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"98008\": 1,\n \"08005\": 1\n + \ },\n {\n \"98009\": 1,\n \"08006\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n },\n {\n + \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"mystic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": + \"You cannot have more than 5 level 0 Mystic cards\"\n }\n ]\n}" GUID: e0a155 Grid: true GridProjection: false @@ -61,10 +71,23 @@ States: UniqueBack: true Description: The Astronomer DragSelectable: true - GMNotes: "{\n \"id\": \"08004\",\n \"alternate_ids\": [\n \"98007\"\n ],\n - \ \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \"traits\": \"Miskatonic.\",\n - \ \"willpowerIcons\": 4,\n \"intellectIcons\": 5,\n \"combatIcons\": 2,\n - \ \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" + GMNotes: "{\r\n \"id\": \"08004\",\r\n \"alternate_ids\": [\r\n \"98007\"\r\n + \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Seeker\",\r\n \"traits\": + \"Miskatonic.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": 5,\r\n + \ \"combatIcons\": 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the + Earth\",\r\n \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": + 1,\r\n \"signatures\": [\r\n {\r\n \"98008\": 1,\r\n \"08005\": + 1\r\n },\r\n {\r\n \"98009\": 1,\r\n \"08006\": 1\r\n + \ }\r\n ]\r\n },\r\n \"deck_options\": [\r\n {\r\n \"faction\": + [\r\n \"seeker\"\r\n ],\r\n \"level\": {\r\n \"min\": + 0,\r\n \"max\": 0\r\n }\r\n },\r\n {\r\n \"faction\": + [\r\n \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": + 0,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": + [\r\n \"mystic\"\r\n ],\r\n \"level\": {\r\n \"min\": + 1,\r\n \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": + [\r\n \"mystic\"\r\n ],\r\n \"level\": {\r\n \"min\": + 0,\r\n \"max\": 0\r\n },\r\n \"limit\": 5,\r\n \"error\": + \"You cannot have more than 5 level 0 Mystic cards\"\r\n }\r\n ]\r\n}\r\n" GUID: 49634c Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml index dfa7d5fb6..0f90d5f6f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Not without a fight! d1d7fa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml index 70862be87..adda81c30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nothing Left to Lose (3) f0389b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4487': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml index 00d681775..aed6fc7c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5874': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml index 827a039d9..7f3ecd993 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obscure Studies c5d8a9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5882': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Observed (4) cf5ac8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Observed (4) cf5ac8.yaml index e0fe62e49..0482b9be5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Observed (4) cf5ac8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Observed (4) cf5ac8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml index ccb69f9b2..f0255cab7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Obsidian Bracelet 972250.yaml b/unpacked/Bag All Player Cards 15bb07/Card Obsidian Bracelet 972250.yaml index 5dac8f300..e2dbb2569 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obsidian Bracelet 972250.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obsidian Bracelet 972250.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml index 07d6f0b5b..c74323782 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Evidence 3586e6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5827': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml index b8611da6e..e7ce41c0c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Invocation 010509.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon (3) 71d99c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon (3) 71d99c.yaml index 6edf57e98..4ba36418c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon (3) 71d99c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon (3) 71d99c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml index 2953234a4..db9e9edd9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Lexicon 5d6728.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5921': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml index 5abe13e3c..3935360de 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Scraps 6aea76.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5877': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Occult Theory (1) 49a338.yaml b/unpacked/Bag All Player Cards 15bb07/Card Occult Theory (1) 49a338.yaml index 3847ca0da..0e136444c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Occult Theory (1) 49a338.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Occult Theory (1) 49a338.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml b/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml index fe99817ee..e78bb61ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Offer You Cannot Refuse e27c93.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml index c8e952c1b..f97de99cc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore (3) 8a0060.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4488': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml index b2ef57700..1706af77e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Book of Lore 063fd8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml index 783f15d5e..1a2e7d8a4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Hunting Rifle (3) 44a37f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3148': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Keyring (3) e7d988.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring (3) e7d988.yaml index e88d64a67..c7a3264f4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Keyring (3) e7d988.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring (3) e7d988.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml index 28d9bacf3..f84abc990 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Keyring 5888da.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Old Shotgun (2) 7eb1ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Old Shotgun (2) 7eb1ec.yaml index ed84757a5..065d2e741 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Old Shotgun (2) 7eb1ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Old Shotgun (2) 7eb1ec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml index ca578051c..905ecca2a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '912': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2195002645140651764/97A66D51D85628992E10826FF866E96E310FB177/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml index b5f4e1a9c..5108fb30a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml index c76017bbf..c641b5f35 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) 2ebdf1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml index 0e9e63e2e..c96b2558e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On Your Own (3) b0c61c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Hunt (3) a336de.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt (3) a336de.yaml index 7c4732c80..9d7899e3b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Hunt (3) a336de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt (3) a336de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml index 9c46da1df..3a2de2573 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Hunt a13ca4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Lam ea6d44.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Lam ea6d44.yaml index 970abf3c8..a260f2780 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Lam ea6d44.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Lam ea6d44.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5868': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Mend ac3502.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Mend ac3502.yaml index 0cad66734..23a5e2031 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Mend ac3502.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Mend ac3502.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5877': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Trail (1) 4e4179.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Trail (1) 4e4179.yaml index 209d723ad..da30268b6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Trail (1) 4e4179.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Trail (1) 4e4179.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card On the Trail (3) b94090.yaml b/unpacked/Bag All Player Cards 15bb07/Card On the Trail (3) b94090.yaml index 635825ca6..de2ac876b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card On the Trail (3) b94090.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card On the Trail (3) b94090.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card One in the Chamber 919856.yaml b/unpacked/Bag All Player Cards 15bb07/Card One in the Chamber 919856.yaml index 4b0b0fe48..b870a704c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card One in the Chamber 919856.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card One in the Chamber 919856.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml index 3f76c5b37..a160d68ab 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch (5) 8ffa44.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml index daed897a6..86afef4fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card One-Two Punch 22bb1e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle (4) 647c62.yaml b/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle (4) 647c62.yaml index f6ff6b55c..02f764151 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle (4) 647c62.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle (4) 647c62.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle 95f4b0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle 95f4b0.yaml index f770ae6a2..6968698c4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle 95f4b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Onyx Pentacle 95f4b0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml index ccaf5f44f..73fabc9e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Oops! (2) 70772b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3149': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml index a47e12f1a..c2664389c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml index a01daf8fb..0687095c6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Open Gate a33acd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4440': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml b/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml index 3d4ca42da..f8ffe0501 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Opportunist (2) 63f145.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml b/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml index 635818588..6f98bc91d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2617': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml index 5bab964ba..2a2482dfc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ornate Bow (3) 2acced.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Orphic Theory (1) d084d7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Orphic Theory (1) d084d7.yaml index 0e7276aef..40ab49738 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Orphic Theory (1) d084d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Orphic Theory (1) d084d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml b/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml index c667a983f..b163edc41 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Otherworld Codex (2) df0e22.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3799': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml index cb56772e2..cae1896eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Otherworldly Compass (2) 19ab7c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml index d32b6c056..a1c638737 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Out of Body Experience d64b8f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2358': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml index d12353168..e6b9e8618 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower (2) 017e1f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml index d870ec85b..236bc8cb8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml index 95ff18430..f15f319dd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml index 2a4910172..6e7b2c046 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4311': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml index f68bcc400..443c7cb32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml index 3604b8ae7..4e7737258 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml index d6e6bc4d4..70762adb1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2956': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/87094793642329861/9768E9FE9C71E74721340D0D81607F534E54A3DE/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Paradimensional Understanding 3c3dfa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Paradimensional Understanding 3c3dfa.yaml index d7cabb967..9c70c31fb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Paradimensional Understanding 3c3dfa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Paradimensional Understanding 3c3dfa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1941643328387688196/FE8468C5066E61AB3C228A48639F47D0226DFCF6/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml index 83c76e993..bbae5e887 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Paradoxical Covenant (2) 541ee9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates (2) 583026.yaml b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates (2) 583026.yaml index 49f45e8c9..7fbc290ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates (2) 583026.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates (2) 583026.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml index 4591438cd..580a0bc04 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Parallel Fates 47bdba.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml b/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml index e353b37c0..f43bc04d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) 305e37.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) 305e37.yaml index 0c8e61864..ac4cf7f6c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) 305e37.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) (Taboo) 305e37.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml index 662987ea5..928aca9e7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pathfinder (1) 7f99cc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Patrice Hathaway a7b79f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Patrice Hathaway a7b79f.yaml index c3bfb78e5..0c4151b23 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Patrice Hathaway a7b79f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Patrice Hathaway a7b79f.yaml @@ -21,7 +21,13 @@ Description: The Violinist DragSelectable: true GMNotes: "{\n \"id\": \"06005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Performer. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" + 2,\n \"combatIcons\": 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 42,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06016\": 1\n },\n {\n \"06017\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: a7b79f Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml b/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml index 47210c50b..167f6fcac 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Patrice's Violin ea0007.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5862': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml index f033ea712..35b829a95 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pay Day (1) 9f0b34.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pay Your Due 5b6c9f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pay Your Due 5b6c9f.yaml index 04f5ab794..db3a88ed6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pay Your Due 5b6c9f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pay Your Due 5b6c9f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen (Taboo) 02b9b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen (Taboo) 02b9b9.yaml index 52c5f98e7..c5c891355 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen (Taboo) 02b9b9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen (Taboo) 02b9b9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml index 3c0e841aa..d2e13ffb4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pendant of the Queen 9b0dcf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4410': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml index 397788ea7..b33749a62 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Penny White 73bccf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml index 2a8c7d13f..d2a4e9ddd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Perception (2) 96b5ed.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml index 06a633f0b..3d1fd7146 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml index ca6af3839..9c4a26809 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Persuasion (Taboo) 821d99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Persuasion (Taboo) 821d99.yaml index 2a31b9aa5..186ba6087 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Persuasion (Taboo) 821d99.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Persuasion (Taboo) 821d99.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml b/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml index 778cd3ecf..2cabd4f25 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml index 770f634fd..46058069e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pet Oozeling 26398a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2336': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pete's Guitar 876557.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pete's Guitar 876557.yaml index 0461be841..dff4815f8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pete's Guitar 876557.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pete's Guitar 876557.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3811': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021604542994812442/CC009EA96D868F7ED096DF8877B0416EE12A6D14/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml index c54f6bce2..8fb8b0c99 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre (2) e1e098.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml index be5e22fa4..28f9016e5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Peter Sylvestre ffdeb5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml index 70451cce1..832c01020 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (2) d708d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml index f42baf511..c4d63d819 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training (4) ab51ce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml index 07ab6ab78..e0a4126bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Physical Training 1165db.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml index e474bed94..7fe9da4a4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing (2) 2f4db2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml index cd594b80e..b170f5a61 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml index a65d65737..6d5ba130a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pilfer (3) e503ce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml index d1e5d4479..9af73ceb9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml index 9387e2e9f..dc2e67cd7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml index 0b45f8ccc..792d560d0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Plan of Action 96fd5d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5804': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml index 9cc68d255..36cdc1f3d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Plucky (1) 86b9c5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Plucky (3) 7a2fe9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Plucky (3) 7a2fe9.yaml index 240ebdf6d..f58de4ff0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Plucky (3) 7a2fe9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Plucky (3) 7a2fe9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml index 15b566ac2..35ae88366 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pnakotic Manuscripts (5) 344d98.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2622': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pocket Multi Tool 7421ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pocket Multi Tool 7421ed.yaml index 5404379fe..209d4b895 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pocket Multi Tool 7421ed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pocket Multi Tool 7421ed.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 35e8e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 35e8e2.yaml index cbb4e81f5..2cde45149 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 35e8e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pocket Portal 35e8e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5840': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600953065965648/5A0D88CCA811A490C2FEF2675A397E1CEE010870/ NumHeight: 4 NumWidth: 8 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pocket Telescope 98eb87.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pocket Telescope 98eb87.yaml index 8177d594f..98280dc5e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pocket Telescope 98eb87.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pocket Telescope 98eb87.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml b/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml index 3c7bab84f..9e092b3ce 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml index d98a01288..01cff5ee7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Police Badge (2) da46e0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml index cca53fff0..b25e1881c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml index a61b5cfe4..d2a602eed 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Powder of Ibn Ghazi f96ed0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Power Word (Taboo) dc1962.yaml b/unpacked/Bag All Player Cards 15bb07/Card Power Word (Taboo) dc1962.yaml index a2c603b51..1ff2902df 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Power Word (Taboo) dc1962.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Power Word (Taboo) dc1962.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.ttslua index f89933890..753e248bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Power Word Upgrade Sheet (Taboo) ebce85.ttslua @@ -41,396 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/PowerWordUpgradeSheetTaboo") -end) __bundle_register("playercards/customizable/PowerWordUpgradeSheetTaboo", function(require, _LOADED, __bundle_register, __bundle_modules) -- Customizable Cards: Power Word (Taboo) @@ -716,7 +326,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -942,4 +552,399 @@ function maybeUpdateServitorSlotDisplay() }) end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/PowerWordUpgradeSheetTaboo") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Power Word c91c1d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Power Word c91c1d.yaml index edc25c385..cbae09bd1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Power Word c91c1d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Power Word c91c1d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml b/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml index 1b3a0d829..81295b161 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Practice Makes Perfect 1ac667.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4478': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) 358be4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) 358be4.yaml index fbc517ac8..1ed67ab92 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) 358be4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) 358be4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) f69d3f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) f69d3f.yaml index 830398124..780edb48a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) f69d3f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Precious Memento (4) f69d3f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Predator or Prey 6c726b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Predator or Prey 6c726b.yaml index 6387c0258..af851ec40 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Predator or Prey 6c726b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Predator or Prey 6c726b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml b/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml index b06730dcd..41c995f5a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5860': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml index 65e3e4f10..9adde8bd7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2763': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst (2) a4f62a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst (2) a4f62a.yaml index ee031f883..3377cb33c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst (2) a4f62a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst (2) a4f62a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml index c5c8c3d05..a2cc8181e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prepared for the Worst 831b6b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml index 69c6d4116..6e95bbe5f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches (2) 5e32a5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3139': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml index abc5386b8..39aee985f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Preposterous Sketches 60b353.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml index 2400fe044..8fd2893eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Press Pass (2) a6c839.yaml b/unpacked/Bag All Player Cards 15bb07/Card Press Pass (2) a6c839.yaml index 2886edb98..72f25cf6f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Press Pass (2) a6c839.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Press Pass (2) a6c839.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Preston Fairmont 5e6298.yaml b/unpacked/Bag All Player Cards 15bb07/Card Preston Fairmont 5e6298.yaml index 880d5f14b..dc06e4ea8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Preston Fairmont 5e6298.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Preston Fairmont 5e6298.yaml @@ -21,7 +21,14 @@ Description: The Millionaire DragSelectable: true GMNotes: "{\n \"id\": \"05003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Silver Twilight. Socialite.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": - 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"05011\": 1\n },\n {\n \"05012\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\": true,\n \"trait\": + [\n \"illicit\"\n ]\n },\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 5e6298 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml index cc675d179..8758918f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Priest of Two Faiths (1) 48e4a3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml index 35d90c936..3933c231a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Professor Warren Rice 42806b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb (2) 1905cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb (2) 1905cf.yaml index be2ac63c3..54261e504 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb (2) 1905cf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb (2) 1905cf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb cc8571.yaml b/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb cc8571.yaml index 5a64dc668..a72aac2a9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb cc8571.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Professor William Webb cc8571.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml index c93cf67b3..6d7e5103e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Promise of Power d8b64b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5849': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml index aafe62942..7185a7a50 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) (Taboo) 957c32.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) 55999d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) 55999d.yaml index 16a0da4c2..394c9cc33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) 55999d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophesiae Profana (5) 55999d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml index 510f8725e..043388c83 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4309': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Prophetic (3) 0e64cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Prophetic (3) 0e64cb.yaml index 0a749b72b..4d7670e91 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prophetic (3) 0e64cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophetic (3) 0e64cb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Protecting the Anirniq (2) 91204c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Protecting the Anirniq (2) 91204c.yaml index ac5e7699f..e90d73d1e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Protecting the Anirniq (2) 91204c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Protecting the Anirniq (2) 91204c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Protective Gear (2) 9a5cb1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Protective Gear (2) 9a5cb1.yaml index c5a19169e..0effe1de9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Protective Gear (2) 9a5cb1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Protective Gear (2) 9a5cb1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.ttslua index 052912a05..fb5bfbf8c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.ttslua @@ -41,144 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ProtectiveIncantation1") -end) -__bundle_register("playercards/cards/ProtectiveIncantation1", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = {} - -INVALID_TOKENS = { - ["Auto-fail"] = true -} - -UPDATE_ON_HOVER = true - -require("playercards/CardsThatSealTokens") -end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -257,6 +119,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -283,6 +147,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -444,6 +317,234 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ProtectiveIncantation1") +end) +__bundle_register("playercards/cards/ProtectiveIncantation1", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = {} + +INVALID_TOKENS = { + ["Auto-fail"] = true +} + +UPDATE_ON_HOVER = true + +require("playercards/CardsThatSealTokens") end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -451,8 +552,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -461,7 +562,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -497,35 +598,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -533,4 +640,281 @@ do return BlessCurseManagerApi end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.yaml b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.yaml index 2d48860cc..fe5a7471c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Protective Incantation (1) 0fd4ae.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml index 8b08c0bdc..adcc663fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Purifying Corruption (4) ac9763.yaml b/unpacked/Bag All Player Cards 15bb07/Card Purifying Corruption (4) ac9763.yaml index 8e90a6bcc..343b0bb12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Purifying Corruption (4) ac9763.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Purifying Corruption (4) ac9763.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Pushed to the Limit e0f396.yaml b/unpacked/Bag All Player Cards 15bb07/Card Pushed to the Limit e0f396.yaml index b932913a9..20e69a605 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pushed to the Limit e0f396.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pushed to the Limit e0f396.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Putrescent Rot 2d1e60.yaml b/unpacked/Bag All Player Cards 15bb07/Card Putrescent Rot 2d1e60.yaml new file mode 100644 index 000000000..2d4e454ad --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Putrescent Rot 2d1e60.yaml @@ -0,0 +1,54 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94734 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10088\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Spell. Rot. Cursed.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 2d1e60 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Putrescent Rot +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml index 8d4f73441..ddfcce77e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Puzzle Box 44334c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml index 1dca38cd0..d60a2e930 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quantum Flux edd34a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quantum Paradox 0e4c07.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quantum Paradox 0e4c07.yaml index 0db353543..dd2d94beb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quantum Paradox 0e4c07.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quantum Paradox 0e4c07.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Getaway 5cc3d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Getaway 5cc3d2.yaml index c2f9fee48..372a17046 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quick Getaway 5cc3d2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Getaway 5cc3d2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml index bfb07bb53..87745ab98 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Learner (4) 3bbc0b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml index 76d93f10a..539826a9e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Study (2) 092e92.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 4a49ea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 4a49ea.yaml index c217a8beb..cdc238c6b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 4a49ea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking (Taboo) 4a49ea.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml index 1a0b20caa..de21697e5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quick Thinking 99989c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2617': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Quickdraw Holster (4) 859736.yaml b/unpacked/Bag All Player Cards 15bb07/Card Quickdraw Holster (4) 859736.yaml index 7bdd5dcdb..a4c3296e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Quickdraw Holster (4) 859736.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Quickdraw Holster (4) 859736.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml index 0cf654657..6d77b1e7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot (3) 3f91af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml index c1ea551d3..2e93d0bf5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rabbit's Foot f34090.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.ttslua index 3acdb564c..fd1a021fb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.ttslua @@ -41,66 +41,12 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) __bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -127,29 +73,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -158,14 +105,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -177,51 +128,77 @@ do return ChaosBagApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 + -- 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 }) + + -- filtering the result + 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 end - return GUIDReferenceApi + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/RadiantSmite1") -end) __bundle_register("playercards/cards/RadiantSmite1", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Bless"] = true @@ -309,6 +286,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -335,6 +314,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -496,6 +484,402 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/RadiantSmite1") end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -503,8 +887,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -513,7 +897,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end diff --git a/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.yaml b/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.yaml index b144b13e5..5852de100 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Radiant Smite (1) 92c295.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1f50e9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1f50e9.yaml index 3c4a2652b..f0a886735 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1f50e9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Randall Cho 1f50e9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5850': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml index 966f83760..ccc95fd02 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter b04c8e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml index ea34613a5..029c90fc2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Randolph Carter d253a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4525': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml index 7435b1a42..451dac990 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rational Thought 1c7a00.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) ab2752.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) ab2752.yaml new file mode 100644 index 000000000..54ea7d1ba --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) ab2752.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94717 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Sentient Strain +DragSelectable: true +GMNotes: "{\n \"id\": \"10059\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Creature. Science.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: ab2752 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ravenous Myconid (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) baa926.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) baa926.yaml new file mode 100644 index 000000000..05b8566fc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) baa926.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94719 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Nurturing Strain +DragSelectable: true +GMNotes: "{\n \"id\": \"10061\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Flora. Science.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Resource\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: baa926 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ravenous Myconid (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) df93ca.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) df93ca.yaml new file mode 100644 index 000000000..8630dfb37 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid (4) df93ca.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94718 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Carnivorous Strain +DragSelectable: true +GMNotes: "{\n \"id\": \"10060\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Monster. Science.\",\n \"combatIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: df93ca +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Ravenous Myconid (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid 0aa967.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid 0aa967.yaml index 09523bc4c..9ca511519 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid 0aa967.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ravenous Myconid 0aa967.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml new file mode 100644 index 000000000..24e16324a --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs (2) 5ce4d4.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94742 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10101\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 5ce4d4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Read the Signs (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml index b591dfada..e0cba6c8d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Read the Signs 75eca5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3801': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml index 327bb7a2d..80b3b58e1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reality Acid 0a1b3a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3990': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2042998544452426838/959679B9F2B8AA454A88141B5A2B729701743308/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml index 1ae1b2522..804ee5d79 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Recall the Future (2) a06aa7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml index 15c13d9b7..ca3e89401 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Recharge (2) e27b3c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml b/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml index 52c5aac6d..fb792dc22 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Recharge (4) 591789.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml index 9f92ea152..6f93e4e46 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reckless Assault 3ff641.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml index de9f2f7a6..c4a67f457 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml index d47b2fe9b..697fbcb7f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml index 0cd863d2a..6bc9f3e16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3990': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2042998544452426838/959679B9F2B8AA454A88141B5A2B729701743308/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml index 853af2a07..6c2797cc6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml index 1ac5b1de9..c78663c68 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reliable (1) 102fad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml index f886cbf53..1c4801430 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic Hunter (3) 3c959c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml index 29bb90a8e..a2519526d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 35bc58.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2358': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml index 820e01496..85a548dcc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 7667ef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml index a67b8b818..06e3fed97 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages 87718c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2358': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777501236/D145C8B748FB42258EB442B9DF36797851CEECC3/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml index 3e0b74f18..dd77d0af8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relic of Ages e27a30.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2356': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1467561769777497046/3003A76996378249E6AAA4A60D85AE7EE59C1B8B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml index 68eab0c36..a1fd2843a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Research Librarian 8f91ce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Research Notes (Taboo) 085c08.yaml b/unpacked/Bag All Player Cards 15bb07/Card Research Notes (Taboo) 085c08.yaml index 5e26dd4ec..985062e13 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Research Notes (Taboo) 085c08.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Research Notes (Taboo) 085c08.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Research Notes a37bd4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Research Notes a37bd4.yaml index b320b79a8..c9b82ffe2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Research Notes a37bd4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Research Notes a37bd4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml index a7d8049dd..bc2594c9c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy (Taboo) 0a5491.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy (Taboo) 0a5491.yaml index 600d99109..bd15aa017 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy (Taboo) 0a5491.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy (Taboo) 0a5491.yaml @@ -21,7 +21,15 @@ Description: The Reporter DragSelectable: true GMNotes: "{\n \"id\": \"02002-t\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02008\": 1\n },\n {\n \"02009\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\": true,\n \"trait\": + [\n \"fortune\"\n ]\n },\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Seeker or Neutral\"\n }\n ]\n}" GUID: 0a5491 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy 4271cb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy 4271cb.yaml index 53d1a5c03..463f1c479 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy 4271cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rex Murphy 4271cb.yaml @@ -21,7 +21,15 @@ Description: The Reporter DragSelectable: true GMNotes: "{\n \"id\": \"02002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Reporter.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 3,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02008\": 1\n },\n {\n \"02009\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"not\": true,\n \"trait\": + [\n \"fortune\"\n ]\n },\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Seeker or Neutral\"\n }\n ]\n}" GUID: 4271cb Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml index 6a489703a..983b65b6c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rex's Curse 033a35.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3719': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml b/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml index 8b625dff0..aa6a339ec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Righteous Hunt (1) 491c09.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml index 19e8015b2..c1ba19cc1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Riot Whistle 55fc3d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml index 23241481d..def8c0b13 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion (3) bb501b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3149': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml index 3af266a3b..5505b48cb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rise to the Occasion 358387.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rita Young bb8296.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rita Young bb8296.yaml index 75e8d15c7..b69f0a66e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rita Young bb8296.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rita Young bb8296.yaml @@ -21,7 +21,14 @@ Description: The Athlete DragSelectable: true GMNotes: "{\n \"id\": \"05005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Miskatonic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 5,\n \"cycle\": \"The Circle Undone\"\n}" + 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 5,\n \"cycle\": \"The Circle Undone\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"05016\": 1\n },\n {\n \"05017\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"trait\": [\n \"trick\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n + \ },\n {\n \"faction\": [\n \"survivor\",\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ }\n ]\n}" GUID: bb8296 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) (Taboo) 2286b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) (Taboo) 2286b4.yaml index 018fd3bd8..561a19e73 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) (Taboo) 2286b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) (Taboo) 2286b4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) 315b45.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) 315b45.yaml index 14a564c7d..27b5da942 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) 315b45.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Equilibrium (5) 315b45.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5897': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.ttslua index 3f73aaab5..7348ce418 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.ttslua @@ -41,40 +41,292 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local TokenArrangerApi = {} + local PlaymatApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } end end - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 end - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end end - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end end - return TokenArrangerApi + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) +__bundle_register("playercards/cards/RiteofSanctification", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Bless"] = true +} + +SHOW_SINGLE_RELEASE = true + +require("playercards/CardsThatSealTokens") +end) __bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local BlessCurseManagerApi = {} @@ -93,35 +345,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -134,7 +392,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -161,29 +419,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -192,14 +451,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -219,29 +482,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -256,15 +521,6 @@ end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/RiteofSanctification") end) -__bundle_register("playercards/cards/RiteofSanctification", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Bless"] = true -} - -SHOW_SINGLE_RELEASE = true - -require("playercards/CardsThatSealTokens") -end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -343,6 +599,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -369,6 +627,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -530,5 +797,122 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.yaml index baccc1335..691641e60 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Sanctification 974743.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5544': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml index e8a844b8c..6a6ff2b9f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (2) 4f2668.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3136': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml index 9a937028e..776f2a262 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking (4) 194adb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml index 34508c094..02c81df5a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rite of Seeking 29b842.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles (Taboo) 7dc746.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles (Taboo) 7dc746.yaml index 1e3c9ceeb..47ec0edf5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles (Taboo) 7dc746.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles (Taboo) 7dc746.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml index 7ad5a9ad5..a71742960 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ritual Candles 0a4db3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml index 60b079d04..bf8e75037 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night (2) ef43db.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml index 232a81d65..197fe6e6e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Robes of Endless Night d9292f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rod of Animalism (1) 0fc42c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rod of Animalism (1) 0fc42c.yaml index af816cbce..2b5d8f68e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rod of Animalism (1) 0fc42c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rod of Animalism (1) 0fc42c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (0) 66ec64.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (0) 66ec64.yaml new file mode 100644 index 000000000..d024e37be --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (0) 66ec64.yaml @@ -0,0 +1,60 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94731 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Scepter of the Mad Seer +DragSelectable: true +GMNotes: "{\n \"id\": \"10085\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Occult. Cursed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": + \"10086\"\n },\n {\n \"count\": 1,\n \"id\": \"10087\"\n },\n + \ {\n \"count\": 1,\n \"id\": \"10088\"\n },\n {\n \"count\": + 1,\n \"id\": \"10089\"\n },\n {\n \"count\": 1,\n \"id\": \"10090\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 66ec64 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rod of Carnamagos (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (2) d8ef99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (2) d8ef99.yaml new file mode 100644 index 000000000..0bd6c1926 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Rod of Carnamagos (2) d8ef99.yaml @@ -0,0 +1,60 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94739 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Scepter of the Mad Seer +DragSelectable: true +GMNotes: "{\n \"id\": \"10098\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic. Occult. Cursed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": + \"10086\"\n },\n {\n \"count\": 1,\n \"id\": \"10087\"\n },\n + \ {\n \"count\": 1,\n \"id\": \"10088\"\n },\n {\n \"count\": + 1,\n \"id\": \"10089\"\n },\n {\n \"count\": 1,\n \"id\": \"10090\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: d8ef99 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Rod of Carnamagos (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -19.81 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Back) 560cef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Back) 560cef.yaml index 841aaa17d..337ee4d32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Back) 560cef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Back) 560cef.yaml @@ -22,7 +22,15 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01001-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 3,\n \ \"intellectIcons\": 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90030\": 1,\n \"98005\": 1,\n + \ \"01006\": 1\n },\n {\n \"90031\": 1,\n \"98006\": + 1,\n \"01007\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"guardian\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n },\n {\n \"faction\": [\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"trait\": [\n \"insight\",\n \"tactic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n }\n ]\n}" GUID: 560cef Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Front) f7361e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Front) f7361e.yaml index 8fa8c6b00..ddd87dfcd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Front) f7361e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel Front) f7361e.yaml @@ -22,7 +22,15 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01001-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 3,\n \ \"intellectIcons\": 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90030\": 1,\n \"98005\": 1,\n + \ \"01006\": 1\n },\n {\n \"90031\": 1,\n \"98006\": + 1,\n \"01007\": 1\n },\n {\n \"90025\": 1,\n \"90026\": + 1,\n \"90027\": 1,\n \"90028\": 1,\n \"90029\": 1\n }\n + \ ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: f7361e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel) 502768.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel) 502768.yaml index e42cb42e4..500165746 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel) 502768.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks (Parallel) 502768.yaml @@ -21,7 +21,18 @@ Description: The Fed DragSelectable: true GMNotes: "{\n \"id\": \"01001-p\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" + 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90030\": 1,\n \"98005\": 1,\n \"01006\": 1\n + \ },\n {\n \"90031\": 1,\n \"98006\": 1,\n \"01007\": + 1\n },\n {\n \"90025\": 1,\n \"90026\": 1,\n \"90027\": + 1,\n \"90028\": 1,\n \"90029\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"faction\": + [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"insight\",\n \"tactic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n + \ }\n ]\n}" GUID: '502768' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 9e9e98.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 9e9e98.yaml index 3f0428a3f..14b28aad8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 9e9e98.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 9e9e98.yaml @@ -22,7 +22,14 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01001\",\n \"alternate_ids\": [\n \"98004\",\n \"01501\"\n \ ],\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n \"combatIcons\": - 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" + 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Core\",\n \"deck_requirements\": {\n + \ \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": [\n + \ {\n \"90030\": 1,\n \"98005\": 1,\n \"01006\": 1\n },\n + \ {\n \"90031\": 1,\n \"98006\": 1,\n \"01007\": 1\n }\n + \ ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 9e9e98 Grid: true GridProjection: false @@ -64,7 +71,16 @@ States: GMNotes: "{\r\n \"id\": \"01001\",\r\n \"alternate_ids\": [\r\n \"98004\",\r\n \ \"01501\"\r\n ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Guardian\",\r\n \ \"traits\": \"Agency. Detective.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" + 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n + \ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": + 1,\r\n \"signatures\": [\r\n {\r\n \"90030\": 1,\r\n \"98005\": + 1,\r\n \"01006\": 1\r\n },\r\n {\r\n \"90031\": 1,\r\n + \ \"98006\": 1,\r\n \"01007\": 1\r\n }\r\n ]\r\n },\r\n + \ \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"guardian\",\r\n + \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n + \ \"seeker\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: a684e0 Grid: true GridProjection: false @@ -122,7 +138,16 @@ States: GMNotes: "{\r\n \"id\": \"01001\",\r\n \"alternate_ids\": [\r\n \"98004\",\r\n \ \"01501\"\r\n ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Guardian\",\r\n \ \"traits\": \"Agency. Detective.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" + 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\",\r\n + \ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": + 1,\r\n \"signatures\": [\r\n {\r\n \"90030\": 1,\r\n \"98005\": + 1,\r\n \"01006\": 1\r\n },\r\n {\r\n \"90031\": 1,\r\n + \ \"98006\": 1,\r\n \"01007\": 1\r\n }\r\n ]\r\n },\r\n + \ \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"guardian\",\r\n + \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n + \ \"seeker\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: e46857 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 4edb91.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 4edb91.yaml index 84c29fbfd..5f395bcbe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 4edb91.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special 4edb91.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5861': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special dbdaff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special dbdaff.yaml index adba261b1..964b74095 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special dbdaff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland's .38 Special dbdaff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5362': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706761486024/CC7FAD210F216229F1A721BF648855D156F052D5/ NumHeight: 2 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml index d6cd1d354..357ff8962 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Rookie Mistake e567ff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5839': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ruined Film 6d2eae.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ruined Film 6d2eae.yaml index 24e00ee3b..2610a8f34 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ruined Film 6d2eae.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ruined Film 6d2eae.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml index 1623f7015..5de7539d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Run For Your Life 0f32e8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe (Taboo) 3e3b99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe (Taboo) 3e3b99.yaml index dc6f2f1c4..fe969018d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe (Taboo) 3e3b99.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe (Taboo) 3e3b99.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe 7cdb0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe 7cdb0a.yaml index f344019bd..f2d5d24b5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe 7cdb0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe 7cdb0a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.ttslua index 745767d84..3e2ac608f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Runic Axe Upgrade Sheet (Taboo) 4d729b.ttslua @@ -329,7 +329,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -562,8 +562,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -573,7 +573,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -587,7 +587,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -595,7 +595,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -606,7 +606,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -614,7 +614,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -622,7 +622,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -630,7 +630,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -638,8 +638,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -647,7 +647,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -655,8 +655,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -675,8 +675,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -684,8 +684,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -693,7 +693,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -704,8 +704,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -713,8 +713,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -722,8 +722,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -731,7 +731,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -739,7 +739,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -749,10 +749,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -760,8 +760,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -769,8 +769,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -794,7 +794,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -802,8 +802,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -815,7 +815,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -840,29 +840,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -887,14 +889,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -907,7 +912,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ríastrad (1) f1f24e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ríastrad (1) f1f24e.yaml index 4ca1cf86c..d48f22461 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ríastrad (1) f1f24e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ríastrad (1) f1f24e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5886': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml index cd5d7d8b4..52c3b9057 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacred Covenant (2) 87226d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml index 92b75aeea..2a9633a9d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacrifice (1) f2877e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml index 61f85cb7e..07b082b2f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sacrificial Beast 46812e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3714': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml index 0880a4c03..d80691181 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Safeguard (2) 7dc42a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4479': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml index 5f3c54a30..6e3c0db13 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Salvage (2) f2e87d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Salvage (2) f2e87d.yaml index dbda4d8ba..0082918f6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Salvage (2) f2e87d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Salvage (2) f2e87d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Savant (1) 5e3aac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Savant (1) 5e3aac.yaml index a089516ac..6979163b1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Savant (1) 5e3aac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Savant (1) 5e3aac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml index fe3eb8dbb..6dd25df7e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sawed-Off Shotgun (5) 4f5f0f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4490': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml index e7c3ed78b..fee1f34c6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Say Your Prayers 5c3dd0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scarlet Rot fe476c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scarlet Rot fe476c.yaml new file mode 100644 index 000000000..2a24d316b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Scarlet Rot fe476c.yaml @@ -0,0 +1,54 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94735 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10089\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Spell. Rot. Cursed.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: fe476c +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Scarlet Rot +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -15.26 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml index 40f74d26d..97c340c11 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging (2) ff4aea.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4487': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml index 5076f9b0c..6a2d921e1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml index 547f96f61..2426c59e1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml index 9c00d4dc1..5218c6c72 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scene of the Crime ab37af.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Schoffner's Catalogue 699a99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Schoffner's Catalogue 699a99.yaml index 3d4df8a30..4b6a1c273 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Schoffner's Catalogue 699a99.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Schoffner's Catalogue 699a99.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml index ee3f0d6ef..b5afadec7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (1) 3a0df6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (3) 158450.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (3) 158450.yaml index cfaac7b76..3f34d4de0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (3) 158450.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scientific Theory (3) 158450.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scout Ahead 927d34.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scout Ahead 927d34.yaml index d3c815d90..a13b33681 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scout Ahead 927d34.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scout Ahead 927d34.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml index f43cdd24b..831db95c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper (3) dffe4a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml index fa3af6fbf..711a5a77c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml index dba8db27f..168c699d2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Prophecies 0d926f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3801': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.ttslua index 536b5234f..ca2c2b5d2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ScrollofSecrets") -end) __bundle_register("playercards/cards/ScrollofSecrets", function(require, _LOADED, __bundle_register, __bundle_modules) -- this script is shared between the lvl 0 and lvl 3 versions of Scroll of Secrets local mythosAreaApi = require("core/MythosAreaApi") @@ -150,17 +147,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -175,8 +174,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -186,7 +185,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -200,7 +199,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -208,7 +207,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -219,7 +218,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -227,7 +226,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -235,7 +234,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -243,7 +242,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -251,8 +250,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -260,7 +259,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -268,8 +267,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -288,8 +287,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -297,8 +296,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -306,7 +305,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -317,8 +316,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -326,8 +325,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -335,8 +334,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -344,7 +343,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -352,7 +351,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -362,10 +361,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -373,8 +372,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -382,8 +381,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -407,7 +406,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -415,8 +414,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -428,7 +427,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -453,29 +452,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -500,14 +501,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -520,7 +524,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -555,4 +559,7 @@ do return SearchLib end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ScrollofSecrets") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.yaml index 83b81a1b4..2ff8e8955 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) 84a7df.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.ttslua index c8b306f4e..94daa68a7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.ttslua @@ -50,17 +50,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -75,8 +77,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -86,7 +88,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -100,7 +102,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -108,7 +110,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -119,7 +121,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -127,7 +129,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -135,7 +137,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -143,7 +145,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -151,8 +153,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -160,7 +162,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -168,8 +170,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -188,8 +190,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -197,8 +199,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -206,7 +208,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -217,8 +219,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -226,8 +228,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -235,8 +237,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -244,7 +246,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -252,7 +254,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -262,10 +264,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -273,8 +275,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -282,8 +284,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -307,7 +309,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -315,8 +317,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -328,7 +330,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -353,29 +355,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -400,14 +404,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -420,7 +427,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.yaml index dee95f2fa..61e323d16 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.ttslua index 2c2ff4ee7..829114464 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ScrollofSecrets") +end) __bundle_register("playercards/cards/ScrollofSecrets", function(require, _LOADED, __bundle_register, __bundle_modules) -- this script is shared between the lvl 0 and lvl 3 versions of Scroll of Secrets local mythosAreaApi = require("core/MythosAreaApi") @@ -147,17 +150,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -172,8 +177,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -183,7 +188,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -197,7 +202,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -205,7 +210,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -216,7 +221,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -224,7 +229,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -232,7 +237,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -240,7 +245,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -248,8 +253,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -257,7 +262,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -265,8 +270,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -285,8 +290,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -294,8 +299,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -303,7 +308,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -314,8 +319,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -323,8 +328,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -332,8 +337,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -341,7 +346,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -349,7 +354,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -359,10 +364,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -370,8 +375,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -379,8 +384,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -404,7 +409,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -412,8 +417,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -425,7 +430,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -450,29 +455,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -497,14 +504,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -517,7 +527,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -552,7 +562,4 @@ do return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ScrollofSecrets") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml index 1e39877f1..151581a21 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2932': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.ttslua index 2c2ff4ee7..0c81a1935 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.ttslua @@ -41,6 +41,124 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ScrollofSecrets") +end) __bundle_register("playercards/cards/ScrollofSecrets", function(require, _LOADED, __bundle_register, __bundle_modules) -- this script is shared between the lvl 0 and lvl 3 versions of Scroll of Secrets local mythosAreaApi = require("core/MythosAreaApi") @@ -147,17 +265,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -172,8 +292,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -183,7 +303,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -197,7 +317,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -205,7 +325,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -216,7 +336,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -224,7 +344,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -232,7 +352,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -240,7 +360,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -248,8 +368,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -257,7 +377,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -265,8 +385,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -285,8 +405,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -294,8 +414,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -303,7 +423,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -314,8 +434,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -323,8 +443,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -332,8 +452,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -341,7 +461,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -349,7 +469,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -359,10 +479,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -370,8 +490,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -379,8 +499,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -404,7 +524,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -412,8 +532,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -425,7 +545,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -442,117 +562,4 @@ do return PlaymatApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ScrollofSecrets") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml index 12c790140..1bc40f2e9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 194d88.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2933': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.ttslua index 65187b79b..829114464 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.ttslua @@ -41,74 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/ScrollofSecrets") end) @@ -218,17 +150,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -243,8 +177,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -254,7 +188,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -268,7 +202,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -276,7 +210,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -287,7 +221,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -295,7 +229,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -303,7 +237,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -311,7 +245,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -319,8 +253,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -328,7 +262,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -336,8 +270,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -356,8 +290,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -365,8 +299,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -374,7 +308,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -385,8 +319,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -394,8 +328,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -403,8 +337,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -412,7 +346,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -420,7 +354,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -430,10 +364,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -441,8 +375,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -450,8 +384,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -475,7 +409,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -483,8 +417,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -496,7 +430,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -521,29 +455,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -555,4 +491,75 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.yaml index a7882ee4c..b62dfa4c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (Taboo) b383b8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.ttslua index 42ea72d22..03b163b8e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.ttslua @@ -41,325 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -373,14 +54,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -393,7 +77,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -537,17 +221,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -555,4 +241,325 @@ do return MythosAreaApi end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml index 6745936b4..f05be7ca7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2776': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml index 0951316b8..214da2518 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrounge for Supplies 7651f3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3802': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml index 3a82882ad..b7310a1d1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying (3) e58d2a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml index ef2bac4a1..6d0fc80f2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml index 72bad0926..358607d76 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying Mirror 6446d1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml index 13b3af483..037f1c941 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sea Change Harpoon 4e405d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5873': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml index d8342f1a4..595c16bff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elder Sign (5) 91e890.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elders (5) d2b649.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elders (5) d2b649.yaml new file mode 100644 index 000000000..047dc7a59 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Elders (5) d2b649.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94745 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10105\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 5,\n \"traits\": \"Spell. Pact. Blessed. Cursed.\",\n + \ \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"10106\"\n },\n {\n + \ \"count\": 1,\n \"id\": \"10107\"\n }\n ],\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: d2b649 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Seal of the Elders (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.ttslua index d8be67b08..17e07cd8d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.ttslua @@ -49,29 +49,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -83,9 +85,6 @@ do return GUIDReferenceApi end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/SealoftheSeventhSign5") -end) __bundle_register("playercards/cards/SealoftheSeventhSign5", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Auto-fail"] = true @@ -93,6 +92,538 @@ VALID_TOKENS = { require("playercards/CardsThatSealTokens") end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/SealoftheSeventhSign5") +end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -171,6 +702,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -197,6 +730,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -358,175 +900,17 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi -end -end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.yaml index 22185dad0..f921cdaef 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Seal of the Seventh Sign (5) 9cbac1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2781': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml index ca0e59d50..dc31d9293 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Search for the Truth 4156cf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3718': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie 426d28.yaml b/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie 426d28.yaml index 28cc8cd12..4a10152ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie 426d28.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Searching for Izzie 426d28.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5869': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Second Wind (2) c3c979.yaml b/unpacked/Bag All Player Cards 15bb07/Card Second Wind (2) c3c979.yaml new file mode 100644 index 000000000..aca43822d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Second Wind (2) c3c979.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94703 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10032\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit. Bold.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: c3c979 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Second Wind (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml b/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml index 0daba6d68..df274cacf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Second Wind baef55.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) 719f7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) 719f7e.yaml index 291a9dbc3..3e90e2e40 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) 719f7e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers (2) 719f7e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5871': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml index f0a104b34..5298e992e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Seeking Answers f69e10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sefina Rousseau 342311.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sefina Rousseau 342311.yaml index 033c497a5..d7ca3986a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sefina Rousseau 342311.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sefina Rousseau 342311.yaml @@ -21,7 +21,13 @@ Description: The Painter DragSelectable: true GMNotes: "{\n \"id\": \"03003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Artist.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 33,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03012\": 3\n },\n {\n \"03013\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: '342311' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml index 67880caad..fcff939f3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Segment of Onyx (1) ff9f23.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4410': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml index 1445ff804..9e383b5ce 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Centered eff3c8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml index 0236646b6..c292a81b8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Destructive 2204cc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml index 4113cc9d1..10fd672e9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Self-Sacrifice 5e808d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Selfless to a Fault 07dd55.yaml b/unpacked/Bag All Player Cards 15bb07/Card Selfless to a Fault 07dd55.yaml index 5d404133b..a65011281 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Selfless to a Fault 07dd55.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Selfless to a Fault 07dd55.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5877': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml index 957072d65..4df76cb8d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sell Your Soul 180b5b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml index 87f691b65..e42f7e718 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sergeant Monroe 5630c2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5349': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.ttslua index fa9271ee7..b82389d15 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.ttslua @@ -41,6 +41,414 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/SerpentsofYig") end) @@ -129,6 +537,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -155,6 +565,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -316,6 +735,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -323,8 +754,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -333,7 +764,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -369,35 +800,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -405,128 +842,75 @@ do return BlessCurseManagerApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local ChaosBagApi = {} + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) + -- 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 - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 + 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 }) + + -- filtering the result + 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 end - return GUIDReferenceApi + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.yaml b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.yaml index 2ce095c22..b187b742b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Serpents of Yig 678391.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2328': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml new file mode 100644 index 000000000..e3e70ba74 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Servant of Brass 06bc7e.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94747 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Daemonaic Vassal +DragSelectable: true +GMNotes: "{\n \"id\": \"10107\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Summon.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 06bc7e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Servant of Brass +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml index 50a6ae7c8..30f655754 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shadow Agents 9be144.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5864': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.ttslua index 3fee89c6f..77e6ccf0e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.ttslua @@ -41,6 +41,591 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("playercards/cards/ShardsoftheVoid3", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["0"] = true +} + +SHOW_SINGLE_RELEASE = true + +require("playercards/CardsThatSealTokens") +end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ShardsoftheVoid3") +end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -119,6 +704,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -145,6 +732,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -306,229 +902,17 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ShardsoftheVoid3") -end) -__bundle_register("playercards/cards/ShardsoftheVoid3", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["0"] = true -} - -SHOW_SINGLE_RELEASE = true - -require("playercards/CardsThatSealTokens") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.yaml index 6c5ac669d..36db0fea9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shards of the Void (3) b10a71.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2781': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml index 834722c4a..e7757c30b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sharp Vision (1) 4d9a97.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4477': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) (Taboo) 77b1e7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) (Taboo) 77b1e7.yaml index 87e64dc57..01a654328 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) (Taboo) 77b1e7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) (Taboo) 77b1e7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml index 863837a3d..de46518d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sharpshooter (3) 7f27d6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shed a Light (Taboo) 44292c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shed a Light (Taboo) 44292c.yaml index f3429c584..b5911732e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shed a Light (Taboo) 44292c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shed a Light (Taboo) 44292c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shed a Light 2c165a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shed a Light 2c165a.yaml index 2c6cf2421..ddd9030fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shed a Light 2c165a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shed a Light 2c165a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml index 04df23492..e41b77909 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shell Shock bcf406.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4317': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.ttslua index 1db2d727a..f03065acc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.ttslua @@ -41,6 +41,113 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/ShieldofFaith2") +end) __bundle_register("playercards/cards/ShieldofFaith2", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Bless"] = true @@ -129,6 +236,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -155,6 +264,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -316,6 +434,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -323,8 +453,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -333,7 +463,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -351,66 +481,12 @@ do return TokenArrangerApi end end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) __bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -437,29 +513,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -468,14 +545,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -487,49 +568,352 @@ do return ChaosBagApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") - local function getGuidHandler() - return getObjectFromGUID("123456") + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type) - return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type }) + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 end - -- returns all matching objects as a table with references - ---@param type String Type of object to search for - GUIDReferenceApi.getObjectsByType = function(type) - return getGuidHandler().call("getObjectsByType", type) + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - GUIDReferenceApi.getObjectsByOwner = function(owner) - return getGuidHandler().call("getObjectsByOwner", owner) + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end 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 - }) + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end end - return GUIDReferenceApi + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ShieldofFaith2") +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.yaml index a1f7eeebb..7566f6624 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shield of Faith (2) 06abe0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5890': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml index a7f8427cf..995cd2b32 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shining Trapezohedron (4) b4b991.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5272': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml index 18ce4c687..8db9afdfa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shocking Discovery f4dd3d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5837': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.ttslua index f4bf23cc0..d24848289 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.ttslua @@ -41,6 +41,283 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -49,29 +326,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -96,14 +375,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -116,7 +398,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -191,281 +473,4 @@ function shortSupply(color) end end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.yaml b/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.yaml index 0be5371a6..6f4e8bf0b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Short Supply e5f541.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 29169e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 29169e.yaml index 1ac0bb50f..1d5fef2eb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 29169e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shortcut (2) 29169e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5853': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml index f49c2a563..3c7cad2e7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml index ac5769046..fe986ef98 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shotgun (4) c92ea3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml index c98436076..51fda32bf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5802': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml index 9b6e56645..5d2edee10 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Analysis 658d38.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrewd Dealings c70129.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Dealings c70129.yaml index 55fdcd0ba..9d08596e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrewd Dealings c70129.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrewd Dealings c70129.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrine of the Moirai (3) 1934c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrine of the Moirai (3) 1934c6.yaml index efed1a6a3..6f824829e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrine of the Moirai (3) 1934c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrine of the Moirai (3) 1934c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5899': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1807607979163972370/50A45AE585D6404E677DFCA597A0F5FE13346B97/ NumHeight: 4 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml index b6e7c368c..52cb6bfc5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (3) b3ce16.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml index c65507ee9..81729f8ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling (5) 7a33b2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml index 024f2d69d..19f99e679 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows (4) 12bdf1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows (4) 12bdf1.yaml index 342c931cf..f99a1b60d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows (4) 12bdf1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows (4) 12bdf1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml index f1df80a58..2004acd21 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shroud of Shadows a565d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sign Magick (3) f998c5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick (3) f998c5.yaml index 9aa3c050c..08819f392 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sign Magick (3) f998c5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick (3) f998c5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml index 11b6b9f46..89d64b2b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sign Magick 05d263.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2775': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) (Taboo) 750b7a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) (Taboo) 750b7a.yaml index f8366b64f..e685ec460 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) (Taboo) 750b7a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) (Taboo) 750b7a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) c73bb0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) c73bb0.yaml index 547d20ab4..e4289c735 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) c73bb0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Signum Crucis (2) c73bb0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5885': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 3f92cf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 3f92cf.yaml index 650c5a17d..0bcef2985 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 3f92cf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 3f92cf.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07005\",\n \"alternate_ids\": [\n \"98013\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 4,\n \"cycle\": - \"The Innsmouth Conspiracy\"\n}" + \"The Innsmouth Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"98014\": 1,\n \"07014\": 1,\n + \ \"07015\": 1\n },\n {\n \"98015\": 1,\n \"07016\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"innate\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 3f92cf Grid: true GridProjection: false @@ -64,7 +70,16 @@ States: GMNotes: "{\r\n \"id\": \"07005\",\r\n \"alternate_ids\": [\r\n \"98013\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 2,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": - 4,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" + 4,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"The Innsmouth Conspiracy\",\r\n + \ \"deck_requirements\": {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": + 1,\r\n \"signatures\": [\r\n {\r\n \"98014\": 1,\r\n \"07014\": + 1,\r\n \"07015\": 1\r\n },\r\n {\r\n \"98015\": 1,\r\n + \ \"07016\": 1\r\n }\r\n ]\r\n },\r\n \"deck_options\": [\r\n + \ {\r\n \"faction\": [\r\n \"survivor\",\r\n \"neutral\"\r\n + \ ],\r\n \"level\": {\r\n \"min\": 0,\r\n \"max\": 5\r\n + \ }\r\n },\r\n {\r\n \"trait\": [\r\n \"innate\"\r\n ],\r\n + \ \"level\": {\r\n \"min\": 0,\r\n \"max\": 2\r\n }\r\n + \ }\r\n ]\r\n}\r\n" GUID: cd3308 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml index 3cb1f684e..7a0e7d552 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Silas's Net 4f11a2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5823': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml index 9b158b7d8..dee7740a5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Silver Twilight Acolyte 16a89d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sin-Eater (3) 0c77d6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sin-Eater (3) 0c77d6.yaml index b965d0fb3..f174de551 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sin-Eater (3) 0c77d6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sin-Eater (3) 0c77d6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sinha's Medical Kit 8d6475.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sinha's Medical Kit 8d6475.yaml index e007c3a8e..a9330d384 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sinha's Medical Kit 8d6475.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sinha's Medical Kit 8d6475.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml b/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml index 4c5ad89c7..ad412368e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Siren Call b9fbff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5851': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sister Mary 617aeb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sister Mary 617aeb.yaml index 42410abe9..57da02c2d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sister Mary 617aeb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sister Mary 617aeb.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Believer. Blessed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" + Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"07006\": 1\n },\n {\n \"07007\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"mystic\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 617aeb Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml index 174fd86cf..37830d367 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense (4) 060943.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml index 327d56315..9124ea7ff 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sixth Sense 6eceef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2775': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Back) a03077.yaml b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Back) a03077.yaml index 6bdba9765..59ee93b46 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Back) a03077.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Back) a03077.yaml @@ -21,7 +21,14 @@ Description: The Ex-Con DragSelectable: true GMNotes: "{\n \"id\": \"01003-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Criminal.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 25,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90009\": 1,\n \"01010\": 1\n },\n {\n \"90010\": + 1,\n \"01011\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"rogue\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"gambit\",\n + \ \"fortune\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n }\n ]\n}" GUID: a03077 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Front) 8116a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Front) 8116a6.yaml index ac96c9dcc..82ca83f05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Front) 8116a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel Front) 8116a6.yaml @@ -21,7 +21,14 @@ Description: The Ex-Con DragSelectable: true GMNotes: "{\n \"id\": \"01003-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Criminal.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": - 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\"\n}" + 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90009\": 1,\n \"01010\": 1\n },\n {\n \"90010\": + 1,\n \"01011\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"rogue\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n + \ }\n ]\n}" GUID: 8116a6 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel) 22ebb2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel) 22ebb2.yaml index 1cf8d92d1..cab89cb9c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel) 22ebb2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole (Parallel) 22ebb2.yaml @@ -21,7 +21,14 @@ Description: The Ex-Con DragSelectable: true GMNotes: "{\n \"id\": \"01003-p\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 3,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 25,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90009\": 1,\n \"01010\": 1\n },\n {\n \"90010\": + 1,\n \"01011\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"rogue\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"gambit\",\n + \ \"fortune\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 3\n }\n }\n ]\n}" GUID: 22ebb2 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 9015b4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 9015b4.yaml index 29f593383..62d5d00d1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 9015b4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 9015b4.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01003\",\n \"alternate_ids\": [\n \"01503\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Criminal.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 3,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90009\": 1,\n \"01010\": 1\n + \ },\n {\n \"90010\": 1,\n \"01011\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 9015b4 Grid: true GridProjection: false @@ -64,7 +70,15 @@ States: GMNotes: "{\r\n \"id\": \"01003\",\r\n \"alternate_ids\": [\r\n \"01503\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Rogue\",\r\n \"traits\": \"Criminal.\",\r\n \"willpowerIcons\": 2,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": - 3,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"Core\"\r\n}\r" + 3,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"Core\",\r\n \"deck_requirements\": + {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": + [\r\n {\r\n \"90009\": 1,\r\n \"01010\": 1\r\n },\r\n + \ {\r\n \"90010\": 1,\r\n \"01011\": 1\r\n }\r\n ]\r\n + \ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"rogue\",\r\n + \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n + \ \"guardian\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: a41f81 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sled Dog 852697.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sled Dog 852697.yaml index 2e6740e32..1ac2e3c5e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sled Dog 852697.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sled Dog 852697.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer (4) ae3ff5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer (4) ae3ff5.yaml index f98ad1d77..ad0430493 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer (4) ae3ff5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer (4) ae3ff5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml index f46835688..2fbc48dbd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 0d84b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 0d84b2.yaml index 353b99df7..3538e2f73 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 0d84b2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand (Taboo) 0d84b2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml index a9e74782e..c55b5df21 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sleight of Hand 819aee.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sleuth (3) 1bdb15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sleuth (3) 1bdb15.yaml index f637224d7..7ff42d575 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sleuth (3) 1bdb15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sleuth (3) 1bdb15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml index acac98c34..66d680447 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Slip Away (2) 4a45c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml index 94121cb63..df01776be 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Slip Away cf1d4e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml index 3281fefae..4cb20ba63 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Small Favor bf5a5f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Small Radio c9feda.yaml b/unpacked/Bag All Player Cards 15bb07/Card Small Radio c9feda.yaml index ea60a8de0..743119b7e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Small Radio c9feda.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Small Radio c9feda.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f534.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f534.yaml index e523d2291..4dded9f17 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f534.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f534.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5828': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f535.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f535.yaml index e7e508b51..31bdcbb30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f535.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Smite the Wicked 58f535.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115062479282090841/27F874D8E240CE62A38A47DDFAAF58D3BD4D0C42/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml index a9e8ceb8f..633031b88 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Smoking Pipe 603e29.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml b/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml index f1e6529fc..5530af929 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Smuggled Goods 1f3880.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3769': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml index 150d8919c..4830e0f2d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Snare Trap (2) f66dd9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml index b78364823..80612fee4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack (2) 5f19e0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml index d2bd9918e..426ac0d05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak Attack b18b33.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml index 0a6381e7d..e1bf65fe5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sneak By d099f4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Snipe (1) 79cbc6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Snipe (1) 79cbc6.yaml index 4cbc98102..e33fd77b9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Snipe (1) 79cbc6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Snipe (1) 79cbc6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml b/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml index 065e67789..203735159 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Solemn Vow ef7c11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4409': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml b/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml index 40ed282b7..fedcefd33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Something Worth Fighting For a3f105.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml b/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml index aaff86f52..28644fdd2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Song of the Dead (2) 2ae3ce.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml b/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml index ecb1ea9ae..f286dfd3c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Soothing Melody 53f076.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3786': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Soul Sanctification (3) 52f6d6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Soul Sanctification (3) 52f6d6.yaml index 0e2795927..bdaf133a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Soul Sanctification (3) 52f6d6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Soul Sanctification (3) 52f6d6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spare Parts 9e136f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spare Parts 9e136f.yaml index bea0c95f1..5d1f1f873 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spare Parts 9e136f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spare Parts 9e136f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sparrow Mask 975d79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sparrow Mask 975d79.yaml index 1f92cfeaa..e5a68767d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sparrow Mask 975d79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sparrow Mask 975d79.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor (2) b38ded.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor (2) b38ded.yaml new file mode 100644 index 000000000..166d3a667 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor (2) b38ded.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94743 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10102\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: b38ded +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Spectral Razor (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -26.64 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml index 97adc01bf..4f5913945 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spectral Razor 8e8a14.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml index d320fba27..e598b8457 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spectral Web 863f1a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2757': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml index ef748c31a..bbd9fdba7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spirit Athame (1) 90a106.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spirit of Humanity (2) e5901b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spirit of Humanity (2) e5901b.yaml index 6776e09bd..b961179fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spirit of Humanity (2) e5901b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spirit of Humanity (2) e5901b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5799': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191219101327/797556CAC112D6D289B3A5D3A28433C9F0999CB5/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml index 555ec6c07..c62da1c3d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spirit-Speaker a33470.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3750': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml index 73a2e14f9..adb466e6b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Spiritual Resolve (5) 26922c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4489': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml b/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml index 8289b875e..0540aac21 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Split the Angle 67e006.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3810': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) 23f8ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) 23f8ec.yaml index ea6cbc3fc..b57215ef5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) 23f8ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) (Taboo) 23f8ec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml index 717a92ed0..625fab60a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Springfield M1903 (4) a7944d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml b/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml index b1bb20dc5..93e73ab9a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card St. Hubert's Key 423d46.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stall for Time 7b6ed1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stall for Time 7b6ed1.yaml index eff3f28bb..e48e7a65c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stall for Time 7b6ed1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stall for Time 7b6ed1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml index cb5110720..ea9298fa7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stand Together (3) cd7b97.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml index b1597d7a0..e5c844d4c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stand Together 7ec473.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml index f1f74df12..0df64c677 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stargazing (1) 968a26.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4440': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml index f6b3c66a9..22d20972b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stars of Hyades 1890d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3741': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml b/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml index 202b65b7d..92634f346 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4310': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Steady-Handed (1) 9181f7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Steady-Handed (1) 9181f7.yaml new file mode 100644 index 000000000..fc7139c60 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Steady-Handed (1) 9181f7.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94714 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10053\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Talent. Science.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 9181f7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Steady-Handed (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml index febb127e5..682d17204 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stealth (3) 26a3bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4407': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml index 1fe1acf57..bcb781f05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stella Clark 00e18e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stella Clark 00e18e.yaml index b292f7ce0..2dd9d3ea0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stella Clark 00e18e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stella Clark 00e18e.yaml @@ -21,7 +21,12 @@ Description: The Letter Carrier DragSelectable: true GMNotes: "{\n \"id\": \"60501\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Chosen. Civic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Investigator Packs\"\n}" + 2,\n \"combatIcons\": 3,\n \"agilityIcons\": 4,\n \"cycle\": \"Investigator Packs\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"60502\": 3\n },\n {\n \"60503\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n }\n ]\n}" GUID: 00e18e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml index ab45988e4..f86de3c87 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stick to the Plan (3) 82d62c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stir the Pot (0) c25479.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stir the Pot (0) c25479.yaml new file mode 100644 index 000000000..469e0e5dc --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Stir the Pot (0) c25479.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94724 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10073\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Trick. Gambit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: c25479 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Stir the Pot (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 61.63 + posY: 3.67 + posZ: -17.53 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml index 9c644733e..28551a214 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stirring Up Trouble (1) e99f0d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml index 2da37a73a..b834c71d9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits (3) 1e9213.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4440': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml index efad940f7..1e56f8be6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Storm of Spirits 9c922f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) (Taboo) 1be7f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) (Taboo) 1be7f1.yaml index c2efff002..03a39d1b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) (Taboo) 1be7f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) (Taboo) 1be7f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml index c85813936..048423238 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 4874bc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml index deac39971..118c32c20 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) 9afe23.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml index cce3b16fa..245c55f42 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) d96e4b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3139': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml index 80fe3f230..cd3e1b237 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution (4) fa61ba.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml index 885a94282..52270e737 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strange Solution 565b6b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml index 3dbb0305c..f80a3370d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stray Cat f474b1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml index edbc87127..7ddea6602 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise (3) d7dbac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml index 9835888e5..b731f360f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5386': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298037683/22C99DD745DFF65ECC72FD32EFA9C9D0F0C12862/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Strength in Numbers (1) 4e6d80.yaml b/unpacked/Bag All Player Cards 15bb07/Card Strength in Numbers (1) 4e6d80.yaml index fa77521ab..04232746e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Strength in Numbers (1) 4e6d80.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Strength in Numbers (1) 4e6d80.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card String of Curses 046b16.yaml b/unpacked/Bag All Player Cards 15bb07/Card String of Curses 046b16.yaml index e26b4c28c..aba0addf4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card String of Curses 046b16.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card String of Curses 046b16.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml index 28abf0c6b..8eddde275 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stroke of Luck (2) 06228f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml index ca52cd440..4a08c951f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml b/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml index b228e9904..037bf5a23 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Studious (3) 4ea716.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5924': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml index 4ebc96927..89057a481 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stunning Blow 58c435.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml index f88bf16f5..e2c0ac09d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Stylish Coat (1) 0a1b3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Stylish Coat (1) 0a1b3a.yaml index 0a584b3ca..41efdbf23 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stylish Coat (1) 0a1b3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stylish Coat (1) 0a1b3a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Subject 5U-21 758b0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Subject 5U-21 758b0a.yaml index e6060bb9a..d7f4c3886 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Subject 5U-21 758b0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Subject 5U-21 758b0a.yaml @@ -21,7 +21,18 @@ Description: The Anomaly DragSelectable: true GMNotes: "{\n \"id\": \"89001\",\n \"type\": \"Investigator\",\n \"class\": \"Neutral\",\n \ \"traits\": \"Manifold.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n - \ \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Standalone\"\n}" + \ \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Standalone\",\n \"deck_requirements\": + {\n \"size\": 50,\n \"randomBasicWeaknessCount\": 2,\n \"signatures\": + [\n {\n \"89002\": 1\n },\n {\n \"89003\": 3\n },\n + \ {\n \"89004\": 3\n }\n ]\n },\n \"deck_options\": [\n {\n + \ \"not\": true,\n \"permanent\": true,\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n },\n \"error\": \"No permanents except story + and signature permanents\"\n },\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"guardian\",\n \"seeker\",\n + \ \"rogue\",\n \"mystic\",\n \"survivor\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"error\": \"You must + have at least 7 cards from each class\"\n }\n ]\n}" GUID: 758b0a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml index 3b87cd6e8..c818e1fb3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (1) 0ec9bf.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4407': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml index 0c20b1a38..dfa2f37a9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Suggestion (4) e7f37b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml index 9224c8aa7..d9211ef71 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Summoned Hound (1) ab4fb3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5272': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Summoned Servitor 73b311.yaml b/unpacked/Bag All Player Cards 15bb07/Card Summoned Servitor 73b311.yaml index a17220b9c..cd7324def 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Summoned Servitor 73b311.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Summoned Servitor 73b311.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml index a93cad259..e7f47f94e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sure Gamble (3) 308be1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Surgical Kit (3) c8ecf2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Surgical Kit (3) c8ecf2.yaml index 1ff71f0be..985a04000 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Surgical Kit (3) c8ecf2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Surgical Kit (3) c8ecf2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml index 22b498481..107453093 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Surprising Find (1) ff59dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4488': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survey the Area (1) 6aa5dc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survey the Area (1) 6aa5dc.yaml index fa5d27e15..b70966010 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Survey the Area (1) 6aa5dc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Survey the Area (1) 6aa5dc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml index 0b9c8a813..7e491336e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct (2) be4abe.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml index 9dd175a43..2266ce2e2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Instinct 078efb.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml index 43d643735..5f8715d52 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife (2) c1d796.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml index 5f6e9a486..4b13fb014 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Survival Knife 4d971e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sweeping Kick (1) b4d67b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sweeping Kick (1) b4d67b.yaml index 3321772b7..52cc896f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sweeping Kick (1) b4d67b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sweeping Kick (1) b4d67b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml b/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml index 57058ddd5..c8e4f4232 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Swift Reflexes c2d211.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2777': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml index fe8b26a1e..348a662b3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Swift Reload (2) 2cfa4f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3800': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml index 97a85addf..218cb5d9b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade (2) 2fba3b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml b/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml index 17da55c5c..8541f6917 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3686': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml index 8b1938ce5..12f00c287 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sword Cane 9c32e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5824': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Takada's Cache e627e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Takada's Cache e627e8.yaml index 20c4c57d3..419322561 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Takada's Cache e627e8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Takada's Cache e627e8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4523': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583875023/F146A60AEF1FBC9B5FC96189BC1894C468C1E811/ NumHeight: 2 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml index 9716cfc9a..a387b7255 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml b/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml index cfd3386c3..8eaa72e24 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Take the Initiative 50fb37.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Talisman of Protection 7b4b0c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Talisman of Protection 7b4b0c.yaml index 3273e506e..02905503f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Talisman of Protection 7b4b0c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Talisman of Protection 7b4b0c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Task Force (0) a5c06a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Task Force (0) a5c06a.yaml new file mode 100644 index 000000000..5e6e9ad44 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Task Force (0) a5c06a.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94702 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10027\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic. Double.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: a5c06a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Task Force (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 64.79 + posY: 3.67 + posZ: -33.46 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml index 3bfcfe6bd..667ef6e92 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt (2) 9956d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml index d665b812b..36c19d7e0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt (3) 85fe46.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml index 563d9bec5..0b8d826e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml index 25c16d475..6fc9e4134 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Teachings of the Order 90fdb0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5819': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280867313/BFD2AF968EAC917D3B838DCB8B1656941CD8B5CC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml index 6f6f291a2..d39609876 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 05e697.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 05e697.yaml index 9fef2c87c..b75dde879 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 05e697.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 05e697.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ba293.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ba293.yaml index ec1e18914..5a3a0127e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ba293.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ba293.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ef2ba.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ef2ba.yaml index f6e2f83bf..c944859d5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ef2ba.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 0ef2ba.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 361f15.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 361f15.yaml index 3adc52595..a0a7ae782 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 361f15.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 361f15.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 519e41.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 519e41.yaml index 8143f3ca9..edf701f90 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 519e41.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 519e41.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 76409f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 76409f.yaml index 4c6151492..3c9e63294 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 76409f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li 76409f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li f5bd65.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li f5bd65.yaml index ae564e366..46558e8a3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li f5bd65.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tekeli-li f5bd65.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4497': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462583844492/A3CE36420BC4AE8D863014F3F8B84C1A6047EBEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) (Taboo) 43cb9f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) (Taboo) 43cb9f.yaml index 313a0ccc5..178e8bff2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) (Taboo) 43cb9f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) (Taboo) 43cb9f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml index 210cfc0ee..e82ba3ba1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Telescopic Sight (3) db2c81.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2928': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml index b0ea1b5ad..f89381547 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tempt Fate 33f906.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5835': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml index 4cf206968..a6500fde9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) b5e5f1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2929': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml index 5070c6d78..76efb2ffc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash (3) cbe256.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2930': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml index ad1ec5f57..8560c520b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tennessee Sour Mash be33f5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2776': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml index b619387f2..9a0f953da 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Terrible Secret 06322f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5275': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Testing Sprint (0) a4846b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Testing Sprint (0) a4846b.yaml new file mode 100644 index 000000000..3af69ed58 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Testing Sprint (0) a4846b.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94711 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10047\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight. Double.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of + Hemlock Vale\"\n}" +GUID: a4846b +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Testing Sprint (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 55.3 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml index c9c9451d1..fb47d6af5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tetsuo Mori 08e5a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3798': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml index 75389e54d..1b5d37735 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The 13th Vision c1ce8e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2903': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml index 590f2df41..5c56341ce 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Bell Tolls 6cbc01.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5376': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml index 3bc6ad387..db66a0ced 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Black Book ae3775.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2757': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/829135524526809828/AB799C8FFD9024655A9F179CCFF1EE30DE0D3C75/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml index a6c841883..338b805f1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Black Cat (5) 16e57b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4486': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Black Fan (3) 3eafd5.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Black Fan (3) 3eafd5.yaml index 2b7ac9093..e6c2a2c51 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Black Fan (3) 3eafd5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Black Fan (3) 3eafd5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.ttslua b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.ttslua index d716cb996..57180917a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.ttslua @@ -41,6 +41,367 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/TheChthonianStone3") +end) +__bundle_register("playercards/cards/TheChthonianStone3", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, +} + +require("playercards/CardsThatSealTokens") +end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -119,6 +480,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -145,6 +508,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -306,6 +678,62 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -313,8 +741,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -323,7 +751,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -359,35 +787,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -400,7 +834,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -427,29 +861,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -458,14 +893,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -477,59 +916,4 @@ do return ChaosBagApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/TheChthonianStone3") -end) -__bundle_register("playercards/cards/TheChthonianStone3", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, -} - -require("playercards/CardsThatSealTokens") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.yaml index c06448091..d60310e19 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone (3) a775ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.ttslua b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.ttslua index 4283db682..d1ba9a9a5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.ttslua @@ -41,133 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/TheChthonianStone") -end) __bundle_register("playercards/cards/TheChthonianStone", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Skull"] = true, @@ -256,6 +129,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -282,6 +157,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -443,6 +327,18 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -450,8 +346,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -460,7 +356,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -496,35 +392,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -532,4 +434,486 @@ do return BlessCurseManagerApi end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/TheChthonianStone") +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.yaml index 5b43de934..176a43145 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.ttslua b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.ttslua index 527a2ed75..dd4074d89 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.ttslua @@ -41,14 +41,104 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/TheCodexofAges") +end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local TokenArrangerApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -57,7 +147,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -93,35 +183,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -129,138 +225,361 @@ do return BlessCurseManagerApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local ChaosBagApi = {} + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } end - return chaosBagContents end - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 end - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end end - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end end - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end end - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end end - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end end - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end end - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end end - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end end - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 end - return ChaosBagApi + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 + -- 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 }) + + -- filtering the result + 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 end - return GUIDReferenceApi + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/TheCodexofAges") -end) __bundle_register("playercards/cards/TheCodexofAges", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Elder Sign"] = true } +RESOLVE_TOKEN = true + require("playercards/CardsThatSealTokens") end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -341,6 +660,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -367,6 +688,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -528,5 +858,61 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end + +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return + end + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.yaml index 89e42ce65..4022a672c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5831': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml index d73eaf25d..9fbd0959a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Council's Coffer (2) 0e39c2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Devil ∙ XV 7bcaf3.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Devil ∙ XV 7bcaf3.yaml index 3e1d00976..d82e04fa8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Devil ∙ XV 7bcaf3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Devil ∙ XV 7bcaf3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml index 66d77fec2..8de4caf8f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Dirge of Reason fe68c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3699': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml index 8ffdd9d10..b319da787 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Eye of Truth (5) d6085d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4488': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943833/DE98A03934DF8FF5B3CF6C53143B15BFC3ED7341/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Fool ∙ 0 (3) b74c69.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Fool ∙ 0 (3) b74c69.yaml index 0a023307a..ecd9a782b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Fool ∙ 0 (3) b74c69.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Fool ∙ 0 (3) b74c69.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml index a6884a3b3..4f84e063f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Gold Pocket Watch (4) 62d930.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Harbinger e9fef2.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Harbinger e9fef2.yaml index 37e0c340a..000238835 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Harbinger e9fef2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Harbinger e9fef2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Hierophant ∙ V (3) 20c8a9.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Hierophant ∙ V (3) 20c8a9.yaml index 78e6eb381..5089ddfbd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Hierophant ∙ V (3) 20c8a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Hierophant ∙ V (3) 20c8a9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml index 503ff0a4e..188a4e282 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Home Front b80459.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3743': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) 2d94ed.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) 2d94ed.yaml index 7e90fcb67..cc5fd1844 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) 2d94ed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Hungering Blade (1) 2d94ed.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5904': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml b/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml index 8243eb5f3..0c69cd0bc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The King in Yellow 016b72.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3746': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml index c3281db1d..c1c18334e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Man in the Pallid Mask 6720ef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2323': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Moon ∙ XVIII (1) e80bd8.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Moon ∙ XVIII (1) e80bd8.yaml index 65ef25ce4..bd76a83ea 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Moon ∙ XVIII (1) e80bd8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Moon ∙ XVIII (1) e80bd8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5276': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 4b7a8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 4b7a8e.yaml index c09b0aa0a..137de91f9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 4b7a8e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) (Taboo) 4b7a8e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml index 2b1038494..ba0d3f514 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon (5) 96ba38.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml index 8c26325ce..495fcda83 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon 6b2550.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3703': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 @@ -21,7 +21,8 @@ Description: John Dee Translation DragSelectable: true GMNotes: "{\n \"id\": \"01009\",\n \"alternate_ids\": [\n \"01509\"\n ],\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Neutral\",\n \"traits\": \"Item. - Tome.\",\n \"weakness\": true,\n \"cycle\": \"Core\"\n}" + Tome.\",\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Horror\",\n + \ \"token\": \"horror\"\n }\n ],\n \"weakness\": true,\n \"cycle\": \"Core\"\n}" GUID: 6b2550 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml index 525435e87..8fec84c5c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Necronomicon d45f10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml index 796c65b55..629e9c063 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Painted World dfd48b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3740': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml index b2535cc7c..f1a9bada6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Price of Failure dc5b38.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5376': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Raven Quill b81037.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Raven Quill b81037.yaml index 984fe7748..68ec6863f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Raven Quill b81037.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Raven Quill b81037.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (2) 814c79.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (2) 814c79.yaml index f64b21a5e..f9fcca59b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (2) 814c79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (2) 814c79.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (5) 696894.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (5) 696894.yaml index b7ae0934f..e65369c93 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (5) 696894.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Red Clock (5) 696894.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml index 887c85d5e..a2806e61d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Red-Gloved Man (5) ad18a6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml index aa31bb750..f6096a477 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Silver Key 61fd07.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2788': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493383646802545/EF89145CA7EEC1746A59CCBDDEE52526997C5DED/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Silver Moth 2c6dc1.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Silver Moth 2c6dc1.yaml new file mode 100644 index 000000000..478416ad7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card The Silver Moth 2c6dc1.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94761 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10137\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Item. Relic.\",\n \"weakness\": true,\n + \ \"basicWeaknessCount\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 2c6dc1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: The Silver Moth +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 48.98 + posY: 3.67 + posZ: -22.08 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) 5d559a.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) 5d559a.yaml index 0374d0405..46260e306 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) 5d559a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Skeleton Key (2) 5d559a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5814': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Star ∙ XVII (3) a77ce0.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Star ∙ XVII (3) a77ce0.yaml index ae4f1da25..54ca709f2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Star ∙ XVII (3) a77ce0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Star ∙ XVII (3) a77ce0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml index 0a0467870..ede6b5d79 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Stars Are Right 600a3c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4437': BackIsHidden: true - BackURL: https://i.imgur.com/sRsWiSG.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940351785/F64D8EFB75A9E15446D24343DA0A6EEF5B3E43DB/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Stygian Eye (3) c4ae95.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Stygian Eye (3) c4ae95.yaml index dca69817a..49c1f8593 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Stygian Eye (3) c4ae95.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Stygian Eye (3) c4ae95.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4496': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1747933191220177818/637923621F747375066D4DA39BEA3BA9C26086A5/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml index 0e628fa93..a31f3a148 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Tattered Cloak 5d30a1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2323': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107058378761608/B291D276D6FF71FDB43B69DE7507D56767BE975E/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml index 44be0d488..fc3dc9e10 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Thing That Follows da227d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4311': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Tower ∙ XVI d5c93d.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Tower ∙ XVI d5c93d.yaml index 49874a2eb..02e9c7113 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Tower ∙ XVI d5c93d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Tower ∙ XVI d5c93d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2903': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml index 06a18b1d1..22630d79b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The Truth Beckons ca1b5c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card The World ∙ XXI (3) 372b5b.yaml b/unpacked/Bag All Player Cards 15bb07/Card The World ∙ XXI (3) 372b5b.yaml index 61a13e021..9bf9c166c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card The World ∙ XXI (3) 372b5b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card The World ∙ XXI (3) 372b5b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml index a1d894632..dd02d92c9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2611': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit (3) be8d1f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit (3) be8d1f.yaml index 043e360cb..85b593ec3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit (3) be8d1f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit (3) be8d1f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit 857b53.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit 857b53.yaml index 1f2d2a393..f6b9515c8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit 857b53.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thieves' Kit 857b53.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml index 877018a02..590b3870c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet (2) 3e0653.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3153': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml index c6ffd4292..5f6d99965 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Think on Your Feet 6fec31.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Third Time's a Charm (2) 45956a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Third Time's a Charm (2) 45956a.yaml index a2390c72a..bb2161324 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Third Time's a Charm (2) 45956a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Third Time's a Charm (2) 45956a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml index a07641e67..3d7701f8c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thomas Dawson 1f7e6e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3698': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663476/95B0BD966B579DEE644A25703730C8729B16AAF8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thorough Inquiry (0) c6b644.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thorough Inquiry (0) c6b644.yaml new file mode 100644 index 000000000..ec1e85a7f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Thorough Inquiry (0) c6b644.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94712 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10048\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Double.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: c6b644 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Thorough Inquiry (0) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 58.47 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) (Taboo) baa553.yaml b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) (Taboo) baa553.yaml index be6fad121..0d49d3b68 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) (Taboo) baa553.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) (Taboo) baa553.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml index 5c2071d72..e890f39a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Three Aces (1) 30062e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4476': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml b/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml index 52a476f2c..859a435c1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thrice-Damned Curiosity 3eef18.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml b/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml index 78a85e083..50090f01e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Through the Gates fd9c56.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5274': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tidal Memento b4f9ee.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tidal Memento b4f9ee.yaml index bde1dc131..608b54653 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tidal Memento b4f9ee.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tidal Memento b4f9ee.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5360': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764610861313/38FA9E4802C3B8E8FC2DB16E94E65A3FD60D92B9/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml index afea9fb34..9b70c61b4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tides of Fate 823e49.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5810': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) ba0fe7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) ba0fe7.yaml index 00dce379f..f9c620ef1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) ba0fe7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Time Warp (2) ba0fe7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5838': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml index 176224a54..0dd7f8bae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Timeworn Brand (5) d3e55b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2611': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml index 21cf68426..2d7fc8493 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '22': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279446315725170768/AA2426A7A410FEA47066203B1965D849D4AC43DA/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml index e912291dc..8b0067844 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2306': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Toe to Toe 58288b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Toe to Toe 58288b.yaml index 88dab2000..34f6ce391 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Toe to Toe 58288b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Toe to Toe 58288b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml b/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml index 0b58914a0..c77ebe512 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Token of Faith 2ea0d0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5876': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml index c9dbcad14..f3b92e4f0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tommy Malloy c3a014.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5453': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546380927206250326/18BF6D2B2BBFDDBE5B021A46C310E4F45493EC26/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tommy Muldoon e637cd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tommy Muldoon e637cd.yaml index cafa7dfca..1bb33404d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tommy Muldoon e637cd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tommy Muldoon e637cd.yaml @@ -21,7 +21,13 @@ Description: The Rookie Cop DragSelectable: true GMNotes: "{\n \"id\": \"06001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Police. Warden.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": - 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" + 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06006\": 1\n },\n {\n \"06007\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"survivor\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: e637cd Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tony Morgan 53a412.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tony Morgan 53a412.yaml index ae55c992c..3a4107c45 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tony Morgan 53a412.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tony Morgan 53a412.yaml @@ -21,7 +21,22 @@ Description: The Bounty Hunter DragSelectable: true GMNotes: "{\n \"id\": \"06003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Criminal. Hunter.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": - 3,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" + 3,\n \"combatIcons\": 5,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"06010\": 1\n },\n {\n \"06011\": + 2\n },\n {\n \"06012\": 1\n }\n ],\n \"choices\": 1\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"choiceName\": \"Guardian\",\n \"faction\": [\n \"guardian\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n + \ \"type\": [\n \"event\",\n \"skill\"\n ],\n \"limit\": + 10\n },\n {\n \"choiceName\": \"Seeker\",\n \"faction\": [\n \"seeker\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n + \ \"type\": [\n \"event\",\n \"skill\"\n ],\n \"limit\": + 10\n },\n {\n \"choiceName\": \"Survivor\",\n \"faction\": [\n \"survivor\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n + \ \"type\": [\n \"event\",\n \"skill\"\n ],\n \"limit\": + 10\n }\n ]\n}" GUID: 53a412 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml index 8084b50b3..b2fa328c2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tony's .38 Long Colt 1186a1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5817': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml index 50055264e..c8b3866b6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tony's Quarry d6f8d1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5821': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tool Belt 769a3e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tool Belt 769a3e.yaml index bc33383de..f58fd150e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tool Belt 769a3e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tool Belt 769a3e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml index f23ce7b05..aa8247f12 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tooth of Eztli c1a687.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml index 53f915729..5f760da92 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Torrent of Power 79287f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml index 1b27c211a..796691328 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Track Shoes 6fa7fa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2746': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml index 8ed425e76..9ef8212f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Treasure Hunter (1) 18927e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3152': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml index 391fc48b2..90a7e2301 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trench Coat ba560e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml index aba0c5d54..57a73ca8e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trench Knife 0d4eb9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire (3) 76978f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire (3) 76978f.yaml index eec3d3a01..6c0be00ef 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire (3) 76978f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire (3) 76978f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml index 8c105d654..6e7ac0765 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trial by Fire 869d4c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3744': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trigger Man (3) 11d7ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trigger Man (3) 11d7ad.yaml index da2c510a2..74d1ade59 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trigger Man (3) 11d7ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trigger Man (3) 11d7ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml index 588063bbb..41e7532ee 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough (Taboo) 2ce76d.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07003-t\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" + Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"07010\": 1\n },\n {\n \"07011\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 2ce76d Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough 333fe7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough 333fe7.yaml index 9fc414322..d6bf22762 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough 333fe7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trish Scarborough 333fe7.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"07003\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Agency. Detective.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" + Conspiracy\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"07010\": 1\n },\n {\n \"07011\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 333fe7 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tristan Botley (2) 1fd630.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tristan Botley (2) 1fd630.yaml index 0f0f0d86e..5fa8dfb88 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Tristan Botley (2) 1fd630.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Tristan Botley (2) 1fd630.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5887': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml index f181a1709..846a8a9d3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card True Grit e25dc1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Magick (5) 79870f.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Magick (5) 79870f.yaml index 525e79223..01a471bb3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card True Magick (5) 79870f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card True Magick (5) 79870f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml index fdbd911cb..2772c3eb5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card True Survivor (3) 8837ff.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml b/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml index ad4bf5bbf..1fba9519d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card True Understanding 4167c0.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml index d9fdc8c02..c25907427 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Trusty Bullwhip ca9a60.yaml b/unpacked/Bag All Player Cards 15bb07/Card Trusty Bullwhip ca9a60.yaml index 03496eb5f..20d64734e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trusty Bullwhip ca9a60.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trusty Bullwhip ca9a60.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml index b92a668f4..d1627ba33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction (2) 45cd73.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5452': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537158415/2EBB208AA994ED70FD0FEB02D4E4FE78FE43EE02/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml index 753390405..202ba6e4e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Truth from Fiction d64c99.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml index 2772f2679..d01c16ae1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (1) 3dc82f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3148': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml index 007238aa0..2bc819b9d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Try and Try Again (3) f1b0f9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml index 72d766fea..b7974a553 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Twila Katherine Price (3) 9f76ec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml index 2c4f31a88..ca8a8a710 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Twilight Blade 223ba3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4493': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Twilight Diadem a2f8f8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Twilight Diadem a2f8f8.yaml new file mode 100644 index 000000000..1bd9e176f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Twilight Diadem a2f8f8.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94758 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: Crown of the Dying Light +DragSelectable: true +GMNotes: "{\n \"id\": \"10134\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Item. Charm. Mask. Blessed.\",\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: a2f8f8 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Twilight Diadem +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 52.14 + posY: 3.67 + posZ: -31.19 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml index d79c462f1..0cddfcfb9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unbound Beast 86cf9c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5272': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul (3) 343f3a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul (3) 343f3a.yaml index 022395ba4..9d5088392 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul (3) 343f3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul (3) 343f3a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml index 98232416d..427c0a7d8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Uncage the Soul 45d2d2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Uncanny Growth 6543e6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Uncanny Growth 6543e6.yaml index ffa9d1ea2..c67a77b7f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Uncanny Growth 6543e6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Uncanny Growth 6543e6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml b/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml index c5d778bfe..5ccb88863 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Under Surveillance (1) cc8321.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2321': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml b/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml index 9dab1be14..a37f62c46 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Underworld Market (2) bba889.yaml b/unpacked/Bag All Player Cards 15bb07/Card Underworld Market (2) bba889.yaml index b97ae9c55..60874216f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Underworld Market (2) bba889.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Underworld Market (2) bba889.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3791': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1814412497119474921/33ED44071C8BCA7379B0E8031F47169B73639E37/ NumHeight: 6 NumWidth: 9 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Underworld Support 8190ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Underworld Support 8190ac.yaml index 0fc41e59d..62bb6e567 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Underworld Support 8190ac.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Underworld Support 8190ac.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients (2) 3a4edd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients (2) 3a4edd.yaml index 7ab3ab618..134025633 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients (2) 3a4edd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients (2) 3a4edd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml index 37deb3012..97dfbc8f9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unearth the Ancients f763e8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml index da3c3d319..523361eca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage (2) 2f2190.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage 853b6c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage 853b6c.yaml index f985cf581..c17c9c1d1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage 853b6c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage 853b6c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml index 98bc3f852..04d42fd50 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unexpected Courage acb83a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3685': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956216650/56BA7AB3BBDC1F3C1EA8709F0761D4846B45AF83/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml b/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml index 36483259c..6aa0468fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Universal Solvent 2f1166.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2336': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/784129708171655462/0B7EFEEA9A53B93350FEC7F68F39A20D1D6580A9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.ttslua index ebe66cc7b..cce5aaa7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/Unrelenting1") -end) __bundle_register("playercards/cards/Unrelenting1", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = {} INVALID_TOKENS = { @@ -55,6 +52,582 @@ KEEP_OPEN = true require("playercards/CardsThatSealTokens") end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/Unrelenting1") +end) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("playercards/CardsThatSealTokens", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Library for cards that seal tokens This file is used to add sealing option to cards' context menu. @@ -133,6 +706,8 @@ Thus it should be implemented like this: local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local tokenArrangerApi = require("accessories/TokenArrangerApi") local sealedTokens = {} @@ -159,6 +734,15 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + if RESOLVE_TOKEN then + local firstTokenType + for tokenType, val in pairs(VALID_TOKENS) do + firstTokenType = tokenType + break + end + self.addContextMenuItem("Resolve " .. firstTokenType, resolveSealed) + end + -- conditional release option if SHOW_MULTI_RETURN then self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) @@ -320,217 +904,17 @@ function returnToken(guid) blessCurseManagerApi.returnedToken(name, guid) end end -end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end +-- resolves sealed token as if it came from the chaos bag +function resolveSealed() + if #sealedTokens == 0 then + broadcastToAll("No tokens sealed.", "Red") + return end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi -end -end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + local guidToBeResolved = table.remove(sealedTokens) + chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved) end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.yaml index ab12a04a0..09b11616d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unrelenting (1) 45386d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5580': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1762566393205073673/1FABAC4DD6EF3706D8C8285A256A13F43AE6B1E1/ NumHeight: 3 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unscrupulous Loan (3) 57b95d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unscrupulous Loan (3) 57b95d.yaml index 6ae5da554..317d4897c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unscrupulous Loan (3) 57b95d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unscrupulous Loan (3) 57b95d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3789': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126493809/0EE7F5B9B916B56425CAC1C46F7FCEF9DBF55112/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml index 59b515222..4b4de0970 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unsolved Case 22d886.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4316': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml index 54bbe9234..d9b439aa0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Bloodthirst) a5be8b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml index 0d5ceca66..458583030 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Cowardice) ea0fa1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml index 6a219ab97..202508a30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Unspeakable Oath (Curiosity) f6aba5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml index 190d15499..9f457c495 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Until the End of Time 41a9ec.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3766': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Untimely Transaction (1) 69289f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Untimely Transaction (1) 69289f.yaml index 1b529cd92..6f4d3240d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Untimely Transaction (1) 69289f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Untimely Transaction (1) 69289f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ursula Downs 07c37d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ursula Downs 07c37d.yaml index f9ab69054..6d70b2793 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ursula Downs 07c37d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ursula Downs 07c37d.yaml @@ -21,7 +21,13 @@ Description: The Explorer DragSelectable: true GMNotes: "{\n \"id\": \"04002\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Wayfarer.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\"\n}" + \ \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"The Forgotten Age\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"04008\": 1\n },\n {\n \"04009\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"relic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 4\n }\n }\n ]\n}" GUID: 07c37d Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml index f7f9f4975..0582ad778 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Valentino Rivas 726d1d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3125': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/786356000879761873/F22612DB451928DCA4344F3F125F5A8CE128A817/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml index 7b14a9225..3c69f0d52 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vantage Point 2f9ab1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml index 7591122f5..f37b69700 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vault of Knowledge 2fdcc9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml index 76c044fec..4df1fe1e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Veda Whitsley a0c2da.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2317': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830656537091085/26A674065298A59068E1D6BA3804D03554C234A3/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml index 86161e1da..bd79c5d62 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Hound ce3a1a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3809': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vengeful Shade 73bc8e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Shade 73bc8e.yaml index c9081f196..776e95bd0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vengeful Shade 73bc8e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vengeful Shade 73bc8e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8470': BackIsHidden: false - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2149964195986880793/517FBB4FF8F72900B9E123DB865BCAD625F6506C/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml b/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml index d7cde982f..e4f7a0f55 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml index 314aac43d..a729dd85e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Versatile (2) eca1c8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3797': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025942034/FEADE7F6206804B42CC9B6049F51EDF6040C5D1D/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml index d53a27fed..4cb04c285 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow (2) d2e026.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml index 33f7c727c..4e72a513a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vicious Blow 889121.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vincent Lee c431f3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vincent Lee c431f3.yaml index 35ec9fd41..3008ffdf7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Vincent Lee c431f3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Vincent Lee c431f3.yaml @@ -21,7 +21,19 @@ Description: The Doctor DragSelectable: true GMNotes: "{\n \"id\": \"09004\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Medic.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"09005\": 1\n },\n {\n \"09006\": + 1\n },\n {\n \"09007\": 1\n }\n ]\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"seeker\"\n ],\n \"level\": {\n + \ \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"faction\": + [\n \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"special\": [\n \"heals_damage\"\n ],\n + \ \"tag\": [\n \"hd\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"guardian\",\n + \ \"survivor\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 1\n },\n \"limit\": 15,\n \"error\": \"You cannot have more than + 15 level 0-1 Guardian and/or Survivor cards\"\n }\n ]\n}" GUID: c431f3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Virescent Rot 2edbdd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Virescent Rot 2edbdd.yaml new file mode 100644 index 000000000..c95a16d7e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Virescent Rot 2edbdd.yaml @@ -0,0 +1,54 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94736 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10090\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Spell. Rot. Cursed.\",\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 2edbdd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Virescent Rot +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -24.36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra (Taboo) b06042.yaml b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra (Taboo) b06042.yaml index e3b1e8518..b540c86e4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra (Taboo) b06042.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra (Taboo) b06042.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115061845812962486/A68B8BF7E4862F21369DAC4A37D813EC664EAC34/ NumHeight: 6 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml index 0226254fb..9b6d5d0bb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Voice of Ra 0988b2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5387': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456297472038/B38A78EF27EBE0BDE1B36958D297701505AB936A/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml b/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml index 81b696af8..f0209943d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Voice of the Messenger f93ea8.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3765': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Vow of Drzytelech c4bc35.yaml b/unpacked/Bag All Player Cards 15bb07/Card Vow of Drzytelech c4bc35.yaml new file mode 100644 index 000000000..911b34e50 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Vow of Drzytelech c4bc35.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 94762 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '947': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2286207513864999779/940B69318E315879D88F91454332BB6D0DFB03B6/ + NumHeight: 7 + NumWidth: 10 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10138\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: c4bc35 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Vow of Drzytelech +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 45.82 + posY: 3.67 + posZ: -28.91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml index 18d62a330..f8c4957c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (2) 4d74f6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml index 512ea5573..efbdc05f0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection (5) 7bc995.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml index e093f5056..44d25aa7c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Protection 6656ad.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2303': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956214701/377534905048B61E88314A81F482DD31D6B54038/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml index 8b4477aef..90291ca6b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ward of Radiance 69116c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5830': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml b/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml index 070d733c3..7b37f05f0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Warning Shot ec38db.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2928': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml index 04a4add87..4140a08ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Watch this! c40cb4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2617': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml index e09029253..161f2dc8b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Watcher from Another Dimension 6945f7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5813': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1011562618093846571/13C76218853EE87123267F8F6BE99206DB40470B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Waveworn Idol 591284.yaml b/unpacked/Bag All Player Cards 15bb07/Card Waveworn Idol 591284.yaml index 05c450f31..1e1a2e260 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Waveworn Idol 591284.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Waveworn Idol 591284.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4511': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1655600400212405700/559F1F3EF87BDF7F067F9B7011EDC3A6ACE71259/ NumHeight: 5 NumWidth: 5 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml b/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml index f408e618d..e3f1a6d05 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.ttslua index d932e8482..681e7ab51 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.ttslua @@ -41,6 +41,121 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/cards/WellConnected") end) @@ -106,8 +221,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -117,7 +232,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -131,7 +246,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -139,7 +254,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -150,7 +265,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -158,7 +273,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -166,7 +281,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -174,7 +289,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -182,8 +297,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -191,7 +306,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -199,8 +314,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -219,8 +334,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -228,8 +343,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -237,7 +352,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -248,8 +363,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -257,8 +372,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -266,8 +381,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -275,7 +390,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -283,7 +398,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -293,10 +408,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -304,8 +419,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -313,8 +428,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -338,7 +453,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -346,8 +461,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -359,7 +474,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -376,114 +491,4 @@ do return PlaymatApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.yaml index 1d7c3b546..193131286 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Connected (3) 170127.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4495': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276706766470010/D835D3A12B12173C78B2FFA055FEFD6042AEDD38/ NumHeight: 6 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.ttslua index fc1ce0c5a..683a987e4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.ttslua @@ -41,6 +41,80 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/WellConnected") +end) __bundle_register("playercards/cards/WellConnected", function(require, _LOADED, __bundle_register, __bundle_modules) -- this script is shared between both the level 0 and the upgraded level 3 version of the card local playmatApi = require("playermat/PlaymatApi") @@ -103,8 +177,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -114,7 +188,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -128,7 +202,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -136,7 +210,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -147,7 +221,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -155,7 +229,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -163,7 +237,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -171,7 +245,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -179,8 +253,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -188,7 +262,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -196,8 +270,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -216,8 +290,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -225,8 +299,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -234,7 +308,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -245,8 +319,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -254,8 +328,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -263,8 +337,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -272,7 +346,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -280,7 +354,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -290,10 +364,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -301,8 +375,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -310,8 +384,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -335,7 +409,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -343,8 +417,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -356,7 +430,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -381,29 +455,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -415,75 +491,4 @@ do return GUIDReferenceApi end end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/WellConnected") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml index 444b07ece..c0d9cbedc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Connected 66b7d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5276': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml index 6dce1e9ed..29f6a3fcf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Well Prepared (2) eea4ef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2263': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956212466/C93A881D22B4F7E429025CFAE677DC2EB341D6A6/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well-Funded 96fbfa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well-Funded 96fbfa.yaml index 60c64897a..833e098dc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well-Funded 96fbfa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Well-Funded 96fbfa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml index ee2e3378b..8829d75fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Well-Maintained (1) e454c3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Back) 4232d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Back) 4232d9.yaml index 32db022e9..7de73af4a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Back) 4232d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Back) 4232d9.yaml @@ -21,7 +21,19 @@ Description: The Urchin DragSelectable: true GMNotes: "{\n \"id\": \"01005-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\"\n}" + 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90039\": 1,\n \"01014\": 1\n },\n {\n \"90040\": + 1,\n \"01015\": 1\n }\n ],\n \"choices\": 1\n },\n \"deck_options\": + [\n {\n \"faction\": [\n \"survivor\",\n \"neutral\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"choiceName\": \"Blessed\",\n \"trait\": [\n \"blessed\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"choiceName\": \"Cursed\",\n \"trait\": [\n \"cursed\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n },\n {\n + \ \"choiceName\": \"Both\",\n \"trait\": [\n \"blessed\",\n \"cursed\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n },\n + \ \"size\": 5\n }\n ]\n}" GUID: 4232d9 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Front) 61503e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Front) 61503e.yaml index 5528dfce9..086e7c8cb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Front) 61503e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel Front) 61503e.yaml @@ -22,7 +22,14 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01005-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter. Blessed. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90039\": 1,\n \"01014\": 1\n + \ },\n {\n \"90040\": 1,\n \"01015\": 1\n },\n {\n + \ \"90038\": 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": + [\n \"survivor\",\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n + \ }\n ]\n}" GUID: 61503e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel) fd91ea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel) fd91ea.yaml index 630f0c0e2..16f8615df 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel) fd91ea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams (Parallel) fd91ea.yaml @@ -21,7 +21,19 @@ Description: The Urchin DragSelectable: true GMNotes: "{\n \"id\": \"01005-p\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Drifter. Blessed. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\"\n}" + 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": \"Core\",\n \"deck_requirements\": + {\n \"size\": 30,\n \"randomBasicWeaknessCount\": 1,\n \"signatures\": + [\n {\n \"90039\": 1,\n \"01014\": 1\n },\n {\n \"90040\": + 1,\n \"01015\": 1\n },\n {\n \"90038\": 1\n }\n ],\n + \ \"choices\": 1\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"choiceName\": \"Blessed\",\n \"trait\": + [\n \"blessed\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"choiceName\": \"Cursed\",\n \"trait\": [\n + \ \"cursed\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"choiceName\": \"Both\",\n \"trait\": [\n + \ \"blessed\",\n \"cursed\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n },\n \"size\": 5\n }\n ]\n}" GUID: fd91ea Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams fc1d17.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams fc1d17.yaml index 82dffce07..df9de22be 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams fc1d17.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams fc1d17.yaml @@ -22,7 +22,13 @@ DragSelectable: true GMNotes: "{\n \"id\": \"01005\",\n \"alternate_ids\": [\n \"01505\"\n ],\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \"traits\": \"Drifter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 3,\n \"combatIcons\": 1,\n \"agilityIcons\": 4,\n \"cycle\": - \"Core\"\n}" + \"Core\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"90039\": 1,\n \"01014\": 1\n + \ },\n {\n \"90040\": 1,\n \"01015\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"rogue\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: fc1d17 Grid: true GridProjection: false @@ -64,7 +70,15 @@ States: GMNotes: "{\r\n \"id\": \"01005\",\r\n \"alternate_ids\": [\r\n \"01505\"\r\n \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"Core\"\r\n}\r" + 1,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"Core\",\r\n \"deck_requirements\": + {\r\n \"size\": 30,\r\n \"randomBasicWeaknessCount\": 1,\r\n \"signatures\": + [\r\n {\r\n \"90039\": 1,\r\n \"01014\": 1\r\n },\r\n + \ {\r\n \"90040\": 1,\r\n \"01015\": 1\r\n }\r\n ]\r\n + \ },\r\n \"deck_options\": [\r\n {\r\n \"faction\": [\r\n \"survivor\",\r\n + \ \"neutral\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 5\r\n }\r\n },\r\n {\r\n \"faction\": [\r\n + \ \"rogue\"\r\n ],\r\n \"level\": {\r\n \"min\": 0,\r\n + \ \"max\": 2\r\n }\r\n }\r\n ]\r\n}\r\n" GUID: 11bcb3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 05d7d5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 05d7d5.yaml index d74c5888a..c77e74f7b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 05d7d5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 05d7d5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 27b4ea.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 27b4ea.yaml index 785d114d4..e710ca5af 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 27b4ea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 27b4ea.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5906': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 664b70.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 664b70.yaml index 2967ead48..16eef38d0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 664b70.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy's Amulet 664b70.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5360': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1849293764610861313/38FA9E4802C3B8E8FC2DB16E94E65A3FD60D92B9/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml index 4a89d8464..b7d87c82b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card What Have You Done 2c76d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5349': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/778493212055041441/90F035BD69A7C5C6B6F43426DDDA3A09DFCBCBDF/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Where's Pa 9aba43.yaml b/unpacked/Bag All Player Cards 15bb07/Card Where's Pa 9aba43.yaml index c702e4e7f..b80837851 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Where's Pa 9aba43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Where's Pa 9aba43.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '9104': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558543/20409C8476361342F4067117A61ABFC07326F948/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml index 2174ccf61..bb99c6961 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5859': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320664132663842/9B2F50595A754585A4DF12D6D48DC2561DC0E2C9/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml index b3a5408a3..2ed39efc5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene (2) 854c79.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml index 7dacbb7be..e6b9977ec 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Whitton Greene 3c5099.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5388': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1546381162227145538/0F253FC5301911273C32210992261DD1D2EBB578/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml index c4e0f9f9b..185853beb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 0027f2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3688': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672864134253/9A6E0399D3624C5FFBD6CAFE5D4B988436CC65AC/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 3959fa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 3959fa.yaml index f095e4704..18a719ca8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 3959fa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive (3) 3959fa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml index fe3050aa6..7961b0e35 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Will to Survive dc4a2c.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5508': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1626320456298038335/2CA532D7F0EED2B2B40E47709AC56D85C4613A33/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card William Yorick 7e4c56.yaml b/unpacked/Bag All Player Cards 15bb07/Card William Yorick 7e4c56.yaml index fcad28a79..c37188424 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card William Yorick 7e4c56.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card William Yorick 7e4c56.yaml @@ -21,7 +21,13 @@ Description: The Gravedigger DragSelectable: true GMNotes: "{\n \"id\": \"03005\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n \ \"traits\": \"Warden.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 2,\n - \ \"combatIcons\": 4,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\"\n}" + \ \"combatIcons\": 4,\n \"agilityIcons\": 3,\n \"cycle\": \"The Path to Carcosa\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"03016\": 1\n },\n {\n \"03017\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"survivor\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"faction\": [\n \"guardian\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 2\n }\n }\n ]\n}" GUID: 7e4c56 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Winds of Power (1) bcdfde.yaml b/unpacked/Bag All Player Cards 15bb07/Card Winds of Power (1) bcdfde.yaml index b2ac773aa..98bab040c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Winds of Power (1) bcdfde.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Winds of Power (1) bcdfde.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml b/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml index bddac6db9..6ff5a7efa 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Winging It aa3984.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4305': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Winifred Habbamock cd4028.yaml b/unpacked/Bag All Player Cards 15bb07/Card Winifred Habbamock cd4028.yaml index 1ed1b00a1..28bcf7dc3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Winifred Habbamock cd4028.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Winifred Habbamock cd4028.yaml @@ -21,7 +21,12 @@ Description: The Aviatrix DragSelectable: true GMNotes: "{\n \"id\": \"60301\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Criminal.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 3,\n - \ \"combatIcons\": 3,\n \"agilityIcons\": 5,\n \"cycle\": \"Investigator Packs\"\n}" + \ \"combatIcons\": 3,\n \"agilityIcons\": 5,\n \"cycle\": \"Investigator Packs\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"60302\": 1\n },\n {\n \"60303\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n }\n ]\n}" GUID: cd4028 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml index bc3a59904..5f6c739ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wish Eater 464ca1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4489': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025943109/9C5481E6DFEACD450C5522F884E615482281DDB1/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml index 9399b71e6..c9756efa7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wither (4) f57a6f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3796': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml index 583998cdb..fc2d70336 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2775': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wooden Sledge 991640.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wooden Sledge 991640.yaml index a7fef4993..aa131e533 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wooden Sledge 991640.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wooden Sledge 991640.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4503': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1858293462587822801/5E2DBBF49FB9A74CE0F4A953D8F4FECCBA479D11/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml index 2d11ed8e8..f86484392 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Word of Command (2) 26853e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4480': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025945336/04E36F64C2CBE1B4905FF44A869C75EC52CB3A56/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Word of Weal 5edfc2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Word of Weal 5edfc2.yaml index aa38dc5d2..fdc02cc0c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Word of Weal 5edfc2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Word of Weal 5edfc2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Word of Woe bb7174.yaml b/unpacked/Bag All Player Cards 15bb07/Card Word of Woe bb7174.yaml index 82d6a3ed4..b6213d997 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Word of Woe bb7174.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Word of Woe bb7174.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch 07b7a1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch 07b7a1.yaml index 26777ba50..091812ad3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch 07b7a1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch 07b7a1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5872': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1856052392800079019/C6B0ADB01750372B73B2281CFFDFA5F6F87C2C9E/ NumHeight: 3 NumWidth: 7 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml index f95d8c2ae..960fe5271 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Working a Hunch eb6165.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3684': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956220005/42E220A3221D2BFA22F1B3A71EEE346A8B0AAD77/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wounded Bystander fb54d3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wounded Bystander fb54d3.yaml index fe6a36dc8..f0c16c3cc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wounded Bystander fb54d3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wounded Bystander fb54d3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021606446230201640/A992318B1957FC69EB36B5E6FC87D226AAC5EC21/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml index d473641c3..943c4ad1b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wracked by Nightmares 97781f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3710': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Written in the Stars 320bbe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Written in the Stars 320bbe.yaml index c2d6e1376..c49ceecbb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Written in the Stars 320bbe.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Written in the Stars 320bbe.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3790': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1625226898126491470/A7FAFA92C08268717F79B2B1C83F8C23DFA6C534/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wrong Place, Right Time d5944e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wrong Place, Right Time d5944e.yaml index 59a42a8cf..d9b007969 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wrong Place, Right Time d5944e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wrong Place, Right Time d5944e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '121': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ NumHeight: 2 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) 284bbe.yaml b/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) 284bbe.yaml index ff7201552..eaddd107b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) 284bbe.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Yaotl (1) 284bbe.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5848': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697276627309509299/3B0E32939EB4599CCE3596975637C90FE4EE1DD6/ NumHeight: 5 NumWidth: 6 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml b/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml index e6d6af32a..32b66b61d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5902': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1697277388086984548/E61F3E847797C2C9231829611E0D92BA6376FA67/ NumHeight: 4 NumWidth: 4 diff --git a/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml b/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml index 2bb12d472..11a3aa6e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card You handle this one! dcdcea.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3687': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860672861853482/578CFD93B087B0ADA085E7A99062E6191772D6BD/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml b/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml index 2727fce2b..0188c8854 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card You owe me one! d27d12.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3780': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025944587/520448D0E9C22F102C7DDF64322EAD6FC221ECC8/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml index 7850faeb6..ad3487d09 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Your Worst Nightmare 406ab2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4381': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/775107869048626382/DA1F5817A4067A74D883201F1AFAC096646A455B/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml index 369aedaf8..eb35d0294 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4406': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1016065725025946328/561232524C8EAA4B4371B28652F78969E6ED6FFB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml index 466beba65..25993de42 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zebulon Whateley 6714b2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2329': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/782999241295993974/70871F727ABBAB3DB22003051B5E1FBF8999AEEB/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Back) 98a0e4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Back) 98a0e4.yaml index 1e5e56491..efbcd70c5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Back) 98a0e4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Back) 98a0e4.yaml @@ -22,7 +22,18 @@ DragSelectable: true GMNotes: "{\n \"id\": \"02001-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Believer. Hunter.\",\n \"willpowerIcons\": 4,\n \ \"intellectIcons\": 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": - \"Path of the Righteous\"\n}" + \"Path of the Righteous\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02006\": 1,\n \"90060\": 1\n + \ },\n {\n \"02007\": 1,\n \"90061\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"trait\": + [\n \"blessed\",\n \"charm\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 4\n }\n },\n {\n \"faction\": [\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n + \ \"limit\": 5,\n \"error\": \"You cannot have more than 5 Mystic cards\"\n + \ }\n ]\n}" GUID: 98a0e4 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Front) 98a0e3.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Front) 98a0e3.yaml index 55e30d91d..1540c4c7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Front) 98a0e3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel Front) 98a0e3.yaml @@ -22,7 +22,14 @@ DragSelectable: true GMNotes: "{\n \"id\": \"02001-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \"traits\": \"Believer. Hunter.\",\n \"willpowerIcons\": 4,\n \ \"intellectIcons\": 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": - \"Path of the Righteous\"\n}" + \"Path of the Righteous\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02006\": 1,\n \"90060\": 1\n + \ },\n {\n \"02007\": 1,\n \"90061\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Guardian or Neutral\"\n }\n ]\n}" GUID: 98a0e3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel) 98a0e2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel) 98a0e2.yaml index 1bf816447..25a7a0dd0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel) 98a0e2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras (Parallel) 98a0e2.yaml @@ -21,7 +21,19 @@ Description: The Chef DragSelectable: true GMNotes: "{\n \"id\": \"02001-p\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Believer. Hunter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Path of the Righteous\"\n}" + 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"Path of the Righteous\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02006\": 1,\n \"90060\": 1\n + \ },\n {\n \"02007\": 1,\n \"90061\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"trait\": + [\n \"blessed\",\n \"charm\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 4\n }\n },\n {\n \"faction\": [\n \"mystic\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n + \ \"limit\": 5,\n \"error\": \"You cannot have more than 5 Mystic cards\"\n + \ }\n ]\n}" GUID: 98a0e2 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras 98a0e1.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras 98a0e1.yaml index f119c3812..d0000d884 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras 98a0e1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey Samaras 98a0e1.yaml @@ -21,7 +21,15 @@ Description: The Chef DragSelectable: true GMNotes: "{\n \"id\": \"02001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Believer. Hunter.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": - 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" + 2,\n \"combatIcons\": 4,\n \"agilityIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"02006\": 1,\n \"90060\": 1\n + \ },\n {\n \"02007\": 1,\n \"90061\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"guardian\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"level\": {\n \"min\": 0,\n \"max\": + 0\n },\n \"limit\": 5,\n \"error\": \"You cannot have more than 5 + cards that are not Guardian or Neutral\"\n }\n ]\n}" GUID: 98a0e1 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml index cbfaae98c..0e17c995b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d810.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3717': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/960860341956229149/FC980D306FA8FE74C552981167CBDF4305821B31/ NumHeight: 7 NumWidth: 10 diff --git a/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d811.yaml b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d811.yaml index abd5f67cc..3daf5a7b0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d811.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zoey's Cross 66d811.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8531': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2115062479282090841/27F874D8E240CE62A38A47DDFAAF58D3BD4D0C42/ NumHeight: 2 NumWidth: 2 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml index 218f63de0..9bd528207 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1253': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136565/AE4B753BBB284EB12A0BDE36CEA3CD763C835AC0/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml index e02ae2ad9..451893ece 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '201': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070977509/27A8CCF2BC48CAD909180D64177E86B8232F66C6/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ad Hoc c9fb2f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ad Hoc c9fb2f.yaml index 281da8670..1b47bfae7 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Ad Hoc c9fb2f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ad Hoc c9fb2f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '91': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2223150865961116295/72473371D0DB68709B4B1B9343A748510A1BB30A/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml index 2c05a388b..ba640e5c8 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '17': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875866961/175F57B97C6DEC14F1F6E6420A318A76D38FFE8A/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml index 0b4d6f6b1..9b5f1c867 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '127': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867121/DD34A54C059F9DE340A3C54406A276D202D1C329/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Alchemical Distillation Upgrade Sheet 156166.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Alchemical Distillation Upgrade Sheet 156166.ttslua index 3f2f98c9e..9cbcd56de 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Alchemical Distillation Upgrade Sheet 156166.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Alchemical Distillation Upgrade Sheet 156166.ttslua @@ -41,134 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/AlchemicalDistillationUpgradeSheet") -end) -__bundle_register("playercards/customizable/AlchemicalDistillationUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Alchemical Distillation - --- Color information for buttons -boxSize = 40 - --- static values -xInitial = -0.933 -xOffset = 0.075 - -customizations = { - [1] = { - checkboxes = { - posZ = -0.892, - count = 1, - } - }, - [2] = { - checkboxes = { - posZ = -0.665, - count = 1, - } - }, - [3] = { - checkboxes = { - posZ = -0.43, - count = 1, - } - }, - [4] = { - checkboxes = { - posZ = -0.092, - count = 2, - } - }, - [5] = { - checkboxes = { - posZ = 0.142, - count = 2, - }, - }, - [6] = { - checkboxes = { - posZ = 0.376, - count = 4, - } - }, - [7] = { - checkboxes = { - posZ = 0.815, - count = 5, - } - }, -} - -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 @@ -391,7 +263,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -624,8 +496,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -635,7 +507,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -649,7 +521,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -657,7 +529,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -668,7 +540,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -676,7 +548,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -684,7 +556,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -692,7 +564,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -700,8 +572,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -709,7 +581,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -717,8 +589,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -737,8 +609,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -746,8 +618,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -755,7 +627,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -766,8 +638,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -775,8 +647,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -784,8 +656,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -793,7 +665,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -801,7 +673,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -811,10 +683,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -822,8 +694,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -831,8 +703,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -856,7 +728,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -864,8 +736,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -877,7 +749,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -902,29 +774,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -936,4 +810,135 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/AlchemicalDistillationUpgradeSheet") +end) +__bundle_register("playercards/customizable/AlchemicalDistillationUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Alchemical Distillation + +-- Color information for buttons +boxSize = 40 + +-- static values +xInitial = -0.933 +xOffset = 0.075 + +customizations = { + [1] = { + checkboxes = { + posZ = -0.892, + count = 1, + } + }, + [2] = { + checkboxes = { + posZ = -0.665, + count = 1, + } + }, + [3] = { + checkboxes = { + posZ = -0.43, + count = 1, + } + }, + [4] = { + checkboxes = { + posZ = -0.092, + count = 2, + } + }, + [5] = { + checkboxes = { + posZ = 0.142, + count = 2, + }, + }, + [6] = { + checkboxes = { + posZ = 0.376, + count = 4, + } + }, + [7] = { + checkboxes = { + posZ = 0.815, + count = 5, + } + }, +} + +require("playercards/customizable/UpgradeSheetLibrary") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi 54eaa5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi 54eaa5.yaml index 714537ff8..663d3612a 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi 54eaa5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi 54eaa5.yaml @@ -22,7 +22,12 @@ DragSelectable: true GMNotes: "{\n \"id\": \"10009\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Drifter. Socialite.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" + Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"10010\": 3\n },\n {\n \"10011\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"special\": [\n \"parley\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n }\n ]\n}" GUID: 54eaa5 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml index b5ad0c713..a945daaac 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '49': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447674651244606/B2275AD213AF8DD0B65170BD4E5E5E98E233A6C7/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml index 62ead6817..8706ea178 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancient Covenant (2) 436401.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5464': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1597044073918730334/45D2725C3553953A73DAFBEF631E78D459716EA7/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Beguile 019526.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Beguile 019526.yaml index 7d8b79289..0916b06c8 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Beguile 019526.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Beguile 019526.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009071331078/3553DC91D67F802BAFFE9F674DBE991C2D439867/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Blackmail File de456d.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Blackmail File de456d.yaml index 7de6b8b3d..c60667c31 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Blackmail File de456d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Blackmail File de456d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '94': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2195002645128569861/7143A7BF20E37A069E170A21D77C16C91D81374D/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml index f4f2c1fc3..da49dff57 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Blasphemous Covenant (2) 10b087.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5465': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1597044073918730883/0E7FEB9CC85CD11EB5194774E90A73163EDACBEC/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.ttslua new file mode 100644 index 000000000..53d5ca34f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.ttslua @@ -0,0 +1,632 @@ +-- 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) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/cards/BookofLivingMyths") +end) +__bundle_register("playercards/cards/BookofLivingMyths", function(require, _LOADED, __bundle_register, __bundle_modules) +local chaosBagApi = require("chaosbag/ChaosBagApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") + +function onSave() + return JSON.encode({ loopId = loopId }) +end + +function onLoad(savedData) + self.addContextMenuItem("Enable Helper", createButtons) + if savedData ~= "" then + local loadedData = JSON.decode(savedData) + if loadedData.loopId then + createButtons() + end + end +end + +function deleteButtons() + self.UI.setAttribute("inactives", "active", false) + self.UI.setAttribute("actives", "active", false) + self.clearContextMenu() + self.addContextMenuItem("Enable Helper", createButtons) + Wait.stop(loopId) + loopId = nil +end + +-- Create buttons and begin monitoring chaos bag for curse and bless tokens +function createButtons() + self.clearContextMenu() + self.addContextMenuItem("Clear Helper", deleteButtons) + self.UI.setAttribute("inactives", "active", true) + self.UI.setAttribute("actives", "active", true) + self.UI.show("inactiveBless") + self.UI.show("inactiveCurse") + self.UI.hide("Bless") + self.UI.hide("Curse") + currentState = "Empty" + loopId = Wait.time(countBlessCurse, 1, -1) +end + +function resolveToken(_, _, tokenType) + local closestMatColor = playmatApi.getMatColorByPosition(self.getPosition()) + local mat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat") + chaosBagApi.drawChaosToken(mat, true, tokenType) +end + +-- count tokens in the bag and show appropriate buttons +function countBlessCurse() + local numInBag = { Bless = 0, Curse = 0 } + local chaosBag = chaosBagApi.findChaosBag() + local tokens = {} + for _, v in ipairs(chaosBag.getObjects()) do + if v.name == "Bless" then + numInBag.Bless = numInBag.Bless + 1 + elseif v.name == "Curse" then + numInBag.Curse = numInBag.Curse + 1 + end + end + + if numInBag.Bless > numInBag.Curse then + if currentState ~= "More Bless" then + self.UI.show("Bless") + self.UI.hide("inactiveBless") + self.UI.show("inactiveCurse") + self.UI.hide("Curse") + end + currentState = "More Bless" + elseif numInBag.Curse > numInBag.Bless then + if currentState ~= "More Curse" then + self.UI.show("Curse") + self.UI.hide("inactiveCurse") + self.UI.show("inactiveBless") + self.UI.hide("Bless") + end + currentState = "More Curse" + elseif numInBag.Curse == 0 then + if currentState ~= "Empty" then + self.UI.show("inactiveBless") + self.UI.hide("Bless") + self.UI.show("inactiveCurse") + self.UI.hide("Curse") + end + currentState = "Empty" + else + if currentState ~= "Equal" then + self.UI.show("Bless") + self.UI.hide("inactiveBless") + self.UI.show("Curse") + self.UI.hide("inactiveCurse") + end + currentState = "Equal" + end +end + +function errorMessage () + if currentState == "Empty" then + broadcastToAll("There are no Bless or Curse tokens in the chaos bag.","Red") + elseif currentState == "More Bless" then + broadcastToAll("There are more Bless tokens than Curse tokens in the chaos bag.","Red") + else + broadcastToAll("There are more Curse tokens than Bless tokens in the chaos bag.","Red") + end +end +end) +return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.xml b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.xml new file mode 100644 index 000000000..acdc975e2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml index 8ce71f8d6..b77cc8536 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml @@ -11,12 +11,22 @@ ColorDiffuse: CustomDeck: '85': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528306779/F60D99AAA35122A9553F0B5FD736DB6FB73BE7EF/ NumHeight: 1 NumWidth: 1 Type: 0 UniqueBack: false +CustomUIAssets: +- Name: font_teutonic-arkham + Type: 1 + URL: http://cloud-3.steamusercontent.com/ugc/2027213118467703445/89328E273B4C5180BF491516CE998DE3C604E162/ +- Name: bless + Type: 0 + URL: http://cloud-3.steamusercontent.com/ugc/2380784374775547028/7855033DE0EB1FDDF706E1303054D35FE0902532/ +- Name: curse + Type: 0 + URL: http://cloud-3.steamusercontent.com/ugc/2380784374775547135/2360372CBE9452CB7B4D135BE13BBA6D46B7D427/ Description: Chronicle of Wonders DragSelectable: true GMNotes: "{\n \"id\": \"10013\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n @@ -31,7 +41,7 @@ HideWhenFaceDown: true IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false -LuaScript: '' +LuaScript: !include 'CardCustom Book of Living Myths c5fb1f.ttslua' LuaScriptState: '' MeasureMovement: false Name: CardCustom @@ -54,4 +64,4 @@ Transform: scaleY: 1 scaleZ: 1 Value: 0 -XmlUI: '' +XmlUI: !include 'CardCustom Book of Living Myths c5fb1f.xml' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml index c585a7574..9de877004 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '133': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520416/34030F3F4E7DB48038BAC2BB6010D4781C102301/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml index 7654cf7f5..15a39ae75 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '403': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186559601365/6C247C82793481C97E24F74A26AF905E3B708C50/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml index 5d09b1e2c..b56ad90b0 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1241': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136671/AC1530FE71D9E5CF4F816A488E07076AC8064BD8/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Control Variable 133868.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Control Variable 133868.yaml index 5b59466d9..1b67413e4 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Control Variable 133868.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Control Variable 133868.yaml @@ -3,15 +3,15 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 300 +CardID: 34200 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '3': + '342': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070977979/A629DD5733453F892F57514EC5950E087486896F/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Custom Modifications Upgrade Sheet 4104bf.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Custom Modifications Upgrade Sheet 4104bf.ttslua index 8b4e54a4f..2c506c907 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Custom Modifications Upgrade Sheet 4104bf.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Custom Modifications Upgrade Sheet 4104bf.ttslua @@ -41,77 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/CustomModificationsUpgradeSheet") -end) __bundle_register("playercards/customizable/CustomModificationsUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) -- Customizable Cards: Custom Modifications @@ -385,7 +314,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -618,8 +547,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -629,7 +558,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -643,7 +572,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -651,7 +580,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -662,7 +591,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -670,7 +599,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -678,7 +607,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -686,7 +615,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -694,8 +623,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -703,7 +632,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -711,8 +640,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -731,8 +660,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -740,8 +669,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -749,7 +678,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -760,8 +689,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -769,8 +698,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -778,8 +707,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -787,7 +716,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -795,7 +724,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -805,10 +734,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -816,8 +745,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -825,8 +754,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -850,7 +779,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -858,8 +787,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -871,7 +800,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -896,29 +825,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -930,4 +861,78 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/CustomModificationsUpgradeSheet") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml index 04305969f..3dae58f39 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Daisy's Tote Bag cf41be.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2316': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736529784/BEB850DCAA5497CC1A96E1603C0D3AFFE8B0F2BB/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Damning Testimony Upgrade Sheet dc4a62.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Damning Testimony Upgrade Sheet dc4a62.ttslua index d2b1893be..cf608af8b 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Damning Testimony Upgrade Sheet dc4a62.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Damning Testimony Upgrade Sheet dc4a62.ttslua @@ -41,6 +41,59 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/DamningTestimonyUpgradeSheet") +end) +__bundle_register("playercards/customizable/DamningTestimonyUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Damning Testimony + +-- Color information for buttons +boxSize = 40 + +-- static values +xInitial = -0.935 +xOffset = 0.075 + +customizations = { + [1] = { + checkboxes = { + posZ = -0.925, + count = 1, + } + }, + [2] = { + checkboxes = { + posZ = -0.475, + count = 2, + } + }, + [3] = { + checkboxes = { + posZ = -0.25, + count = 2, + } + }, + [4] = { + checkboxes = { + posZ = -0.01, + count = 3, + } + }, + [5] = { + checkboxes = { + posZ = 0.428, + count = 3, + }, + }, + [6] = { + checkboxes = { + posZ = 0.772, + 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 @@ -263,7 +316,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -496,8 +549,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -507,7 +560,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -521,7 +574,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -529,7 +582,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -540,7 +593,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -548,7 +601,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -556,7 +609,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -564,7 +617,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -572,8 +625,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -581,7 +634,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -589,8 +642,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -609,8 +662,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -618,8 +671,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -627,7 +680,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -638,8 +691,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -647,8 +700,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -656,8 +709,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -665,7 +718,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -673,7 +726,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -683,10 +736,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -694,8 +747,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -703,8 +756,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -728,7 +781,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -736,8 +789,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -749,7 +802,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -774,29 +827,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -821,14 +876,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -841,7 +899,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -876,57 +934,4 @@ do return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/DamningTestimonyUpgradeSheet") -end) -__bundle_register("playercards/customizable/DamningTestimonyUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Damning Testimony - --- Color information for buttons -boxSize = 40 - --- static values -xInitial = -0.935 -xOffset = 0.075 - -customizations = { - [1] = { - checkboxes = { - posZ = -0.925, - count = 1, - } - }, - [2] = { - checkboxes = { - posZ = -0.475, - count = 2, - } - }, - [3] = { - checkboxes = { - posZ = -0.25, - count = 2, - } - }, - [4] = { - checkboxes = { - posZ = -0.01, - count = 3, - } - }, - [5] = { - checkboxes = { - posZ = 0.428, - count = 3, - }, - }, - [6] = { - checkboxes = { - posZ = 0.772, - count = 4, - } - }, -} -require("playercards/customizable/UpgradeSheetLibrary") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml index 3d2a7fa52..a97070b3f 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '4': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070978111/18BFD42CF7BACCF65559E63F576AF35920520FDB/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml index c98261a2d..7e7d48c5c 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml @@ -3,15 +3,15 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 12100 +CardID: 125100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '121': + '1251': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128231/B3D4EF69ABE3736988B015629C5862F69EB42BDC/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml index 0157a8c69..1cb6d6f64 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Sophist f6b1b6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5493': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373727958826520/EE54EF6510734FC86ADD47E84DB253493A2F87B7/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Tongue e8765a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Tongue e8765a.yaml index c3e6a54f3..545c60874 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Tongue e8765a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Eldritch Tongue e8765a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '331': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009099794816/E5700422279C3B3100E11698F95F7FF2403C6362/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Empirical Hypothesis Upgrade Sheet 0c46a7.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Empirical Hypothesis Upgrade Sheet 0c46a7.ttslua index 89c153ec8..0e3682d6f 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Empirical Hypothesis Upgrade Sheet 0c46a7.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Empirical Hypothesis Upgrade Sheet 0c46a7.ttslua @@ -41,6 +41,77 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/EmpiricalHypothesisUpgradeSheet") end) @@ -328,7 +399,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -561,8 +632,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -572,7 +643,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -586,7 +657,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -594,7 +665,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -605,7 +676,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -613,7 +684,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -621,7 +692,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -629,7 +700,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -637,8 +708,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -646,7 +717,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -654,8 +725,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -674,8 +745,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -683,8 +754,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -692,7 +763,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -703,8 +774,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -712,8 +783,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -721,8 +792,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -730,7 +801,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -738,7 +809,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -748,10 +819,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -759,8 +830,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -768,8 +839,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -793,7 +864,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -801,8 +872,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -814,7 +885,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -839,29 +910,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -873,72 +946,4 @@ do return GUIDReferenceApi end end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml index 961d43776..71e5e39db 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '572': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867257/845C4AF7C4ECDFA6EB547F4C8CBB4B192EFCF159/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml index cf0e38dad..645b99e9d 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '74': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128378/E8199C752F09FB88E1A7D5F56FBC4B9D772F820D/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom False Surrender adf28e.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom False Surrender adf28e.yaml index 41f2d32f8..1a092651f 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom False Surrender adf28e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom False Surrender adf28e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '341': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009099794971/0D542175146E0E2FBBBDCC8110B32A573FDBB03E/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml index 6b5fe1866..d083fcbd6 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '25': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2316603641240799540/C9D5A77FF0A0ED8DB1BBBBF0B02296B49E0E3CE8/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Friends in Low Places Upgrade Sheet 9fb3b9.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Friends in Low Places Upgrade Sheet 9fb3b9.ttslua index 8fce323df..cbacc50a2 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Friends in Low Places Upgrade Sheet 9fb3b9.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Friends in Low Places Upgrade Sheet 9fb3b9.ttslua @@ -41,74 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/FriendsinLowPlacesUpgradeSheet") end) @@ -401,7 +333,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -634,8 +566,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -645,7 +577,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -659,7 +591,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -667,7 +599,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -678,7 +610,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -686,7 +618,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -694,7 +626,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -702,7 +634,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -710,8 +642,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -719,7 +651,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -727,8 +659,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -747,8 +679,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -756,8 +688,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -765,7 +697,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -776,8 +708,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -785,8 +717,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -794,8 +726,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -803,7 +735,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -811,7 +743,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -821,10 +753,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -832,8 +764,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -841,8 +773,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -866,7 +798,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -874,8 +806,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -887,7 +819,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -912,29 +844,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -946,4 +880,75 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Grift df75d7.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Grift df75d7.yaml index d6921bec2..5eff8de38 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Grift df75d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Grift df75d7.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009099857520/D9FD0353EAE4B1CEB3A3F220C26B09543FD71BD3/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Grizzled Upgrade Sheet ef8f08.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Grizzled Upgrade Sheet ef8f08.ttslua index a24f42dbf..f22662a1c 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Grizzled Upgrade Sheet ef8f08.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Grizzled Upgrade Sheet ef8f08.ttslua @@ -325,7 +325,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -558,8 +558,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -569,7 +569,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -583,7 +583,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -591,7 +591,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -602,7 +602,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -610,7 +610,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -618,7 +618,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -626,7 +626,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -634,8 +634,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -643,7 +643,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -651,8 +651,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -671,8 +671,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -680,8 +680,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -689,7 +689,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -700,8 +700,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -709,8 +709,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -718,8 +718,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -727,7 +727,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -735,7 +735,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -745,10 +745,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -756,8 +756,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -765,8 +765,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -790,7 +790,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -798,8 +798,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -811,7 +811,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -836,29 +836,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -883,14 +885,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -903,7 +908,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml index 4f61e6158..6252aef73 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1051': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255556703/D151EE26C6909481B57B07C1716A8E7BCED4B988/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml index 1f72f5e9d..f0ed8ee7c 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml @@ -24,7 +24,13 @@ GMNotes: "{\n \"id\": \"10015\",\n \"type\": \"Investigator\",\n \"class\": \ 1,\n \"id\": \"10015-b1\"\n },\n {\n \"count\": 1,\n \"id\": \"10015-b2\"\n }\n ],\n \"willpowerIcons\": 3,\n \"intellectIcons\": 1,\n \ \"combatIcons\": 5,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" + Vale\",\n \"deck_requirements\": {\n \"size\": 35,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"10017\": 1\n },\n {\n \"10018\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"insight\",\n \"spirit\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 2\n },\n + \ \"limit\": 10\n }\n ]\n}" GUID: 3764cd Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml index 7409397f4..e1ff86b3b 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '522': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378887536210/F43975F08B2C9DE8717AC605520379B3C3F0FE33/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml index ce18e552e..bb0fd03c6 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1053': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557726/4725495E403D9EE65EF5F9136F700D429C81AF52/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Honed Instinct Upgrade Sheet ba0e34.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Honed Instinct Upgrade Sheet ba0e34.ttslua index 2d710013f..3daaef640 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Honed Instinct Upgrade Sheet ba0e34.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Honed Instinct Upgrade Sheet ba0e34.ttslua @@ -326,7 +326,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -559,8 +559,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -570,7 +570,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -584,7 +584,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -592,7 +592,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -603,7 +603,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -611,7 +611,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -619,7 +619,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -627,7 +627,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -635,8 +635,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -644,7 +644,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -652,8 +652,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -672,8 +672,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -681,8 +681,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -690,7 +690,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -701,8 +701,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -710,8 +710,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -719,8 +719,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -728,7 +728,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -736,7 +736,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -746,10 +746,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -757,8 +757,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -766,8 +766,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -791,7 +791,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -799,8 +799,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -812,7 +812,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -837,29 +837,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -884,14 +886,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -904,7 +909,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml index e646a7de1..52504cc78 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hospital Debts bd323d.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5413': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335843/99E638B3D735149C6624312DBAB47A3AA2D2F95D/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hunter's Armor Upgrade Sheet d2d01b.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Hunter's Armor Upgrade Sheet d2d01b.ttslua index 0b2a12ce3..f6fda1be6 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hunter's Armor Upgrade Sheet d2d01b.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hunter's Armor Upgrade Sheet d2d01b.ttslua @@ -41,6 +41,62 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playercards/customizable/HuntersArmorUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Hunter's Armor + +-- Color information for buttons +boxSize = 40 + +-- static values +xInitial = -0.933 +xOffset = 0.075 + +customizations = { + [1] = { + checkboxes = { + posZ = -0.892, + count = 1, + } + }, + [2] = { + checkboxes = { + posZ = -0.560, + count = 2, + } + }, + [3] = { + checkboxes = { + posZ = -0.220, + count = 2, + } + }, + [4] = { + checkboxes = { + posZ = -0.092, + count = 2, + } + }, + [5] = { + checkboxes = { + posZ = 0.047, + count = 2, + }, + }, + [6] = { + checkboxes = { + posZ = 0.376, + count = 3, + } + }, + [7] = { + checkboxes = { + posZ = 0.820, + count = 3, + }, + }, +} +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 @@ -263,7 +319,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -496,8 +552,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -507,7 +563,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -521,7 +577,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -529,7 +585,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -540,7 +596,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -548,7 +604,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -556,7 +612,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -564,7 +620,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -572,8 +628,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -581,7 +637,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -589,8 +645,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -609,8 +665,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -618,8 +674,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -627,7 +683,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -638,8 +694,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -647,8 +703,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -656,8 +712,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -665,7 +721,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -673,7 +729,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -683,10 +739,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -694,8 +750,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -703,8 +759,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -728,7 +784,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -736,8 +792,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -749,7 +805,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -774,29 +830,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -821,14 +879,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -841,7 +902,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -879,60 +940,4 @@ end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/HuntersArmorUpgradeSheet") end) -__bundle_register("playercards/customizable/HuntersArmorUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Hunter's Armor - --- Color information for buttons -boxSize = 40 - --- static values -xInitial = -0.933 -xOffset = 0.075 - -customizations = { - [1] = { - checkboxes = { - posZ = -0.892, - count = 1, - } - }, - [2] = { - checkboxes = { - posZ = -0.560, - count = 2, - } - }, - [3] = { - checkboxes = { - posZ = -0.220, - count = 2, - } - }, - [4] = { - checkboxes = { - posZ = -0.092, - count = 2, - } - }, - [5] = { - checkboxes = { - posZ = 0.047, - count = 2, - }, - }, - [6] = { - checkboxes = { - posZ = 0.376, - count = 3, - } - }, - [7] = { - checkboxes = { - posZ = 0.820, - count = 3, - }, - }, -} -require("playercards/customizable/UpgradeSheetLibrary") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hyperphysical Shotcaster Upgrade Sheet a4eec2.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Hyperphysical Shotcaster Upgrade Sheet a4eec2.ttslua index a8a81d593..9cbca7aa4 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Hyperphysical Shotcaster Upgrade Sheet a4eec2.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hyperphysical Shotcaster Upgrade Sheet a4eec2.ttslua @@ -41,6 +41,398 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/HyperphysicalShotcasterUpgradeSheet") end) @@ -323,7 +715,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -549,391 +941,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom I'll Pay You Back! 40e1ca.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom I'll Pay You Back! 40e1ca.yaml index 625cc52ed..ea93e53e3 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom I'll Pay You Back! 40e1ca.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom I'll Pay You Back! 40e1ca.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '6': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070978340/8858A9F24148B2C04A3ED876597BD966FEE114EC/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml index ef2b8b954..249077a58 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 12100 +CardID: 127100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '121': + '1271': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867646/87E93B4F71674659B01C9ED280E573D7BD929882/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867768/A54D29440DD5A9DA4E059B861C7AC22F5ACD9BE4/ @@ -22,7 +22,14 @@ DragSelectable: true GMNotes: "{\n \"id\": \"10004\",\n \"type\": \"Investigator\",\n \"class\": \"Seeker\",\n \ \"traits\": \"Miskatonic. Scholar.\",\n \"willpowerIcons\": 2,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 4,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" + Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"10005\": 1\n },\n {\n \"10008\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"seeker\",\n + \ \"neutral\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"science\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 4\n }\n },\n {\n \"trait\": + [\n \"insight\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 1\n }\n }\n ]\n}" GUID: ce2322 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami 54eaa7.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami 54eaa7.yaml index e348e331e..e6ebf9983 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami 54eaa7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami 54eaa7.yaml @@ -22,7 +22,16 @@ DragSelectable: true GMNotes: "{\n \"id\": \"10012\",\n \"type\": \"Investigator\",\n \"class\": \"Mystic\",\n \ \"traits\": \"Scholar. Blessed. Cursed.\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": 4,\n \"combatIcons\": 3,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" + Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"10013\": 1\n },\n {\n \"10014\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"mystic\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n \"trait\": + [\n \"blessed\",\n \"cursed\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"occult\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n + \ }\n ]\n}" GUID: 54eaa7 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml index 8e601e0ff..cd826b781 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Liber Omnium Finium 242a11.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2730': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920105/BBE662BDDC5F2C94A5DE10256B991D1E1DD2C50D/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Living Ink Upgrade Sheet 19a05b.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Living Ink Upgrade Sheet 19a05b.ttslua index da78a5353..249c91328 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Living Ink Upgrade Sheet 19a05b.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Living Ink Upgrade Sheet 19a05b.ttslua @@ -49,29 +49,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -96,14 +98,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -116,7 +121,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -442,7 +447,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -675,8 +680,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -686,7 +691,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -700,7 +705,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -708,7 +713,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -719,7 +724,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -727,7 +732,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -735,7 +740,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -743,7 +748,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -751,8 +756,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -760,7 +765,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -768,8 +773,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -788,8 +793,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -797,8 +802,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -806,7 +811,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -817,8 +822,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -826,8 +831,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -835,8 +840,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -844,7 +849,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -852,7 +857,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -862,10 +867,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -873,8 +878,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -882,8 +887,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -907,7 +912,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -915,8 +920,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -928,7 +933,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Makeshift Trap Upgrade Sheet 64dfce.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Makeshift Trap Upgrade Sheet 64dfce.ttslua index 1f232703d..6599ce933 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Makeshift Trap Upgrade Sheet 64dfce.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Makeshift Trap Upgrade Sheet 64dfce.ttslua @@ -41,6 +41,398 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/MakeshiftTrapUpgradeSheet") end) @@ -323,7 +715,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -549,391 +941,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml index e61e97766..83a1ad89a 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml @@ -22,7 +22,18 @@ DragSelectable: true GMNotes: "{\n \"id\": \"08007-pb\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Wayfarer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Relics of the - Past\"\n}" + Past\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08008\": 1,\n \"90063\": 1\n + \ },\n {\n \"08009\": 1,\n \"90064\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n + \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"relic\",\n + \ \"charm\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 4\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": + 5,\n \"error\": \"You cannot have more than 5 level 0 Seeker cards\"\n }\n + \ ]\n}" GUID: 46b148 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) 46b147.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) 46b147.yaml index a4af2ab39..f4037fbb4 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) 46b147.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) 46b147.yaml @@ -22,7 +22,17 @@ DragSelectable: true GMNotes: "{\n \"id\": \"08007-pf\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \"traits\": \"Wayfarer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Relics of the - Past\"\n}" + Past\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08008\": 1,\n \"90063\": 1\n + \ },\n {\n \"08009\": 1,\n \"90064\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n }\n },\n {\n + \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"faction\": [\n \"seeker\"\n + \ ],\n \"level\": {\n \"min\": 1,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"seeker\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": 5,\n \"error\": + \"You cannot have more than 5 level 0 Seeker cards\"\n }\n ]\n}" GUID: 46b147 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml index ccb5be1c8..e0befa584 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml @@ -21,7 +21,19 @@ Description: The Archeologist DragSelectable: true GMNotes: "{\n \"id\": \"08007-p\",\n \"type\": \"Investigator\",\n \"class\": \"Rogue\",\n \ \"traits\": \"Wayfarer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 4,\n - \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Relics of the Past\"\n}" + \ \"combatIcons\": 2,\n \"agilityIcons\": 5,\n \"cycle\": \"Relics of the Past\",\n + \ \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"08008\": 1,\n \"90063\": 1\n + \ },\n {\n \"08009\": 1,\n \"90064\": 1\n }\n ]\n + \ },\n \"deck_options\": [\n {\n \"faction\": [\n \"rogue\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 3\n }\n },\n {\n + \ \"faction\": [\n \"neutral\"\n ],\n \"level\": {\n \"min\": + 0,\n \"max\": 5\n }\n },\n {\n \"trait\": [\n \"relic\",\n + \ \"charm\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 4\n }\n },\n {\n \"faction\": [\n \"seeker\"\n ],\n + \ \"level\": {\n \"min\": 0,\n \"max\": 0\n },\n \"limit\": + 5,\n \"error\": \"You cannot have more than 5 level 0 Seeker cards\"\n }\n + \ ]\n}" GUID: 46b146 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml index 07aa66971..2918783ae 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '24': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2317731538678126539/603CACA51D3BB18D8E97BB18CE9DE3A6E517AFF6/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml index 6df3c9bf9..a7a61efd7 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '7': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070978467/E0468E7962843128806C87A8C14BDCA5EF46A2D8/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ofuda 860c1e.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ofuda 860c1e.yaml index 45e55a04d..bc8dafc15 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Ofuda 860c1e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ofuda 860c1e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '8': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070978580/2878CF06EFC74C7701A21D5CABB22901293285A4/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml index 944d14e25..3756d5a54 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom On the Lam 9c4900.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5412': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1487830597915335413/F6B6100F5713A33245CFBB6F1D7316AA2DD0F760/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml index 15891836c..cd523df56 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '514': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557867/008C1DCB5CE961BEB32E83846BBEF4DA0F9EB38E/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml index be344b2a7..238ea0160 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '124': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558022/32883D27BAD8B1BD11F955D75BC7DA0BB0C8BBC3/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Pocket Multi Tool Upgrade Sheet d706e7.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Pocket Multi Tool Upgrade Sheet d706e7.ttslua index 79b99565c..82ca95082 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Pocket Multi Tool Upgrade Sheet d706e7.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Pocket Multi Tool Upgrade Sheet d706e7.ttslua @@ -41,133 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/PocketMultiToolUpgradeSheet") -end) -__bundle_register("playercards/customizable/PocketMultiToolUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Pocket Multi Tool - --- Color information for buttons -boxSize = 40 - --- static values -xInitial = -0.933 -xOffset = 0.075 - -customizations = { - [1] = { - checkboxes = { - posZ = -0.892, - count = 1, - } - }, - [2] = { - checkboxes = { - posZ = -0.560, - count = 1, - } - }, - [3] = { - checkboxes = { - posZ = -0.326, - count = 2, - } - }, - [4] = { - checkboxes = { - posZ = -0.092, - count = 2, - } - }, - [5] = { - checkboxes = { - posZ = 0.142, - count = 2, - }, - }, - [6] = { - checkboxes = { - posZ = 0.376, - count = 3, - } - }, - [7] = { - checkboxes = { - posZ = 0.610, - 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 @@ -390,7 +263,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -623,8 +496,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -634,7 +507,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -648,7 +521,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -656,7 +529,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -667,7 +540,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -675,7 +548,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -683,7 +556,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -691,7 +564,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -699,8 +572,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -708,7 +581,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -716,8 +589,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -736,8 +609,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -745,8 +618,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -754,7 +627,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -765,8 +638,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -774,8 +647,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -783,8 +656,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -792,7 +665,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -800,7 +673,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -810,10 +683,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -821,8 +694,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -830,8 +703,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -855,7 +728,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -863,8 +736,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -876,7 +749,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -901,29 +774,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -935,4 +810,134 @@ do return GUIDReferenceApi end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/PocketMultiToolUpgradeSheet") +end) +__bundle_register("playercards/customizable/PocketMultiToolUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Pocket Multi Tool + +-- Color information for buttons +boxSize = 40 + +-- static values +xInitial = -0.933 +xOffset = 0.075 + +customizations = { + [1] = { + checkboxes = { + posZ = -0.892, + count = 1, + } + }, + [2] = { + checkboxes = { + posZ = -0.560, + count = 1, + } + }, + [3] = { + checkboxes = { + posZ = -0.326, + count = 2, + } + }, + [4] = { + checkboxes = { + posZ = -0.092, + count = 2, + } + }, + [5] = { + checkboxes = { + posZ = 0.142, + count = 2, + }, + }, + [6] = { + checkboxes = { + posZ = 0.376, + count = 3, + } + }, + [7] = { + checkboxes = { + posZ = 0.610, + count = 4, + }, + }, +} +require("playercards/customizable/UpgradeSheetLibrary") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Power Word Upgrade Sheet 0d9481.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Power Word Upgrade Sheet 0d9481.ttslua index b067f4b97..592ffa080 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Power Word Upgrade Sheet 0d9481.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Power Word Upgrade Sheet 0d9481.ttslua @@ -41,182 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/PowerWordUpgradeSheet") -end) -__bundle_register("playercards/customizable/PowerWordUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Power Word - --- Color information for buttons -boxSize = 38 - --- static values -xInitial = -0.933 -xOffset = 0.069 - -customizations = { - [1] = { - checkboxes = { - posZ = -0.905, - count = 1, - } - }, - [2] = { - checkboxes = { - posZ = -0.6, - count = 1, - } - }, - [3] = { - checkboxes = { - posZ = -0.32, - count = 1, - } - }, - [4] = { - checkboxes = { - posZ = -0.02, - count = 1, - } - }, - [5] = { - checkboxes = { - posZ = 0.28, - count = 2, - }, - }, - [6] = { - checkboxes = { - posZ = 0.48, - count = 3, - } - }, - [7] = { - checkboxes = { - posZ = 0.775, - count = 3, - }, - }, - [8] = { - checkboxes = { - posZ = 0.975, - count = 3, - }, - }, -} - -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 @@ -439,7 +263,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -672,8 +496,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -683,7 +507,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -697,7 +521,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -705,7 +529,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -716,7 +540,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -724,7 +548,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -732,7 +556,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -740,7 +564,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -748,8 +572,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -757,7 +581,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -765,8 +589,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -785,8 +609,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -794,8 +618,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -803,7 +627,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -814,8 +638,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -823,8 +647,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -832,8 +656,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -841,7 +665,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -849,7 +673,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -859,10 +683,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -870,8 +694,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -879,8 +703,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -904,7 +728,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -912,8 +736,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -925,7 +749,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -942,4 +766,185 @@ do return PlaymatApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/PowerWordUpgradeSheet") +end) +__bundle_register("playercards/customizable/PowerWordUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Power Word + +-- Color information for buttons +boxSize = 38 + +-- static values +xInitial = -0.933 +xOffset = 0.069 + +customizations = { + [1] = { + checkboxes = { + posZ = -0.905, + count = 1, + } + }, + [2] = { + checkboxes = { + posZ = -0.6, + count = 1, + } + }, + [3] = { + checkboxes = { + posZ = -0.32, + count = 1, + } + }, + [4] = { + checkboxes = { + posZ = -0.02, + count = 1, + } + }, + [5] = { + checkboxes = { + posZ = 0.28, + count = 2, + }, + }, + [6] = { + checkboxes = { + posZ = 0.48, + count = 3, + } + }, + [7] = { + checkboxes = { + posZ = 0.775, + count = 3, + }, + }, + [8] = { + checkboxes = { + posZ = 0.975, + count = 3, + }, + }, +} + +require("playercards/customizable/UpgradeSheetLibrary") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml index 8f636be85..e8b687629 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '114': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128556/C009C807744F221A9E7A2F8B67BA9EF291EA17C8/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml index 300e20ed1..a2928156e 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '102': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378897290922/CDA9AB9A68466987CF29AD56DA4BD4A98B19A638/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml index d1f378d53..74ba5f098 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '651': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008871909441/F9E7E4782DF158E035B6692FF54B509467764C2E/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Runic Axe Upgrade Sheet be427d.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Runic Axe Upgrade Sheet be427d.ttslua index 815974d73..701658873 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Runic Axe Upgrade Sheet be427d.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Runic Axe Upgrade Sheet be427d.ttslua @@ -41,393 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/RunicAxeUpgradeSheet") end) @@ -716,7 +329,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -942,4 +555,396 @@ function maybeUpdateServitorSlotDisplay() }) end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml index 16f234bd1..c64af62ba 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ruth Westmacott 782e0a.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2731': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1684870715280920329/24678C1EA9F75CE15164134ACF04BD5642D9F434/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml index db18afe0f..0e7729f70 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '491': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136814/A09D725A3E1532BDD790011406D8BB68D1F4D2C5/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml index d2c0390d6..afe7b9fd9 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Skeptic (1) d2cd42.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5501': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1537373966843940006/71700050B0B2CD56C458047D94B9E605ED01B989/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml index 85eaa41e5..7f9a494f7 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '108': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558157/7F564EC50CF2DED0C98A9D3AB8912C2ACA5C49F5/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Speak to the Dead c763aa.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Speak to the Dead c763aa.yaml index dea5a881a..7a29fd742 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Speak to the Dead c763aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Speak to the Dead c763aa.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '92': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2195002645128570001/1519803ABED2FA378473CDEDA000B057BB06A63B/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml index 2b8f45911..3cc53c32a 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1315': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558285/956F8A6681A8C59624AFE2EE21D137D467182515/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml index e8212bcab..d697c436e 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '252': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558420/A4269A773E17F55209B1DEBC2EA627314E1070E5/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml index 7ba08090f..c30b13a01 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '21': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186534148818/349C8EF53B9C78E4A0A9C22F7322423DF23AD5C7/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Summoned Servitor Upgrade Sheet 5397a6.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom Summoned Servitor Upgrade Sheet 5397a6.ttslua index 3db752743..420f672c7 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Summoned Servitor Upgrade Sheet 5397a6.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Summoned Servitor Upgrade Sheet 5397a6.ttslua @@ -41,325 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -373,14 +54,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -393,7 +77,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -728,7 +412,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -954,4 +638,325 @@ function maybeUpdateServitorSlotDisplay() }) end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml index 6de97d4e8..e8adf3943 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '522': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186534148947/3C443D851F06103A1FC8D98195AE4B907A442385/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml index 6a340c2e3..d06e64874 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '345': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008871909588/C2A18B9B3FFC42C2420E348FDA928FCE02DF8E71/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml index 40bf1ca09..ef29ffbff 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5395': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/1017195287736531119/B300331BEF8B29732A2AD6123D59380B7ECB631C/ NumHeight: 1 NumWidth: 1 @@ -20,8 +20,9 @@ CustomDeck: Description: John Dee Translation (Advanced) DragSelectable: true GMNotes: "{\n \"id\": \"90003\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n - \ \"class\": \"Neutral\",\n \"traits\": \"Item. Tome.\",\n \"weakness\": true,\n - \ \"cycle\": \"Standalone\"\n}" + \ \"class\": \"Neutral\",\n \"traits\": \"Item. Tome.\",\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Horror\",\n \"token\": \"horror\"\n + \ }\n ],\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 5b2e10 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom The Raven Quill Upgrade Sheet 23b96a.ttslua b/unpacked/Bag All Player Cards 15bb07/CardCustom The Raven Quill Upgrade Sheet 23b96a.ttslua index 7de1d2dec..2e234fee1 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom The Raven Quill Upgrade Sheet 23b96a.ttslua +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom The Raven Quill Upgrade Sheet 23b96a.ttslua @@ -41,6 +41,469 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/customizable/TheRavenQuillUpgradeSheet") +end) +__bundle_register("playercards/customizable/TheRavenQuillUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: The Raven Quill + +-- Color information for buttons and input boxes +boxSize = 37 +inputFontsize = 38 + +-- static values +xInitial = -0.935 +xOffset = 0.0705 + +customizations = { + [1] = { + textField = { + position = { 0.5, 0.25, -0.905 }, + width = 425 + } + }, + [2] = { + checkboxes = { + posZ = -0.72, + count = 1, + } + }, + [3] = { + checkboxes = { + posZ = -0.52, + count = 1, + } + }, + [4] = { + checkboxes = { + posZ = -0.305, + count = 2, + } + }, + [5] = { + checkboxes = { + posZ = -0.105, + count = 2, + }, + textField = { + position = { 0.125, 0.25, 0 }, + width = 775 + } + }, + [6] = { + checkboxes = { + posZ = 0.1, + count = 2, + } + }, + [7] = { + checkboxes = { + posZ = 0.4, + count = 3, + } + }, + [8] = { + checkboxes = { + posZ = 0.695, + 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 @@ -263,7 +726,7 @@ function updateTextField(rowIndex) end end -function clickCheckbox(row, col, buttonIndex) +function clickCheckbox(row, col) if selectedUpgrades[row] == nil then selectedUpgrades[row] = { } selectedUpgrades[row].xp = 0 @@ -489,462 +952,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/TheRavenQuillUpgradeSheet") -end) -__bundle_register("playercards/customizable/TheRavenQuillUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: The Raven Quill - --- Color information for buttons and input boxes -boxSize = 37 -inputFontsize = 38 - --- static values -xInitial = -0.935 -xOffset = 0.0705 - -customizations = { - [1] = { - textField = { - position = { 0.5, 0.25, -0.905 }, - width = 425 - } - }, - [2] = { - checkboxes = { - posZ = -0.72, - count = 1, - } - }, - [3] = { - checkboxes = { - posZ = -0.52, - count = 1, - } - }, - [4] = { - checkboxes = { - posZ = -0.305, - count = 2, - } - }, - [5] = { - checkboxes = { - posZ = -0.105, - count = 2, - }, - textField = { - position = { 0.125, 0.25, 0 }, - width = 775 - } - }, - [6] = { - checkboxes = { - posZ = 0.1, - count = 2, - } - }, - [7] = { - checkboxes = { - posZ = 0.4, - count = 3, - } - }, - [8] = { - checkboxes = { - posZ = 0.695, - count = 4, - } - }, -} - -require("playercards/customizable/UpgradeSheetLibrary") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml index 4558916f8..584f4a58a 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '131': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2316603641240722224/B99E98444E70743A1A55DF86CC7EF09C9B4B43FF/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml index 23c8a95ef..aaf006aed 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '521': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378887536350/F17918D27323F466AD8835E5DCE218FB81BD5804/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml index 2c85012c9..8e65b99da 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '1231': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875868083/4DA5C631FAAB5B6A2B7FD46DFC47C3EAF9ACB71A/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml index e4453de75..93ea81530 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '134': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520604/13B2733436FDBFFCAAF9BD76DFE053F96F559A7E/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml index 642530663..c12fd645f 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '145': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136955/D4A382DBA69D8CBD9671F2E9F1B55DAFA95F4C3D/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml index b4a4e3d6e..5f02c2f69 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '105': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378897291066/DC879288F0D5EFCF4309F03DC305A081902FEB29/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml index c0f60c56b..6cd329775 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '10': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528307333/8668BDBDA77DF0DA43A153536C7ED6ED22AC05D0/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml index 41af9f52e..7095df386 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '3625': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875868194/EE49215440FE21B738BBF0E69644A32701A19FC0/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml index 44d3083ed..0a434fcf1 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '9': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070978691/AE0143320D2C6CE35BCF1BFE50ABBCAA82546854/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml index 7b3f8e09b..3ab0920b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml @@ -22,7 +22,16 @@ DragSelectable: true GMNotes: "{\n \"id\": \"10001\",\n \"type\": \"Investigator\",\n \"class\": \"Guardian\",\n \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" + Vale\",\n \"deck_requirements\": {\n \"size\": 30,\n \"randomBasicWeaknessCount\": + 1,\n \"signatures\": [\n {\n \"10002\": 1\n },\n {\n \"10003\": + 1\n }\n ]\n },\n \"deck_options\": [\n {\n \"faction\": [\n \"neutral\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 5\n }\n + \ },\n {\n \"faction\": [\n \"guardian\"\n ],\n \"level\": + {\n \"min\": 0,\n \"max\": 4\n }\n },\n {\n \"trait\": + [\n \"tool\"\n ],\n \"level\": {\n \"min\": 0,\n \"max\": + 5\n }\n },\n {\n \"trait\": [\n \"improvised\",\n \"upgrade\"\n + \ ],\n \"level\": {\n \"min\": 0,\n \"max\": 1\n },\n + \ \"limit\": 5\n }\n ]\n}" GUID: 55eab5 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml index 7651b7bc2..b8d2b919f 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '741': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2278323044302431462/6976437175C83B7356B6C95335C1ED88140CD57A/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Zamacona 541ba9.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Zamacona 541ba9.yaml index b117fd4c5..28cea0747 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Zamacona 541ba9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Zamacona 541ba9.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '10': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009071331144/5BF472F3A7B8E786FE4942B38201E09E8291A77A/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.ttslua b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.ttslua index 91ed10d69..39ba3ec2f 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.ttslua +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.ttslua @@ -243,26 +243,17 @@ end function updateMemoryWithMoves() memoryList = memoryListBackup --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) + local obj = getObjectFromGUID(moveGuid or "") -- p1 is where needs to go, p2 is where it was local refObjPos = memoryList[moveGuid].pos local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() for guid, entry in pairs(memoryList) do memoryList[guid].pos.x = entry.pos.x - deltaPos.x memoryList[guid].pos.y = entry.pos.y - deltaPos.y memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z end - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} moveList = {} end @@ -808,4 +799,4 @@ end function AllMemoryBagsInScene:getGuidList() return Global.getTable(self.NAME_OF_GLOBAL_VARIABLE) or {} -end +end \ No newline at end of file diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Hand Helper 450688.ttslua b/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Hand Helper 450688.ttslua index d18b081d8..48f1a1120 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Hand Helper 450688.ttslua +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Hand Helper 450688.ttslua @@ -41,6 +41,327 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -54,14 +375,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -74,7 +398,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -230,323 +554,4 @@ function discardRandom() playmatApi.doDiscardOne(matColor) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Search Assistant 17aed0.ttslua b/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Search Assistant 17aed0.ttslua index 1ba1e0adc..44ebbaf38 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Search Assistant 17aed0.ttslua +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Tile Search Assistant 17aed0.ttslua @@ -41,48 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("accessories/SearchAssistant") end) @@ -283,8 +241,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -294,7 +252,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -308,7 +266,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -316,7 +274,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -327,7 +285,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -335,7 +293,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -343,7 +301,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -351,7 +309,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -359,8 +317,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -368,7 +326,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -376,8 +334,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -396,8 +354,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -405,8 +363,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -414,7 +372,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -425,8 +383,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -434,8 +392,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -443,8 +401,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -452,7 +410,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -460,7 +418,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -470,10 +428,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -481,8 +439,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -490,8 +448,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -515,7 +473,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -523,8 +481,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -536,7 +494,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -566,14 +524,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -586,7 +547,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -621,4 +582,48 @@ do return SearchLib end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Clean Up Helper 26cf4b.ttslua b/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Clean Up Helper 26cf4b.ttslua index 9fa6e42fd..f5a5fc265 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Clean Up Helper 26cf4b.ttslua +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Clean Up Helper 26cf4b.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("accessories/CleanUpHelper") +end) __bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local BlessCurseManagerApi = {} @@ -59,35 +62,41 @@ do end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.sealedToken = function(type, guid) getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.releasedToken = function(type, guid) getManager().call("releasedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token BlessCurseManagerApi.returnedToken = function(type, guid) getManager().call("returnedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to + ---@param playerColor string Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) getManager().call("doRemove", playerColor) end -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end @@ -95,152 +104,48 @@ do return BlessCurseManagerApi end end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local GUIDReferenceApi = {} - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + local function getGuidHandler() + return getObjectFromGUID("123456") end - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + ---@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 the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") + -- 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 - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) + -- 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 - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + -- 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 - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("core/SoundCubeApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SoundCubeApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- this table links the name of a trigger effect to its index - local soundIndices = { - ["Vacuum"] = 0, - ["Deep Bell"] = 1, - ["Dark Souls"] = 2 - } - - local function playTriggerEffect(index) - local SoundCube = guidReferenceApi.getObjectByOwnerAndType("Mythos", "SoundCube") - SoundCube.AssetBundle.playTriggerEffect(index) - end - - -- plays the by name requested sound - ---@param soundName String Name of the sound to play - SoundCubeApi.playSoundByName = function(soundName) - playTriggerEffect(soundIndices[soundName]) - end - - return SoundCubeApi + return GUIDReferenceApi end end) __bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -279,6 +184,283 @@ do return TokenSpawnTracker end end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -292,14 +474,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -312,7 +497,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -630,7 +815,7 @@ function tidyPlayerMatCoroutine() local trash = guidReferenceApi.getObjectByOwnerAndType(COLORS[i], "Trash") if trash == nil then printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found!", "Red") - break + goto continue end local objList @@ -665,6 +850,7 @@ function tidyPlayerMatCoroutine() end end end + ::continue:: end -- reset spawned data @@ -683,7 +869,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -710,29 +896,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -741,14 +928,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -760,326 +951,148 @@ do return ChaosBagApi end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} + local PlayAreaApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") end - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") end - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") end - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) end - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) end - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) end - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) end - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) end - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) end - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") end - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) end - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) end - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image end - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) end - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") end - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi + return PlayAreaApi end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("accessories/CleanUpHelper") +__bundle_register("core/SoundCubeApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SoundCubeApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- this table links the name of a trigger effect to its index + local soundIndices = { + ["Vacuum"] = 0, + ["Deep Bell"] = 1, + ["Dark Souls"] = 2 + } + + ---@param index number Index of the sound effect to play + local function playTriggerEffect(index) + local SoundCube = guidReferenceApi.getObjectByOwnerAndType("Mythos", "SoundCube") + SoundCube.AssetBundle.playTriggerEffect(index) + end + + -- plays the by name requested sound + ---@param soundName string Name of the sound to play + SoundCubeApi.playSoundByName = function(soundName) + playTriggerEffect(soundIndices[soundName]) + end + + return SoundCubeApi +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Displacement Tool 0f1374.ttslua b/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Displacement Tool 0f1374.ttslua index 8684d0080..e3b38584c 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Displacement Tool 0f1374.ttslua +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Token Displacement Tool 0f1374.ttslua @@ -104,60 +104,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -174,13 +169,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -200,7 +195,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -220,29 +215,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, diff --git a/unpacked/Bag OptionPanel Source 830bd0/Infinite_Bag Attachment Helper 7f4976.yaml b/unpacked/Bag OptionPanel Source 830bd0/Infinite_Bag Attachment Helper 7f4976.yaml index 062d23b47..0d2a23207 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Infinite_Bag Attachment Helper 7f4976.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Infinite_Bag Attachment Helper 7f4976.yaml @@ -57,46 +57,44 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"accessories/AttachmentHelper\")\nend)\n__bundle_register(\"accessories/AttachmentHelper\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"accessories/AttachmentHelper\", function(require, _LOADED, __bundle_register, __bundle_modules)\nlocal searchLib - = require(\"util/SearchLib\")\nlocal fontColor\nlocal BACKGROUNDS = {\n {\n title - \ = \"Ancestral Knowledge\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1915746489207287888/2F9F6F211ED0F98E66C9D35D93221E4C7FB6DD3C/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Astronomical Atlas\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/1754695853007989004/9153BC204FC707AE564ECFAC063A11CB8C2B5D1E/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Backpack\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/2018212896278691928/F55BEFFC2540109C6333179532F583B367FF2EBC/\",\n - \ fontcolor = { 0, 0, 0 }\n },\n {\n title = \"Binder's Jar\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/2021606446228642191/4C149527851C1DBB3015F93DE91667937A3F91DD/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Crystallizer of Dreams\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/1915746489207280958/100F16441939E5E23818651D1EB5C209BF3125B9/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Diana Stanley\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/1754695635919071208/1AB7222850201630826BFFBA8F2BD0065E2D572F/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Gloria Goldberg\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/1754695635919102502/453D4426118C8A6DE2EA281184716E26CA924C84/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Ikiaq\",\n url = - \"http://cloud-3.steamusercontent.com/ugc/2021606446228198966/5A408D8D760221DEA164E986B9BE1F79C4803071/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Katja Eastbank\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228203475/62EEE12F4DB1EB80D79B087677459B954380215F/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Ravenous\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/2021606446228208075/EAC598A450BEE504A7FE179288F1FBBF7ABFA3E0/\",\n - \ fontcolor = { 0, 0, 0 }\n },\n {\n title = \"Sefina Rousseau\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/1754695635919099826/3C3CBFFAADB2ACA9957C736491F470AE906CC953/\",\n - \ fontcolor = { 0, 0, 0 }\n },\n {\n title = \"Stick to the Plan\",\n - \ url = \"http://cloud-3.steamusercontent.com/ugc/2018214163838897493/8E38B96C5A8D703A59009A932432CBE21ABE63A2/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Subject 5U-21\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/2021606446228199363/CE43D58F37C9F48BDD6E6E145FE29BADEFF4DBC5/\",\n - \ fontcolor = { 1, 1, 1 }\n },\n {\n title = \"Wooden Sledge\",\n url - \ = \"http://cloud-3.steamusercontent.com/ugc/1750192233783143973/D526236AAE16BDBB98D3F30E27BAFC1D3E21F4AC/\",\n - \ fontcolor = { 0, 0, 0 }\n }\n}\n\n-- save state and options to restore onLoad\nfunction - onSave() return JSON.encode({ cardsInBag, showCost, showIcons }) end\n\n-- load - variables and create context menu\nfunction onLoad(savedData)\n local loadedData - = JSON.decode(savedData)\n cardsInBag = loadedData[1] or {}\n showCost - \ = loadedData[2] or true\n showIcons = loadedData[3] or true\n - \ fontColor = getFontColor()\n recreateButtons()\n\n self.addContextMenuItem(\"Select - image\", selectImage)\n self.addContextMenuItem(\"Toggle cost\", function(color)\n - \ showCost = not showCost\n printToColor(\"Show cost of cards: \" .. tostring(showCost), - color, \"White\")\n refresh()\n end)\n\n self.addContextMenuItem(\"Toggle + = require(\"util/SearchLib\")\nlocal fontColor, lastRejectedName\nlocal BACKGROUNDS + = {\n {\n title = \"Ancestral Knowledge\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1915746489207287888/2F9F6F211ED0F98E66C9D35D93221E4C7FB6DD3C/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = true\n },\n {\n title = + \"Astronomical Atlas\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1754695853007989004/9153BC204FC707AE564ECFAC063A11CB8C2B5D1E/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = true\n },\n {\n title = + \"Backpack\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2018212896278691928/F55BEFFC2540109C6333179532F583B367FF2EBC/\",\n + \ fontcolor = { 0, 0, 0 },\n icons = false\n },\n {\n title = + \"Bewitching\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2342503480966345423/F2070B5479C814F35780373966D77D91767A97CC/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Binder's Jar\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228642191/4C149527851C1DBB3015F93DE91667937A3F91DD/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Crystallizer of Dreams\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1915746489207280958/100F16441939E5E23818651D1EB5C209BF3125B9/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = true\n },\n {\n title = + \"Diana Stanley\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1754695635919071208/1AB7222850201630826BFFBA8F2BD0065E2D572F/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Gloria Goldberg\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1754695635919102502/453D4426118C8A6DE2EA281184716E26CA924C84/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Ikiaq\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228198966/5A408D8D760221DEA164E986B9BE1F79C4803071/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Katja Eastbank\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228203475/62EEE12F4DB1EB80D79B087677459B954380215F/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Ravenous\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228208075/EAC598A450BEE504A7FE179288F1FBBF7ABFA3E0/\",\n + \ fontcolor = { 0, 0, 0 },\n icons = false\n },\n {\n title = + \"Sefina Rousseau\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1754695635919099826/3C3CBFFAADB2ACA9957C736491F470AE906CC953/\",\n + \ fontcolor = { 0, 0, 0 },\n icons = false\n },\n {\n title = + \"Stick to the Plan\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2018214163838897493/8E38B96C5A8D703A59009A932432CBE21ABE63A2/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Subject 5U-21\",\n url = \"http://cloud-3.steamusercontent.com/ugc/2021606446228199363/CE43D58F37C9F48BDD6E6E145FE29BADEFF4DBC5/\",\n + \ fontcolor = { 1, 1, 1 },\n icons = false\n },\n {\n title = + \"Wooden Sledge\",\n url = \"http://cloud-3.steamusercontent.com/ugc/1750192233783143973/D526236AAE16BDBB98D3F30E27BAFC1D3E21F4AC/\",\n + \ fontcolor = { 0, 0, 0 },\n icons = false\n }\n}\n\n-- save state and + options to restore onLoad\nfunction onSave() return JSON.encode({ cardsInBag, + showIcons }) end\n\n-- load variables and create context menu\nfunction onLoad(savedData)\n + \ local loadedData = JSON.decode(savedData)\n cardsInBag = loadedData[1]\n + \ showIcons = loadedData[2]\n fontColor = getFontColor()\n recreateButtons()\n\n + \ self.addContextMenuItem(\"Select image\", selectImage)\n self.addContextMenuItem(\"Toggle skill icons\", function(color)\n showIcons = not showIcons\n printToColor(\"Show skill icons of cards: \" .. tostring(showIcons), color, \"White\")\n refresh()\n \ end)\nend\n\n-- gets the font color based on background url\nfunction getFontColor()\n @@ -109,30 +107,32 @@ ContainedObjects: level information from syncName\n syncName = syncName:gsub(\"%s%(%d%)\", \"\")\n\n \ -- loop through background table\n for _, bgInfo in ipairs(BACKGROUNDS) do\n \ if bgInfo.title == syncName then\n printToColor(\"Background for '\" - .. syncName .. \"' loaded!\", playerColor, \"Green\")\n updateImage(bgInfo.url)\n - \ return\n end\n end\n printToColor(\"Didn't find background for '\" - .. syncName .. \"'!\", playerColor, \"Orange\")\nend\n\n-- called by context menu - to change background image\nfunction selectImage(color)\n -- generate list of - options\n local options = {}\n for i = 1, #BACKGROUNDS do\n options[i] = - BACKGROUNDS[i].title\n end\n\n -- prompt user to select option\n Player[color].showOptionsDialog(\"Select - image:\", options, 1, function(_, optionIndex)\n updateImage(BACKGROUNDS[optionIndex].url)\n + .. syncName .. \"' loaded!\", playerColor, \"Green\")\n showIcons = bgInfo.icons\n + \ updateImage(bgInfo.url)\n return\n end\n end\n printToColor(\"Didn't + find background for '\" .. syncName .. \"'!\", playerColor, \"Orange\")\nend\n\n-- + called by context menu to change background image\nfunction selectImage(color)\n + \ -- generate list of options\n local options = {}\n for i = 1, #BACKGROUNDS + do\n options[i] = BACKGROUNDS[i].title\n end\n\n -- prompt user to select + option\n Player[color].showOptionsDialog(\"Select image:\", options, 1, function(_, + optionIndex)\n showIcons = BACKGROUNDS[optionIndex].icons\n updateImage(BACKGROUNDS[optionIndex].url)\n \ end)\nend\n\n-- sets background to the provided URL\nfunction updateImage(url)\n - \ self.script_state = JSON.encode({ cardsInBag, showCost, showIcons })\n local - customInfo = self.getCustomObject()\n customInfo.diffuse = url\n self.setCustomObject(customInfo)\n + \ self.script_state = JSON.encode({ cardsInBag, showIcons })\n local customInfo + = self.getCustomObject()\n customInfo.diffuse = url\n self.setCustomObject(customInfo)\n \ self.reload()\nend\n\n-- only allow cards to enter, split decks and reject other - objects\nfunction onObjectEnterContainer(container, object)\n if container ~= - self then return end\n if object.type == \"Deck\" then\n takeDeckOut(object.getGUID(), - self.getPosition() + Vector(0, 0.1, 0))\n elseif object.type ~= \"Card\" then\n - \ broadcastToAll(\"The 'Attachment Helper' is meant to be used for cards.\", - \"White\")\n else\n findCard(object.getGUID(), object.getName(), object.getGMNotes())\n - \ recreateButtons()\n end\nend\n\n-- takes the deck out and splits in into - single cards\nfunction takeDeckOut(guid, pos)\n local deck = self.takeObject({ - guid = guid, position = pos, smooth = false })\n for i = 1, #deck.getObjects() - do\n self.putObject(deck.takeObject({ position = pos + Vector(0, 0.1 * i, 0), - smooth = false }))\n end\nend\n\n-- removes leaving cards from the \"cardInBag\" + objects\nfunction tryObjectEnter(object)\n -- block repeated collisions\n if + object.getName() == lastRejectedName then return end\n\n if object.type == \"Deck\" + then\n local pos = self.getPosition()\n for i = 1, #object.getObjects() + do\n local card = object.takeObject({ position = pos + Vector(0, 0.1 * i, + 0), smooth = false })\n findCard(card.getGUID(), card.getName(), card.getGMNotes())\n + \ self.putObject(card)\n end\n recreateButtons()\n return false\n + \ elseif object.type ~= \"Card\" then\n broadcastToAll(\"The 'Attachment Helper' + only supports cards.\", \"Orange\")\n lastRejectedName = object.getName()\n + \ Wait.time(function() lastRejectedName = nil end, 1)\n return false\n else\n + \ findCard(object.getGUID(), object.getName(), object.getGMNotes())\n recreateButtons()\n + \ return true\n end\nend\n\n-- removes leaving cards from the \"cardInBag\" table\nfunction onObjectLeaveContainer(container, object)\n if container == self then\n local guid = object.getGUID()\n local found = false\n for i, card - in ipairs(cardsInBag) do\n if card.id == guid then\n table.remove(cardsInBag, + in ipairs(cardsInBag) do\n if card.guid == guid then\n table.remove(cardsInBag, i)\n found = true\n break\n end\n end\n\n if found ~= true then\n local name = object.getName()\n for i, card in ipairs(cardsInBag) do\n if card.name == name then\n table.remove(cardsInBag, i)\n @@ -140,71 +140,74 @@ ContainedObjects: refreshes displayed buttons based on contained cards\nfunction refresh()\n cardsInBag = {}\n for _, object in ipairs(self.getObjects()) do\n findCard(object.guid, object.name, object.gm_notes)\n end\n recreateButtons()\nend\n\n-- gets cost - and icons for a card\nfunction findCard(guid, name, GMNotes)\n local cost = \"\"\n - \ local icons = {}\n local metadata = {}\n local displayName = name\n\n if - displayName == nil or displayName == \"\" then displayName = \"unnamed\" end\n - \ if showCost or showIcons then metadata = JSON.decode(GMNotes) end\n\n if showCost - then\n if GMNotes ~= \"\" then cost = metadata.cost end\n if cost == nil - or cost == \"\" then cost = \"\u2013\" end\n displayName = \"[\" .. cost .. - \"] \" .. displayName\n end\n\n if showIcons then\n if GMNotes ~= \"\" then\n - \ icons[1] = metadata.wildIcons\n icons[2] = metadata.willpowerIcons\n + and icons for a card\nfunction findCard(guid, name, GMNotes)\n local icons = + {}\n local metadata = JSON.decode(GMNotes) or {}\n local buttonLabel = name + or \"unnamed\"\n\n if metadata.cost then\n buttonLabel = \"[\" .. metadata.cost + .. \"] \" .. buttonLabel\n end\n\n if showIcons then\n if metadata ~= {} + then\n icons[1] = metadata.wildIcons\n icons[2] = metadata.willpowerIcons\n \ icons[3] = metadata.intellectIcons\n icons[4] = metadata.combatIcons\n \ icons[5] = metadata.agilityIcons\n end\n\n local IconTypes = { \"Wild\", \"Willpower\", \"Intellect\", \"Combat\", \"Agility\" }\n local found = false\n \ for i = 1, 5 do\n if icons[i] ~= nil and icons[i] ~= \"\" then\n if - found == false then\n displayName = displayName .. \"\\n\" .. IconTypes[i] - .. \": \" .. icons[i]\n found = true\n else\n displayName - = displayName .. \" \" .. IconTypes[i] .. \": \" .. icons[i]\n end\n end\n - \ end\n end\n table.insert(cardsInBag, { name = name, displayName = displayName, - id = guid })\nend\n\n-- recreates buttons with up-to-date labels\nfunction recreateButtons()\n - \ self.clearButtons()\n local verticalPosition = 1.65\n\n for _, card in ipairs(cardsInBag) - do\n local id = card.id\n local funcName = \"removeCard\" .. id\n self.setVar(funcName, - function() removeCard(id) end)\n self.createButton({\n label = - card.displayName,\n click_function = funcName,\n function_owner = self,\n - \ position = { 0, -0.1, verticalPosition },\n height = - 200,\n width = 1200,\n font_size = string.len(card.displayName) - > 20 and 75 or 100\n })\n verticalPosition = verticalPosition - 0.5\n end\n\n - \ local countLabel = #cardsInBag\n local fontSize = 250\n if #cardsInBag == - 0 then\n countLabel = \"Attachment Helper\"\n fontSize = 150\n end\n\n - \ self.createButton({\n label = countLabel,\n click_function = - \"none\",\n function_owner = self,\n position = { 0, -0.1, -1.7 },\n - \ height = 0,\n width = 0,\n font_size = fontSize,\n - \ font_color = fontColor\n })\nend\n\n-- click-function for buttons to - take a card out of the bag\nfunction removeCard(cardGUID)\n self.takeObject({\n - \ guid = cardGUID,\n rotation = self.getRotation(),\n position = self.getPosition() - + Vector(0, 0.25, 0),\n callback_function = function(obj) obj.resting = true - end\n })\nend\nend)\n__bundle_register(\"util/SearchLib\", function(require, - _LOADED, __bundle_register, __bundle_modules)\ndo\n local SearchLib = {}\n local - filterFunctions = {\n isActionToken = function(x) return x.getDescription() + found == false then\n buttonLabel = buttonLabel .. \"\\n\"\n found + = true\n else\n buttonLabel = buttonLabel .. \" \"\n end\n + \ buttonLabel = buttonLabel .. IconTypes[i] .. \": \" .. icons[i]\n end\n + \ end\n end\n table.insert(cardsInBag, { buttonLabel = buttonLabel, hasIcons + = (#icons > 0), name = name, guid = guid })\nend\n\n-- recreates buttons with + up-to-date labels\nfunction recreateButtons()\n self.clearButtons()\n local + verticalPosition = 1.65\n\n -- create buttons for the last 7 cards that entered\n + \ for i = #cardsInBag, 1, -1 do\n if (i + 7) == #cardsInBag then\n printToAll(\"Only + displaying buttons for the last 7 cards.\", \"Orange\")\n break\n end\n\n + \ local card = cardsInBag[i]\n\n -- click function\n local funcName = + \"removeCard\" .. card.guid\n self.setVar(funcName, function() removeCard(card.guid) + end)\n\n -- font size\n local fontSize = 100\n if card.hasIcons or string.len(card.buttonLabel) + > 20 then\n fontSize = 75\n end\n\n -- button creation\n self.createButton({\n + \ label = card.buttonLabel,\n click_function = funcName,\n function_owner + = self,\n position = { 0, -0.1, verticalPosition },\n height = + 200,\n width = 1200,\n font_size = fontSize\n })\n + \ verticalPosition = verticalPosition - 0.485\n end\n\n local countLabel = + #cardsInBag\n local fontSize = 250\n if #cardsInBag == 0 then\n countLabel + = \"Attachment Helper\"\n fontSize = 150\n end\n\n self.createButton({\n + \ label = tostring(countLabel),\n click_function = \"none\",\n function_owner + = self,\n position = { 0, -0.1, -1.7 },\n height = 0,\n width + \ = 0,\n font_size = fontSize,\n font_color = fontColor\n + \ })\nend\n\n-- click-function for buttons to take a card out of the bag\nfunction + removeCard(cardGUID)\n self.takeObject({\n guid = cardGUID,\n rotation + = self.getRotation(),\n position = self.getPosition() + Vector(0, 0.25, 0),\n + \ callback_function = function(obj) obj.resting = true end\n })\nend\nend)\n__bundle_register(\"util/SearchLib\", + function(require, _LOADED, __bundle_register, __bundle_modules)\ndo\n local SearchLib + = {}\n local filterFunctions = {\n isActionToken = function(x) return x.getDescription() == \"Action Token\" end,\n isCard = function(x) return x.type == \"Card\" end,\n \ isDeck = function(x) return x.type == \"Deck\" end,\n isCardOrDeck = function(x) return x.type == \"Card\" or x.type == \"Deck\" end,\n isClue = function(x) return x.memo == \"clueDoom\" and x.is_face_down == false end,\n isTileOrToken = function(x) return x.type == \"Tile\" end\n }\n\n -- performs the actual search - and returns a filtered list of object references\n ---@param pos Table Global - position\n ---@param rot Table Global rotation\n ---@param size Table Size\n - \ ---@param filter String Name of the filter function\n ---@param direction Table - Direction (positive is up)\n ---@param maxDistance Number Distance for the cast\n - \ local function returnSearchResult(pos, rot, size, filter, direction, maxDistance)\n - \ if filter then filter = filterFunctions[filter] end\n local searchResult - = Physics.cast({\n origin = pos,\n direction = direction or - { 0, 1, 0 },\n orientation = rot or { 0, 0, 0 },\n type = 3,\n - \ size = size,\n max_distance = maxDistance or 0\n })\n\n - \ -- filtering the result\n local objList = {}\n for _, v in ipairs(searchResult) - do\n if not filter or filter(v.hit_object) then\n table.insert(objList, - v.hit_object)\n end\n end\n return objList\n end\n\n -- searches - the specified area\n SearchLib.inArea = function(pos, rot, size, filter)\n return - returnSearchResult(pos, rot, size, filter)\n end\n\n -- searches the area on - an object\n SearchLib.onObject = function(obj, filter)\n pos = obj.getPosition()\n - \ size = obj.getBounds().size:setAt(\"y\", 1)\n return returnSearchResult(pos, - _, size, filter)\n end\n\n -- searches the specified position (a single point)\n - \ SearchLib.atPosition = function(pos, filter)\n size = { 0.1, 2, 0.1 }\n return - returnSearchResult(pos, _, size, filter)\n end\n\n -- searches below the specified - position (downwards until y = 0)\n SearchLib.belowPosition = function(pos, filter)\n - \ direction = { 0, -1, 0 }\n maxDistance = pos.y\n return returnSearchResult(pos, - _, size, filter, direction, maxDistance)\n end\n\n return SearchLib\nend\nend)\nreturn + and returns a filtered list of object references\n ---@param pos tts__Vector + Global position\n ---@param rot? tts__Vector Global rotation\n ---@param size + table Size\n ---@param filter? string Name of the filter function\n ---@param + direction? table Direction (positive is up)\n ---@param maxDistance? number Distance + for the cast\n local function returnSearchResult(pos, rot, size, filter, direction, + maxDistance)\n local filterFunc\n if filter then\n filterFunc = filterFunctions[filter]\n + \ end\n local searchResult = Physics.cast({\n origin = pos,\n + \ direction = direction or { 0, 1, 0 },\n orientation = rot or { + 0, 0, 0 },\n type = 3,\n size = size,\n max_distance + = maxDistance or 0\n })\n\n -- filtering the result\n local objList = + {}\n for _, v in ipairs(searchResult) do\n if not filter or filterFunc(v.hit_object) + then\n table.insert(objList, v.hit_object)\n end\n end\n return + objList\n end\n\n -- searches the specified area\n SearchLib.inArea = function(pos, + rot, size, filter)\n return returnSearchResult(pos, rot, size, filter)\n end\n\n + \ -- searches the area on an object\n SearchLib.onObject = function(obj, filter)\n + \ pos = obj.getPosition()\n size = obj.getBounds().size:setAt(\"y\", 1)\n + \ return returnSearchResult(pos, _, size, filter)\n end\n\n -- searches the + specified position (a single point)\n SearchLib.atPosition = function(pos, filter)\n + \ size = { 0.1, 2, 0.1 }\n return returnSearchResult(pos, _, size, filter)\n + \ end\n\n -- searches below the specified position (downwards until y = 0)\n + \ SearchLib.belowPosition = function(pos, filter)\n direction = { 0, -1, 0 + }\n maxDistance = pos.y\n return returnSearchResult(pos, _, size, filter, + direction, maxDistance)\n end\n\n return SearchLib\nend\nend)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"accessories/AttachmentHelper\")\nend)\nreturn __bundle_require(\"__root\")" - LuaScriptState: '[[],true,true]' + LuaScriptState: '[[],true]' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 @@ -222,7 +225,7 @@ ContainedObjects: posZ: -19.636 rotX: 0 rotY: 270 - rotZ: 359 + rotZ: 0 scaleX: 0.8 scaleY: 1 scaleZ: 0.8 diff --git a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Devil · XV 8328fd.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Devil · XV 8328fd.ttslua index 85990f2b9..8fddee22b 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Devil · XV 8328fd.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Devil · XV 8328fd.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/Tarotcard") -end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -68,4 +65,7 @@ function rotateSelfAndPreview() rotatePreview() end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/Tarotcard") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Fool · 0 01cd9f.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Fool · 0 01cd9f.ttslua index 85990f2b9..8fddee22b 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Fool · 0 01cd9f.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Fool · 0 01cd9f.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/Tarotcard") -end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -68,4 +65,7 @@ function rotateSelfAndPreview() rotatePreview() end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/Tarotcard") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Hierophant · V 2f9064.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Hierophant · V 2f9064.ttslua index 85990f2b9..8fddee22b 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Hierophant · V 2f9064.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Hierophant · V 2f9064.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/Tarotcard") -end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -68,4 +65,7 @@ function rotateSelfAndPreview() rotatePreview() end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/Tarotcard") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag Token Source 124381/Custom_Token Resource 910e09.yaml b/unpacked/Bag Token Source 124381/Custom_Token Resource 910e09.yaml index 661642d87..8c88b7f6d 100644 --- a/unpacked/Bag Token Source 124381/Custom_Token Resource 910e09.yaml +++ b/unpacked/Bag Token Source 124381/Custom_Token Resource 910e09.yaml @@ -348,6 +348,58 @@ States: scaleZ: 0.17 Value: 0 XmlUI: '' + '8': + AltLookAngle: + x: 0 + y: 0 + z: 0 + Autoraise: true + ColorDiffuse: + b: 1 + g: 1 + r: 1 + CustomImage: + CustomToken: + MergeDistancePixels: 10 + Stackable: true + StandUp: false + Thickness: 0.3 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: http://cloud-3.steamusercontent.com/ugc/2342503777954079997/156B97A89D6168F1199EE2E0FE155839627C8BCD/ + WidthScale: 0 + Description: '' + DragSelectable: true + GMNotes: '' + GUID: 2b4348 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + LayoutGroupSortIndex: 0 + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Memo: offering + Name: Custom_Token + Nickname: Offering + Snap: false + Sticky: true + Tooltip: true + Transform: + posX: 44 + posY: 1.5 + posZ: 8 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.17 + scaleY: 0.17 + scaleZ: 0.17 + Value: 0 + XmlUI: '' Sticky: true Tooltip: true Transform: diff --git a/unpacked/CardCustom New Encounter Back 5d5637.yaml b/unpacked/CardCustom New Encounter Back 5d5637.yaml new file mode 100644 index 000000000..66882d0d2 --- /dev/null +++ b/unpacked/CardCustom New Encounter Back 5d5637.yaml @@ -0,0 +1,51 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 266500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '2665': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940351785/F64D8EFB75A9E15446D24343DA0A6EEF5B3E43DB/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2342503777940351785/F64D8EFB75A9E15446D24343DA0A6EEF5B3E43DB/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 5d5637 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: New Encounter Back +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -28.73 + posY: 1.5 + posZ: -68.82 + rotX: 0 + rotY: 270 + rotZ: 180 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/CardCustom New Player Back 85145d.yaml b/unpacked/CardCustom New Player Back 85145d.yaml new file mode 100644 index 000000000..4860c5512 --- /dev/null +++ b/unpacked/CardCustom New Player Back 85145d.yaml @@ -0,0 +1,51 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 266400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '2664': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 85145d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: New Player Back +SidewaysCard: false +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -24.36 + posY: 1.5 + posZ: -68.82 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Checker_white Configuration 03804b.ttslua b/unpacked/Checker_white Configuration 03804b.ttslua index a617d963b..a6833387b 100644 --- a/unpacked/Checker_white Configuration 03804b.ttslua +++ b/unpacked/Checker_white Configuration 03804b.ttslua @@ -41,8 +41,11 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("arkhamdb/Configuration") +end) __bundle_register("arkhamdb/Configuration", function(require, _LOADED, __bundle_register, __bundle_modules) ----@type ArkhamImportConfiguration +---@type table Contains fields used by the deck importer configuration = { api_uri = "https://arkhamdb.com/api/public", public_deck = "decklist", diff --git a/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua b/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua index a9b6345a0..c7d7d17b7 100644 --- a/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua +++ b/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua @@ -41,126 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenSpawnTracker = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") - end - - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) - end - - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") - end - - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") - end - - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") - end - - return TokenSpawnTracker -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/TokenSpawnTool") -end) -__bundle_register("util/TokenSpawnTool", function(require, _LOADED, __bundle_register, __bundle_modules) -local searchLib = require("util/SearchLib") -local tokenManager = require("core/token/TokenManager") -local TOKEN_INDEX = {} -TOKEN_INDEX[3] = "resourceCounter" -TOKEN_INDEX[4] = "damage" -TOKEN_INDEX[5] = "path" -TOKEN_INDEX[6] = "horror" -TOKEN_INDEX[7] = "doom" -TOKEN_INDEX[8] = "clue" -TOKEN_INDEX[9] = "resource" - -local stateTable = { - ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, - ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 -} - ----@param index number Index of the pressed key ----@param playerColor string Color of the triggering player -function onScriptingButtonDown(index, playerColor) - local tokenType = TOKEN_INDEX[index] - if not tokenType then return end - - local rotation = { x = 0, y = Player[playerColor].getPointerRotation(), z = 0 } - local position = Player[playerColor].getPointerPosition() + Vector(0, 0.2, 0) - local subType = "" - local callback = nil - - -- check for subtype of resource based on card below - if tokenType == "resource" then - for _, obj in ipairs(searchLib.belowPosition(position, "isCard")) do - if not obj.is_face_down then - local metadata = JSON.decode(obj.getGMNotes()) or {} - local uses = metadata.uses or {} - for _, useInfo in ipairs(uses) do - if useInfo.token == "resource" then - subType = useInfo.type - break - end - end - break - end - end - - -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") - local stateID = stateTable[string.lower(subType)] - if stateID ~= nil and stateID ~= 1 then - callback = function(spawned) spawned.setState(stateID) end - end - -- check hovered object for "resourceCounter" tokens and increase them instead - elseif tokenType == "resourceCounter" then - local hoverObj = Player[playerColor].getHoverObject() - if hoverObj then - if tokenType == hoverObj.getMemo() then - hoverObj.call("addOrSubtract") - return - end - end - -- check hovered object for "damage" and "horror" tokens and increase them instead - elseif tokenType == "damage" or tokenType == "horror" then - local hoverObj = Player[playerColor].getHoverObject() - if hoverObj then - if tokenType == hoverObj.getMemo() then - local stateInfo = hoverObj.getStates() - local stateId = hoverObj.getStateId() - if stateId <= #stateInfo then - hoverObj.setState(stateId + 1) - return - end - end - end - end - - tokenManager.spawnToken(position, tokenType, rotation, callback) -end -end) __bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) do local guidReferenceApi = require("core/GUIDReferenceApi") @@ -277,12 +157,13 @@ do -- stateIDs for the multi-stated resource tokens local stateTable = { ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 } -- Table of data extracted from the token source bag, keyed by the Memo on each token which @@ -299,8 +180,8 @@ do -- the work once a card has hit an area where it might spawn tokens. It will check to see if -- the card has already spawned, find appropriate data from either the uses metadata or the Data -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 TokenManager.spawnForCard = function(card, extraUses) if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then @@ -315,13 +196,12 @@ do end -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) local optionPanel = optionPanelApi.getOptions() @@ -338,10 +218,10 @@ do -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to + ---@param tokenValue number Value to set the damage/horror to TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) if tokenValue < 1 or tokenValue > 50 then return end @@ -359,11 +239,11 @@ do end -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) -- not checking the max at this point since clue offsets are calculated dynamically if tokenCount < 1 then return end @@ -417,12 +297,12 @@ do end -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned + ---@param callback? function A callback function triggered after the new token is spawned TokenManager.spawnToken = function(position, tokenType, rotation, callback) internal.initTokenTemplates() local loadTokenType = tokenType @@ -456,9 +336,9 @@ do end -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) TokenManager.maybeReplenishCard = function(card, uses, mat) -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) if uses[1].count and uses[1].replenish then @@ -468,13 +348,13 @@ do -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some -- callers. - ---@param card Object Card object to reset the tokens for + ---@param card tts__Object Card object to reset the tokens for TokenManager.resetTokensSpawned = function(card) tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) end -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addPlayerCardData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -483,7 +363,7 @@ do end -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addLocationData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -492,8 +372,8 @@ do end -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise TokenManager.hasLocationData = function(card) internal.initDataHelperData() return internal.getLocationData(card) ~= nil @@ -523,8 +403,8 @@ do -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 internal.spawnTokensFromUses = function(card, extraUses) local uses = internal.getUses(card) @@ -546,7 +426,7 @@ do -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for + ---@param card tts__Object Card to maybe spawn tokens for internal.spawnTokensFromDataHelper = function(card) internal.initDataHelperData() local playerData = internal.getPlayerCardData(card) @@ -560,8 +440,8 @@ do end -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) local token = playerData.tokenType @@ -571,8 +451,8 @@ do end -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnLocationTokensFromDataHelper = function(card, locationData) local clueCount = internal.getClueCountFromData(card, locationData) @@ -611,7 +491,7 @@ do end -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from + ---@param card tts__Object Card to pull the uses from internal.getUses = function(card) local metadata = JSON.decode(card.getGMNotes()) or { } if metadata.type == "Location" then @@ -628,9 +508,9 @@ do end -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at internal.buildClueOffsets = function(card, count) local pos = card.getPosition() local cluePositions = { } @@ -642,9 +522,9 @@ do return cluePositions end - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) internal.replenishTokens = function(card, uses, mat) local cardPos = card.getPosition() @@ -703,14 +583,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -723,7 +606,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -766,29 +649,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -805,12 +690,12 @@ do local OptionPanelApi = {} -- loads saved options - ---@param options Table New options table + ---@param options table Set a new state for the option table OptionPanelApi.loadSettings = function(options) return Global.call("loadSettings", options) end - -- returns option panel table + ---@return any: Table of option panel state OptionPanelApi.getOptions = function() return Global.getTable("optionPanel") end @@ -832,60 +717,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -902,13 +782,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -928,7 +808,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -940,4 +820,125 @@ do return PlayAreaApi end end) +__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenSpawnTracker = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getSpawnTracker() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + end + + TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) + return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + end + + TokenSpawnTracker.markTokensSpawned = function(cardGuid) + return getSpawnTracker().call("markTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetTokensSpawned = function(cardGuid) + return getSpawnTracker().call("resetTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetAllAssetAndEvents = function() + return getSpawnTracker().call("resetAllAssetAndEvents") + end + + TokenSpawnTracker.resetAllLocations = function() + return getSpawnTracker().call("resetAllLocations") + end + + TokenSpawnTracker.resetAll = function() + return getSpawnTracker().call("resetAll") + end + + return TokenSpawnTracker +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/TokenSpawnTool") +end) +__bundle_register("util/TokenSpawnTool", function(require, _LOADED, __bundle_register, __bundle_modules) +local searchLib = require("util/SearchLib") +local tokenManager = require("core/token/TokenManager") +local TOKEN_INDEX = {} +TOKEN_INDEX[3] = "resourceCounter" +TOKEN_INDEX[4] = "damage" +TOKEN_INDEX[5] = "path" +TOKEN_INDEX[6] = "horror" +TOKEN_INDEX[7] = "doom" +TOKEN_INDEX[8] = "clue" +TOKEN_INDEX[9] = "resource" + +local stateTable = { + ["resource"] = 1, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, + ["evidence"] = 5, + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 +} + +---@param index number Index of the pressed key +---@param playerColor string Color of the triggering player +function onScriptingButtonDown(index, playerColor) + local tokenType = TOKEN_INDEX[index] + if not tokenType then return end + + local rotation = { x = 0, y = Player[playerColor].getPointerRotation(), z = 0 } + local position = Player[playerColor].getPointerPosition() + Vector(0, 0.2, 0) + local subType = "" + local callback = nil + + -- check for subtype of resource based on card below + if tokenType == "resource" then + for _, obj in ipairs(searchLib.belowPosition(position, "isCard")) do + if not obj.is_face_down then + local metadata = JSON.decode(obj.getGMNotes()) or {} + local uses = metadata.uses or {} + for _, useInfo in ipairs(uses) do + if useInfo.token == "resource" then + subType = useInfo.type + break + end + end + break + end + end + + -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") + local stateID = stateTable[string.lower(subType)] + if stateID ~= nil and stateID ~= 1 then + callback = function(spawned) spawned.setState(stateID) end + end + -- check hovered object for "resourceCounter" tokens and increase them instead + elseif tokenType == "resourceCounter" then + local hoverObj = Player[playerColor].getHoverObject() + if hoverObj then + if tokenType == hoverObj.getMemo() then + hoverObj.call("addOrSubtract") + return + end + end + -- check hovered object for "damage" and "horror" tokens and increase them instead + elseif tokenType == "damage" or tokenType == "horror" then + local hoverObj = Player[playerColor].getHoverObject() + if hoverObj then + if tokenType == hoverObj.getMemo() then + local stateInfo = hoverObj.getStates() + local stateId = hoverObj.getStateId() + if stateId <= #stateInfo then + hoverObj.setState(stateId + 1) + return + end + end + end + end + + tokenManager.spawnToken(position, tokenType, rotation, callback) +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model Baldur's Gate III 695abd.ttslua b/unpacked/Custom_Model The Matter of Britain 194cc5.ttslua similarity index 100% rename from unpacked/Custom_Model Baldur's Gate III 695abd.ttslua rename to unpacked/Custom_Model The Matter of Britain 194cc5.ttslua diff --git a/unpacked/Custom_Model Baldur's Gate III 695abd.yaml b/unpacked/Custom_Model The Matter of Britain 194cc5.yaml similarity index 61% rename from unpacked/Custom_Model Baldur's Gate III 695abd.yaml rename to unpacked/Custom_Model The Matter of Britain 194cc5.yaml index d40de7e30..1bd6f41a7 100644 --- a/unpacked/Custom_Model Baldur's Gate III 695abd.yaml +++ b/unpacked/Custom_Model The Matter of Britain 194cc5.yaml @@ -12,15 +12,15 @@ CustomMesh: CastShadows: true ColliderURL: '' Convex: true - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/2117314083163063648/B404BC484394C1B241A97479C3A1FDC8D33ADE2F/ + DiffuseURL: https://i.ibb.co/1GLSncs/title.jpg MaterialIndex: 3 - MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj NormalURL: '' TypeIndex: 0 -Description: by Mint Tea Fan +Description: by Frying Tonight DragSelectable: true -GMNotes: fancreations/investigators_baldurs_gate_3.json -GUID: 695abd +GMNotes: fancreations/campaign_the_matter_of_britain.json +GUID: 194cc5 Grid: true GridProjection: false Hands: false @@ -28,13 +28,16 @@ HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false -LuaScript: !include 'Custom_Model Baldur''s Gate III 695abd.ttslua' +LuaScript: !include 'Custom_Model The Matter of Britain 194cc5.ttslua' LuaScriptState: '' MeasureMovement: false Name: Custom_Model -Nickname: ' Baldur''s Gate III' +Nickname: ' The Matter of Britain' Snap: true Sticky: true +Tags: +- CampaignBox +- LargeBox Tooltip: true Transform: posX: -26 @@ -43,8 +46,8 @@ Transform: rotX: 0 rotY: 270 rotZ: 0 - scaleX: 2.21 - scaleY: 0.46 - scaleZ: 2.42 + scaleX: 1 + scaleY: 0.14 + scaleZ: 1 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Model Clue Counter 032300.ttslua b/unpacked/Custom_Model Clue Counter 032300.ttslua index 9d8fa92e8..4077b8941 100644 --- a/unpacked/Custom_Model Clue Counter 032300.ttslua +++ b/unpacked/Custom_Model Clue Counter 032300.ttslua @@ -45,9 +45,14 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local searchLib = require("util/SearchLib") + exposedValue = 0 +local playmat + function onLoad() self.createButton({ label = "", @@ -59,10 +64,16 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1.5, -1) + + -- get closest playmat + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + playmat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + + -- start loop + Wait.time(countItems, 1.5, -1) end --- Activated once per second, counts items in bowls +-- activated once per second, counts clues on the playmat function countItems() local totalValue = 0 for _, item in ipairs(getClues()) do @@ -79,7 +90,328 @@ function removeAllClues(trash) end function getClues() - return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") + return searchLib.onObject(playmat, "isClue") +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -95,14 +427,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -115,7 +450,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Custom_Model Clue Counter 1769ed.ttslua b/unpacked/Custom_Model Clue Counter 1769ed.ttslua index 9d8fa92e8..4077b8941 100644 --- a/unpacked/Custom_Model Clue Counter 1769ed.ttslua +++ b/unpacked/Custom_Model Clue Counter 1769ed.ttslua @@ -45,9 +45,14 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local searchLib = require("util/SearchLib") + exposedValue = 0 +local playmat + function onLoad() self.createButton({ label = "", @@ -59,10 +64,16 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1.5, -1) + + -- get closest playmat + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + playmat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + + -- start loop + Wait.time(countItems, 1.5, -1) end --- Activated once per second, counts items in bowls +-- activated once per second, counts clues on the playmat function countItems() local totalValue = 0 for _, item in ipairs(getClues()) do @@ -79,7 +90,328 @@ function removeAllClues(trash) end function getClues() - return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") + return searchLib.onObject(playmat, "isClue") +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -95,14 +427,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -115,7 +450,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Custom_Model Clue Counter 37be78.ttslua b/unpacked/Custom_Model Clue Counter 37be78.ttslua index 9d8fa92e8..4077b8941 100644 --- a/unpacked/Custom_Model Clue Counter 37be78.ttslua +++ b/unpacked/Custom_Model Clue Counter 37be78.ttslua @@ -45,9 +45,14 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local searchLib = require("util/SearchLib") + exposedValue = 0 +local playmat + function onLoad() self.createButton({ label = "", @@ -59,10 +64,16 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1.5, -1) + + -- get closest playmat + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + playmat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + + -- start loop + Wait.time(countItems, 1.5, -1) end --- Activated once per second, counts items in bowls +-- activated once per second, counts clues on the playmat function countItems() local totalValue = 0 for _, item in ipairs(getClues()) do @@ -79,7 +90,328 @@ function removeAllClues(trash) end function getClues() - return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") + return searchLib.onObject(playmat, "isClue") +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -95,14 +427,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -115,7 +450,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Custom_Model Clue Counter d86b7c.ttslua b/unpacked/Custom_Model Clue Counter d86b7c.ttslua index 9d8fa92e8..4077b8941 100644 --- a/unpacked/Custom_Model Clue Counter d86b7c.ttslua +++ b/unpacked/Custom_Model Clue Counter d86b7c.ttslua @@ -45,9 +45,14 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) +local guidReferenceApi = require("core/GUIDReferenceApi") +local playmatApi = require("playermat/PlaymatApi") local searchLib = require("util/SearchLib") + exposedValue = 0 +local playmat + function onLoad() self.createButton({ label = "", @@ -59,10 +64,16 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1.5, -1) + + -- get closest playmat + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + playmat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + + -- start loop + Wait.time(countItems, 1.5, -1) end --- Activated once per second, counts items in bowls +-- activated once per second, counts clues on the playmat function countItems() local totalValue = 0 for _, item in ipairs(getClues()) do @@ -79,7 +90,328 @@ function removeAllClues(trash) end function getClues() - return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") + return searchLib.onObject(playmat, "isClue") +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -95,14 +427,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -115,7 +450,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Custom_Model CoreNight of the Zealot 64a613.yaml b/unpacked/Custom_Model CoreNight of the Zealot 64a613.yaml index 807449363..7d49f812a 100644 --- a/unpacked/Custom_Model CoreNight of the Zealot 64a613.yaml +++ b/unpacked/Custom_Model CoreNight of the Zealot 64a613.yaml @@ -49,7 +49,7 @@ Tooltip: true Transform: posX: 65 posY: 1.48 - posZ: -55 + posZ: -52 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Edge of the Earth 895eaa.yaml b/unpacked/Custom_Model Edge of the Earth 895eaa.yaml index 79454a71f..08d21c742 100644 --- a/unpacked/Custom_Model Edge of the Earth 895eaa.yaml +++ b/unpacked/Custom_Model Edge of the Earth 895eaa.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 39 + posX: 20.6 posY: 1.49 - posZ: -87 + posZ: -65 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Return to The Circle Undone 757324.ttslua b/unpacked/Custom_Model Return to The Circle Undone 757324.ttslua index e6f67c6af..3c2a044ca 100644 --- a/unpacked/Custom_Model Return to The Circle Undone 757324.ttslua +++ b/unpacked/Custom_Model Return to The Circle Undone 757324.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -84,7 +87,4 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model Return to The Circle Undone 757324.yaml b/unpacked/Custom_Model Return to The Circle Undone 757324.yaml index 0ee346163..dd04dee85 100644 --- a/unpacked/Custom_Model Return to The Circle Undone 757324.yaml +++ b/unpacked/Custom_Model Return to The Circle Undone 757324.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 13 + posX: 35.4 posY: 1.87 - posZ: -71 + posZ: -65 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml b/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml index dc35fc816..ddcb6d604 100644 --- a/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml +++ b/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 52 + posX: 65 posY: 1.87 - posZ: -71 + posZ: -91 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml b/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml index 7731d9efd..eced40ace 100644 --- a/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml +++ b/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 26 + posX: 50.2 posY: 1.87 - posZ: -71 + posZ: -91 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Return to The Path to Carcosa e9889a.ttslua b/unpacked/Custom_Model Return to The Path to Carcosa e9889a.ttslua index e6f67c6af..3c2a044ca 100644 --- a/unpacked/Custom_Model Return to The Path to Carcosa e9889a.ttslua +++ b/unpacked/Custom_Model Return to The Path to Carcosa e9889a.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -84,7 +87,4 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model Return to The Path to Carcosa e9889a.yaml b/unpacked/Custom_Model Return to The Path to Carcosa e9889a.yaml index e36b192ee..651454c43 100644 --- a/unpacked/Custom_Model Return to The Path to Carcosa e9889a.yaml +++ b/unpacked/Custom_Model Return to The Path to Carcosa e9889a.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 39 + posX: 50.2 posY: 1.87 - posZ: -71 + posZ: -65 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model Return to the Night of the Zealot 56270d.yaml b/unpacked/Custom_Model Return to the Night of the Zealot 56270d.yaml index 264689ce5..f2934f0e4 100644 --- a/unpacked/Custom_Model Return to the Night of the Zealot 56270d.yaml +++ b/unpacked/Custom_Model Return to the Night of the Zealot 56270d.yaml @@ -49,7 +49,7 @@ Tooltip: true Transform: posX: 65 posY: 1.87 - posZ: -71 + posZ: -65 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Circle Undone 63e097.yaml b/unpacked/Custom_Model The Circle Undone 63e097.yaml index d5cf92782..298bbfd73 100644 --- a/unpacked/Custom_Model The Circle Undone 63e097.yaml +++ b/unpacked/Custom_Model The Circle Undone 63e097.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 13 + posX: 35.4 posY: 1.49 - posZ: -55 + posZ: -52 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Dream-Eaters a16a1a.yaml b/unpacked/Custom_Model The Dream-Eaters a16a1a.yaml index 0346b0b34..92256a3d2 100644 --- a/unpacked/Custom_Model The Dream-Eaters a16a1a.yaml +++ b/unpacked/Custom_Model The Dream-Eaters a16a1a.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 65 + posX: 35.4 posY: 1.49 - posZ: -87 + posZ: -78 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Dunwich Legacy 2898f6.ttslua b/unpacked/Custom_Model The Dunwich Legacy 2898f6.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model The Dunwich Legacy 2898f6.ttslua +++ b/unpacked/Custom_Model The Dunwich Legacy 2898f6.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model The Dunwich Legacy 2898f6.yaml b/unpacked/Custom_Model The Dunwich Legacy 2898f6.yaml index 2bb5dd10a..ca7a2e890 100644 --- a/unpacked/Custom_Model The Dunwich Legacy 2898f6.yaml +++ b/unpacked/Custom_Model The Dunwich Legacy 2898f6.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 52 + posX: 65 posY: 1.48 - posZ: -55 + posZ: -78 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.ttslua b/unpacked/Custom_Model The Feast of Hemlock Vale c740af.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.ttslua rename to unpacked/Custom_Model The Feast of Hemlock Vale c740af.ttslua diff --git a/unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml b/unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml new file mode 100644 index 000000000..b614cd80f --- /dev/null +++ b/unpacked/Custom_Model The Feast of Hemlock Vale c740af.yaml @@ -0,0 +1,60 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + a: 0.27451 + b: 1 + g: 1 + 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/2342503777949914349/98CA11F8C5250E8F4A1DA877CD496C6FFB87AF0E/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj + NormalURL: '' + TypeIndex: 0 +Description: '' +DragSelectable: true +GMNotes: campaigns/the_feast_of_hemlock_vale.json +GUID: c740af +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: !include 'Custom_Model The Feast of Hemlock Vale c740af.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: The Feast of Hemlock Vale +Snap: true +Sticky: true +Tags: +- CampaignBox +Tooltip: true +Transform: + posX: 20.6 + posY: 1.49 + posZ: -91 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 0.14 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Model The Forgotten Age 0bcf19.yaml b/unpacked/Custom_Model The Forgotten Age 0bcf19.yaml index 76116e559..e95a30fc3 100644 --- a/unpacked/Custom_Model The Forgotten Age 0bcf19.yaml +++ b/unpacked/Custom_Model The Forgotten Age 0bcf19.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 26 + posX: 50.2 posY: 1.49 - posZ: -55 + posZ: -78 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.ttslua b/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.ttslua +++ b/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.yaml b/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.yaml index 0afa51dfa..73d7849d4 100644 --- a/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.yaml +++ b/unpacked/Custom_Model The Innsmouth Conspiracy 465aab.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 52 + posX: 20.6 posY: 1.49 - posZ: -87 + posZ: -52 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Path to Carcosa aca04c.ttslua b/unpacked/Custom_Model The Path to Carcosa aca04c.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model The Path to Carcosa aca04c.ttslua +++ b/unpacked/Custom_Model The Path to Carcosa aca04c.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model The Path to Carcosa aca04c.yaml b/unpacked/Custom_Model The Path to Carcosa aca04c.yaml index a3ad7118a..ce4b4d71c 100644 --- a/unpacked/Custom_Model The Path to Carcosa aca04c.yaml +++ b/unpacked/Custom_Model The Path to Carcosa aca04c.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 39 + posX: 50.2 posY: 1.48 - posZ: -55 + posZ: -52 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model The Scarlet Keys 300fcc.yaml b/unpacked/Custom_Model The Scarlet Keys 300fcc.yaml index 260937857..b0962d5de 100644 --- a/unpacked/Custom_Model The Scarlet Keys 300fcc.yaml +++ b/unpacked/Custom_Model The Scarlet Keys 300fcc.yaml @@ -47,9 +47,9 @@ Tags: - CampaignBox Tooltip: true Transform: - posX: 26 + posX: 20.6 posY: 1.49 - posZ: -87 + posZ: -78 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua similarity index 97% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua index c99612b1a..dacffa1b1 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua @@ -26,26 +26,17 @@ end function updateMemoryWithMoves() memoryList = memoryListBackup --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) + local obj = getObjectFromGUID(moveGuid or "") -- p1 is where needs to go, p2 is where it was local refObjPos = memoryList[moveGuid].pos local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() for guid, entry in pairs(memoryList) do memoryList[guid].pos.x = entry.pos.x - deltaPos.x memoryList[guid].pos.y = entry.pos.y - deltaPos.y memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z end - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} moveList = {} end diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.yaml similarity index 97% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.yaml index 72096618b..4b4402c33 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801.yaml @@ -62,12 +62,12 @@ Tooltip: true Transform: posX: -9 posY: 1.48 - posZ: -76 + posZ: -91 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 0.8 - scaleY: 0.1 - scaleZ: 0.8 + scaleX: 1 + scaleY: 0.14 + scaleZ: 1 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.ttslua new file mode 100644 index 000000000..e6f67c6af --- /dev/null +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.ttslua @@ -0,0 +1,90 @@ +-- 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) +__bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) +function onLoad() + local notes = self.getGMNotes() + + -- default parameters (e.g. scenarios) + local buttonParameters = { + label = "Download", + click_function = "buttonClick_download", + function_owner = self, + position = { x = 0, y = 0.1, z = 2.1 }, + height = 250, + width = 800, + font_size = 150, + color = { 0, 0, 0 }, + font_color = { 1, 1, 1 } + } + + -- return to boxes + if string.match(notes, "................") == "campaigns/return" then + buttonParameters.position.z = 2 + + -- official campaign boxes + elseif string.match(notes, ".........") == "campaigns" or self.hasTag("LargeBox") then + buttonParameters.position.z = 6 + buttonParameters.height = 500 + buttonParameters.width = 1700 + buttonParameters.font_size = 350 + + -- investigator boxes + elseif string.match(notes, ".............") == "investigators" then + buttonParameters.position.z = 7 + buttonParameters.height = 850 + buttonParameters.width = 3400 + buttonParameters.font_size = 700 + end + + self.createButton(buttonParameters) +end + +function buttonClick_download() + Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) +return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing 72ab92.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest e2dd57.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua +++ b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml b/unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml rename to unpacked/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Model_Bag Underworld Market Helper 3650ea.ttslua b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Model_Bag Underworld Market Helper 3650ea.ttslua index 03d73b388..b4d0c9cf5 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Model_Bag Underworld Market Helper 3650ea.ttslua +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Model_Bag Underworld Market Helper 3650ea.ttslua @@ -336,14 +336,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -356,7 +359,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.yaml b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.yaml index b6e6173c2..6526f95ea 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.yaml +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.yaml @@ -14,7 +14,7 @@ CustomImage: Thickness: 0.1 Type: 3 ImageScalar: 1 - ImageSecondaryURL: https://i.imgur.com/EcbhVuh.jpg/ + ImageSecondaryURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ ImageURL: http://cloud-3.steamusercontent.com/ugc/965354846165100486/3DC8FCEF364B30758B09EF96AF9458F2B8E64D56/ WidthScale: 0 Description: Define difficulties in this object's script. diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Subject 5U-21 Helper 1335e8.ttslua b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Subject 5U-21 Helper 1335e8.ttslua index c232d1851..bb402a9de 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Subject 5U-21 Helper 1335e8.ttslua +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Subject 5U-21 Helper 1335e8.ttslua @@ -41,6 +41,77 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("accessories/Subject5U-21Helper") end) @@ -146,72 +217,4 @@ function getNotesFromCardsAndContainers() return notesList end end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Alice Luxley (2) 94f23b.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Alice Luxley (2) 94f23b.yaml index 5ac8e0188..4b75ce33d 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Alice Luxley (2) 94f23b.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Alice Luxley (2) 94f23b.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2664': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2038486156990333452/327F5C791C48AF81F5EBCF5ED72211543E4DFB33/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Dragon Pole (3) a20aef.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Dragon Pole (3) a20aef.yaml index 3cb67ba72..15fb19d4f 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Dragon Pole (3) a20aef.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Dragon Pole (3) a20aef.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '2665': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2038486156990333641/5C6B3E30DDCB25F7DA24B2B7C43688AA2AE4744E/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Fine Clothes (3) 5cb973.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Fine Clothes (3) 5cb973.yaml index 7e1e52e21..db1c465a8 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Fine Clothes (3) 5cb973.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Fine Clothes (3) 5cb973.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5423': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2022727271907675521/7CD01B7199EDE77C9E62CC6D2EAFF53D99AF5BC5/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Sword Cane (2) 9c32e2.yaml b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Sword Cane (2) 9c32e2.yaml index f6b349a90..dec0567fb 100644 --- a/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Sword Cane (2) 9c32e2.yaml +++ b/unpacked/Custom_Model_Bag Leaked Items 42cd6e/CardCustom Sword Cane (2) 9c32e2.yaml @@ -11,7 +11,7 @@ ColorDiffuse: CustomDeck: '5424': BackIsHidden: true - BackURL: https://i.imgur.com/EcbhVuh.jpg/ + BackURL: http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2022727271907674847/3938E37E1C41BA1E6F1DE628CE1D108E54C668EA/ NumHeight: 1 NumWidth: 1 diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua deleted file mode 100644 index 7ba1823d7..000000000 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua +++ /dev/null @@ -1,504 +0,0 @@ --- Utility memory bag by Directsun --- Version 2.5.2 --- Fork of Memory Bag 2.0 by MrStump - -function updateSave() - local data_to_save = {["ml"]=memoryList} - saved_data = JSON.encode(data_to_save) - self.script_state = saved_data -end - -function combineMemoryFromBagsWithin() - local bagObjList = self.getObjects() - for _, bagObj in ipairs(bagObjList) do - local data = bagObj.lua_script_state - if data ~= nil then - local j = JSON.decode(data) - if j ~= nil and j.ml ~= nil then - for guid, entry in pairs(j.ml) do - memoryList[guid] = entry - end - end - end - end -end - -function updateMemoryWithMoves() - memoryList = memoryListBackup - --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) - - -- p1 is where needs to go, p2 is where it was - local refObjPos = memoryList[moveGuid].pos - local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() - for guid, entry in pairs(memoryList) do - memoryList[guid].pos.x = entry.pos.x - deltaPos.x - memoryList[guid].pos.y = entry.pos.y - deltaPos.y - memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z - end - - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} - moveList = {} -end - -function onload(saved_data) - fresh = true - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - --Set up information off of loaded_data - memoryList = loaded_data.ml - else - --Set up information for if there is no saved saved data - memoryList = {} - end - - moveList = {} - moveGuid = nil - - if next(memoryList) == nil then - createSetupButton() - else - fresh = false - createMemoryActionButtons() - end -end - - ---Beginning Setup - - ---Make setup button -function createSetupButton() - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,0.1,-6}, rotation={0,0,0}, height=500, width=1200, - font_size=350, color={0,0,0}, font_color={1,1,1} - }) -end - ---Triggered by Transpose button -function buttonClick_transpose() - moveGuid = nil - broadcastToAll("Select one object and move it- all objects will move relative to the new location", {0.75, 0.75, 1}) - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - moveList = {} - self.clearButtons() - createButtonsOnAllObjects(true) - createSetupActionButtons(true) -end - ---Triggered by setup button, -function buttonClick_setup() - memoryListBackup = duplicateTable(memoryList) - memoryList = {} - self.clearButtons() - createButtonsOnAllObjects(false) - createSetupActionButtons(false) -end - -function getAllObjectsInMemory() - local objTable = {} - local curObj = {} - - for guid in pairs(memoryListBackup) do - curObj = getObjectFromGUID(guid) - table.insert(objTable, curObj) - end - - return objTable - -- return getAllObjects() -end - ---Creates selection buttons on objects -function createButtonsOnAllObjects(move) - local howManyButtons = 0 - - local objsToHaveButtons = {} - if move == true then - objsToHaveButtons = getAllObjectsInMemory() - else - objsToHaveButtons = getAllObjects() - end - - for _, obj in ipairs(objsToHaveButtons) do - if obj ~= self then - local dummyIndex = howManyButtons - --On a normal bag, the button positions aren't the same size as the bag. - globalScaleFactor = 1 * 1/self.getScale().x - --Super sweet math to set button positions - local selfPos = self.getPosition() - local objPos = obj.getPosition() - local deltaPos = findOffsetDistance(selfPos, objPos, obj) - local objPos = rotateLocalCoordinates(deltaPos, self) - objPos.x = -objPos.x * globalScaleFactor - objPos.y = objPos.y * globalScaleFactor + 4 - objPos.z = objPos.z * globalScaleFactor - --Offset rotation of bag - local rot = self.getRotation() - rot.y = -rot.y + 180 - --Create function - local funcName = "selectButton_" .. howManyButtons - local func = function() buttonClick_selection(dummyIndex, obj, move) end - local color = {0.75,0.25,0.25,0.6} - local colorMove = {0,0,1,0.6} - if move == true then - color = colorMove - end - self.setVar(funcName, func) - self.createButton({ - click_function=funcName, function_owner=self, - position=objPos, rotation=rot, height=1000, width=1000, - color=color, - }) - howManyButtons = howManyButtons + 1 - end - end -end - ---Creates submit and cancel buttons -function createSetupActionButtons(move) - self.createButton({ - label="Cancel", click_function="buttonClick_cancel", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - self.createButton({ - label="Submit", click_function="buttonClick_submit", function_owner=self, - position={-1.2,1,-2}, rotation={0,0,0}, height=240, width=570, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - - if move == false then - self.createButton({ - label="Add", click_function="buttonClick_add", function_owner=self, - position={-1.2,1,2}, rotation={0,0,0}, height=240, width=550, - font_size=150, color={0,0,0}, font_color={0.25,1,0.25} - }) - - if fresh == false then - self.createButton({ - label="Set New", click_function="buttonClick_setNew", function_owner=self, - position={0,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={0.75,0.75,1} - }) - self.createButton({ - label="Remove", click_function="buttonClick_remove", function_owner=self, - position={1.3,1,2}, rotation={0,0,0}, height=240, width=600, - font_size=150, color={0,0,0}, font_color={1,0.25,0.25} - }) - end - end - - self.createButton({ - label="Reset", click_function="buttonClick_reset", function_owner=self, - position={1.2,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) -end - - ---During Setup - - ---Checks or unchecks buttons -function buttonClick_selection(index, obj, move) - local colorMove = {0,0,1,0.6} - local color = {0,1,0,0.6} - - previousGuid = selectedGuid - selectedGuid = obj.getGUID() - - theList = memoryList - if move == true then - theList = moveList - if previousGuid ~= nil and previousGuid ~= selectedGuid then - local prevObj = getObjectFromGUID(previousGuid) - prevObj.highlightOff() - self.editButton({index=previousIndex, color=colorMove}) - theList[previousGuid] = nil - end - previousIndex = index - end - - if theList[selectedGuid] == nil then - self.editButton({index=index, color=color}) - --Adding pos/rot to memory table - local pos, rot = obj.getPosition(), obj.getRotation() - --I need to add it like this or it won't save due to indexing issue - theList[obj.getGUID()] = { - pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - lock=obj.getLock() - } - obj.highlightOn({0,1,0}) - else - color = {0.75,0.25,0.25,0.6} - if move == true then - color = colorMove - end - self.editButton({index=index, color=color}) - theList[obj.getGUID()] = nil - obj.highlightOff() - end -end - ---Cancels selection process -function buttonClick_cancel() - memoryList = memoryListBackup - moveList = {} - self.clearButtons() - if next(memoryList) == nil then - createSetupButton() - else - createMemoryActionButtons() - end - removeAllHighlights() - broadcastToAll("Selection Canceled", {1,1,1}) - moveGuid = nil -end - ---Saves selections -function buttonClick_submit() - fresh = false - if next(moveList) ~= nil then - for guid in pairs(moveList) do - moveGuid = guid - end - if memoryListBackup[moveGuid] == nil then - broadcastToAll("Item selected for moving is not already in memory", {1, 0.25, 0.25}) - else - broadcastToAll("Moving all items in memory relative to new objects position!", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(moveList) do - moveGuid = guid - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - updateMemoryWithMoves() - updateSave() - buttonClick_place() - end - elseif next(memoryList) == nil and moveGuid == nil then - memoryList = memoryListBackup - broadcastToAll("No selections made.", {0.75, 0.25, 0.25}) - end - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() - moveGuid = nil -end - -function combineTables(first_table, second_table) - for k,v in pairs(second_table) do first_table[k] = v end -end - -function buttonClick_add() - fresh = false - combineTables(memoryList, memoryListBackup) - broadcastToAll("Adding internal bags and selections to existing memory", {0.25, 0.75, 0.25}) - combineMemoryFromBagsWithin() - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - updateSave() -end - -function buttonClick_remove() - broadcastToAll("Removing Selected Entries From Memory", {1.0, 0.25, 0.25}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for guid in pairs(memoryList) do - count = count + 1 - memoryListBackup[guid] = nil - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.highlightOff() end - end - broadcastToAll(count.." Objects Removed", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - -function buttonClick_setNew() - broadcastToAll("Setting new position relative to items in memory", {0.75, 0.75, 1}) - self.clearButtons() - createMemoryActionButtons() - local count = 0 - for _, obj in ipairs(getAllObjects()) do - guid = obj.guid - if memoryListBackup[guid] ~= nil then - count = count + 1 - memoryListBackup[guid].pos = obj.getPosition() - memoryListBackup[guid].rot = obj.getRotation() - memoryListBackup[guid].lock = obj.getLock() - end - end - broadcastToAll(count.." Objects Saved", {1,1,1}) - memoryList = memoryListBackup - updateSave() -end - ---Resets bag to starting status -function buttonClick_reset() - fresh = true - memoryList = {} - self.clearButtons() - createSetupButton() - removeAllHighlights() - broadcastToAll("Tool Reset", {1,1,1}) - updateSave() -end - - ---After Setup - - ---Creates recall and place buttons -function createMemoryActionButtons() - self.createButton({ - label="Place", click_function="buttonClick_place", function_owner=self, - position={0.7,1,2}, rotation={0,0,0}, height=280, width=600, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Recall", click_function="buttonClick_recall", function_owner=self, - position={-0.7,1,2}, rotation={0,0,0}, height=280, width=650, - font_size=200, color={0,0,0}, font_color={1,1,1} - }) - self.createButton({ - label="Setup", click_function="buttonClick_setup", function_owner=self, - position={0,1,-2}, rotation={0,0,0}, height=240, width=500, - font_size=150, color={0,0,0}, font_color={1,1,1} - }) - ---- self.createButton({ ---- label="Move", click_function="buttonClick_transpose", function_owner=self, ---- position={-2.8,0.3,0}, rotation={0,0,0}, height=350, width=800, ---- font_size=250, color={0,0,0}, font_color={0.75,0.75,1} ---- }) -end - ---Sends objects from bag/table to their saved position/rotation -function buttonClick_place() - local bagObjList = self.getObjects() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - --If obj is out on the table, move it to the saved pos/rot - if obj ~= nil then - obj.setPositionSmooth(entry.pos) - obj.setRotationSmooth(entry.rot) - obj.setLock(entry.lock) - else - --If obj is inside of the bag - for _, bagObj in ipairs(bagObjList) do - if bagObj.guid == guid then - local item = self.takeObject({ - guid=guid, position=entry.pos, rotation=entry.rot, smooth=false - }) - item.setLock(entry.lock) - break - end - end - end - end - broadcastToAll("Objects Placed", {1,1,1}) -end - ---Recalls objects to bag from table -function buttonClick_recall() - for guid, entry in pairs(memoryList) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then self.putObject(obj) end - end - broadcastToAll("Objects Recalled", {1,1,1}) -end - - ---Utility functions - - ---Find delta (difference) between 2 x/y/z coordinates -function findOffsetDistance(p1, p2, obj) - local yOffset = 0 - if obj ~= nil then - local bounds = obj.getBounds() - yOffset = (bounds.size.y - bounds.offset.y) - end - local deltaPos = {} - deltaPos.x = (p2.x-p1.x) - deltaPos.y = (p2.y-p1.y) + yOffset - deltaPos.z = (p2.z-p1.z) - return deltaPos -end - ---Used to rotate a set of coordinates by an angle -function rotateLocalCoordinates(desiredPos, obj) - local objPos, objRot = obj.getPosition(), obj.getRotation() - local angle = math.rad(objRot.y) - local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle) - local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle) - --return {x=objPos.x+x, y=objPos.y+desiredPos.y, z=objPos.z+z} - return {x=x, y=desiredPos.y, z=z} -end - -function rotateMyCoordinates(desiredPos, obj) - local angle = math.rad(obj.getRotation().y) - local x = desiredPos.x * math.sin(angle) - local z = desiredPos.z * math.cos(angle) - return {x=x, y=desiredPos.y, z=z} -end - ---Coroutine delay, in seconds -function wait(time) - local start = os.time() - repeat coroutine.yield(0) until os.time() > start + time -end - ---Duplicates a table (needed to prevent it making reference to the same objects) -function duplicateTable(oldTable) - local newTable = {} - for k, v in pairs(oldTable) do - newTable[k] = v - end - return newTable -end - ---Moves scripted highlight from all objects -function removeAllHighlights() - for _, obj in ipairs(getAllObjects()) do - obj.highlightOff() - end -end - ---Round number (num) to the Nth decimal (dec) -function round(num, dec) - local mult = 10^(dec or 0) - return math.floor(num * mult + 0.5) / mult -end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml deleted file mode 100644 index 137c45d35..000000000 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml +++ /dev/null @@ -1,66 +0,0 @@ -AltLookAngle: - x: 0 - y: 0 - z: 0 -Autoraise: true -Bag: - Order: 0 -ColorDiffuse: - b: 1 - g: 0.99217 - r: 1 -ContainedObjects: -- !include 'Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag - Standalone Scenarios 77a5f9.yaml' -- !include 'Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag - Challenge Scenarios 9f6801.yaml' -CustomMesh: - CastShadows: true - ColliderURL: '' - Convex: true - CustomShader: - FresnelStrength: 0 - SpecularColor: - b: 1 - g: 1 - r: 1 - SpecularIntensity: 0 - SpecularSharpness: 2 - DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1758068588410895356/0B5F0CCD29DEC12514840D7B9CD2329B635A79A6/ - MaterialIndex: 3 - MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: 0ef5c8 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -LayoutGroupSortIndex: 0 -Locked: false -LuaScript: !include 'Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua' -LuaScriptState: '{"ml":{"77a5f9":{"lock":false,"pos":{"x":-9,"y":1.4815,"z":-66},"rot":{"x":0,"y":270,"z":0}},"9f6801":{"lock":false,"pos":{"x":-9,"y":1.4815,"z":-76},"rot":{"x":0,"y":270,"z":0}}}}' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Official Standalone/Challenge Scenarios -Snap: true -Sticky: true -Tooltip: true -Transform: - posX: 0 - posY: 1.87 - posZ: -71 - rotX: 0 - rotY: 270 - rotZ: 0 - scaleX: 1.76 - scaleY: 0.11 - scaleZ: 1.49 -Value: 0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua similarity index 97% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua index c99612b1a..dacffa1b1 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua +++ b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua @@ -26,26 +26,17 @@ end function updateMemoryWithMoves() memoryList = memoryListBackup --get the first transposed object's coordinates - local obj = getObjectFromGUID(moveGuid) + local obj = getObjectFromGUID(moveGuid or "") -- p1 is where needs to go, p2 is where it was local refObjPos = memoryList[moveGuid].pos local deltaPos = findOffsetDistance(obj.getPosition(), refObjPos, nil) - local movedRotation = obj.getRotation() for guid, entry in pairs(memoryList) do memoryList[guid].pos.x = entry.pos.x - deltaPos.x memoryList[guid].pos.y = entry.pos.y - deltaPos.y memoryList[guid].pos.z = entry.pos.z - deltaPos.z - -- memoryList[guid].rot.x = movedRotation.x - -- memoryList[guid].rot.y = movedRotation.y - -- memoryList[guid].rot.z = movedRotation.z end - --theList[obj.getGUID()] = { - -- pos={x=round(pos.x,4), y=round(pos.y,4), z=round(pos.z,4)}, - -- rot={x=round(rot.x,4), y=round(rot.y,4), z=round(rot.z,4)}, - -- lock=obj.getLock() - --} moveList = {} end diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml similarity index 97% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml index ef91c1f14..a87be35ab 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml +++ b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml @@ -69,14 +69,14 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -9 + posX: 5.8 posY: 1.48 - posZ: -66 + posZ: -91 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 0.8 - scaleY: 0.1 - scaleZ: 0.8 + scaleX: 1 + scaleY: 0.14 + scaleZ: 1 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Carnevale of Horrors 23dd51.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Curse of the Rougarou db7039.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua index 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua +++ b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DownloadBox") -end) __bundle_register("core/DownloadBox", function(require, _LOADED, __bundle_register, __bundle_modules) function onLoad() local notes = self.getGMNotes() @@ -87,4 +84,7 @@ function buttonClick_download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DownloadBox") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Fortune and Folly 0dce91.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Guardians of the Abyss ee987d.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Murder at the Excelsior Hotel 01d780.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Blob that Ate Everything 4dee5a.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Labyrinths of Lunacy 4c173f.yaml diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml similarity index 97% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml index 7d498b834..222919489 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml +++ b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model The Meddling of Meowlathotep d02940.yaml @@ -60,9 +60,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 12.25 - posY: 1.48 - posZ: -36.01 + posX: 59.77 + posY: 2.2 + posZ: -28.41 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.ttslua b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.ttslua similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.ttslua rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.ttslua diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.yaml b/unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.yaml similarity index 100% rename from unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.yaml rename to unpacked/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model War of the Outer Gods fc7674.yaml diff --git a/unpacked/Custom_Model_Bag Trash 147e80.ttslua b/unpacked/Custom_Model_Bag Trash 147e80.ttslua index de7afd1c2..3a4a5ed8c 100644 --- a/unpacked/Custom_Model_Bag Trash 147e80.ttslua +++ b/unpacked/Custom_Model_Bag Trash 147e80.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/Trashcan") +end) __bundle_register("util/Trashcan", function(require, _LOADED, __bundle_register, __bundle_modules) -- adds a context menu entry to trigger the emptying function onLoad() @@ -54,7 +57,4 @@ function emptyTrash() end end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/Trashcan") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua b/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua index de7afd1c2..3a4a5ed8c 100644 --- a/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua +++ b/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/Trashcan") +end) __bundle_register("util/Trashcan", function(require, _LOADED, __bundle_register, __bundle_modules) -- adds a context menu entry to trigger the emptying function onLoad() @@ -54,7 +57,4 @@ function emptyTrash() end end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/Trashcan") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Trash f7b6c8.ttslua b/unpacked/Custom_Model_Bag Trash f7b6c8.ttslua index 3a4a5ed8c..de7afd1c2 100644 --- a/unpacked/Custom_Model_Bag Trash f7b6c8.ttslua +++ b/unpacked/Custom_Model_Bag Trash f7b6c8.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/Trashcan") -end) __bundle_register("util/Trashcan", function(require, _LOADED, __bundle_register, __bundle_modules) -- adds a context menu entry to trigger the emptying function onLoad() @@ -57,4 +54,7 @@ function emptyTrash() end end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/Trashcan") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.ttslua b/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.ttslua index 25eb359de..dadfcdf8e 100644 --- a/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.ttslua +++ b/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.ttslua @@ -41,13 +41,1000 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playercards/AllCardsBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local AllCardsBagApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getAllCardsBag() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "AllCardsBag") + end + + -- Returns a specific card from the bag, based on ArkhamDB ID + ---@param id table String ID of the card to retrieve + ---@return table table + -- If the indexes are still being constructed, an empty table is + -- returned. Otherwise, a single table with the following fields + -- cardData: TTS object data, suitable for spawning the card + -- cardMetadata: Table of parsed metadata + AllCardsBagApi.getCardById = function(id) + return getAllCardsBag().call("getCardById", {id = id}) + end + + -- Gets a random basic weakness from the bag. Once a given ID has been returned + -- it will be removed from the list and cannot be selected again until a reload + -- occurs or the indexes are rebuilt, which will refresh the list to include all + -- weaknesses. + ---@return string: ID of the selected weakness. + AllCardsBagApi.getRandomWeaknessId = function() + return getAllCardsBag().call("getRandomWeaknessId") + end + + AllCardsBagApi.isIndexReady = function() + return getAllCardsBag().call("isIndexReady") + end + + -- Called by Hotfix bags when they load. If we are still loading indexes, then + -- the all cards and hotfix bags are being loaded together, and we can ignore + -- this call as the hotfix will be included in the initial indexing. If it is + -- called once indexing is complete it means the hotfix bag has been added + -- later, and we should rebuild the index to integrate the hotfix bag. + AllCardsBagApi.rebuildIndexForHotfix = function() + return getAllCardsBag().call("rebuildIndexForHotfix") + end + + -- Searches the bag for cards which match the given name and returns a list. Note that this is + -- an O(n) search without index support. It may be slow. + ---@param name string or string fragment to search for names + ---@param exact boolean Whether the name match should be exact + AllCardsBagApi.getCardsByName = function(name, exact) + return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) + end + + AllCardsBagApi.isBagPresent = function() + return getAllCardsBag() and true + end + + -- Returns a list of cards from the bag matching a class and level (0 or upgraded) + ---@param class string class to retrieve ("Guardian", "Seeker", etc) + ---@param upgraded boolean true for upgraded cards (Level 1-5), false for Level 0 + ---@return table: If the indexes are still being constructed, returns an empty table. + -- Otherwise, a list of tables, each with the following fields + -- cardData: TTS object data, suitable for spawning the card + -- cardMetadata: Table of parsed metadata + AllCardsBagApi.getCardsByClassAndLevel = function(class, upgraded) + return getAllCardsBag().call("getCardsByClassAndLevel", {class = class, upgraded = upgraded}) + end + + AllCardsBagApi.getCardsByCycle = function(cycle) + return getAllCardsBag().call("getCardsByCycle", cycle) + end + + AllCardsBagApi.getUniqueWeaknesses = function() + return getAllCardsBag().call("getUniqueWeaknesses") + end + + return AllCardsBagApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("playercards/PlayerCardSpawner", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Amount to shift for the next card (zShift) or next row of cards (xShift) +-- Note that the table rotation is weird, and the X axis is vertical while the +-- Z axis is horizontal +local SPREAD_Z_SHIFT = -2.3 +local SPREAD_X_SHIFT = -3.66 + +Spawner = { } + +-- Spawns a list of cards at the given position/rotation. This will separate cards by size - +-- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If +-- there are different types, the provided callback will be called once for each type as it spawns +-- either a card or deck. +---@param cardList table A list of Player Card data structures (data/metadata) +---@param pos tts__Vector table where the cards should be spawned (global) +---@param rot tts__Vector table for the orientation of the spawned cards (global) +---@param sort boolean True if this list of cards should be sorted before spawning +---@param callback? function Callback to be called after the card/deck spawns. +Spawner.spawnCards = function(cardList, pos, rot, sort, callback) + if (sort) then + table.sort(cardList, Spawner.cardComparator) + end + + local miniCards = { } + local standardCards = { } + local investigatorCards = { } + + for _, card in ipairs(cardList) do + if (card.metadata.type == "Investigator") then + table.insert(investigatorCards, card) + elseif (card.metadata.type == "Minicard") then + table.insert(miniCards, card) + else + table.insert(standardCards, card) + end + end + -- Spawn each of the three types individually. Each Y position shift accounts for the thickness + -- of the spawned deck + local position = { x = pos.x, y = pos.y, z = pos.z } + Spawner.spawn(investigatorCards, position, rot, callback) + + position.y = position.y + (#investigatorCards + #standardCards) * 0.07 + Spawner.spawn(standardCards, position, rot, callback) + + position.y = position.y + (#standardCards + #miniCards) * 0.07 + Spawner.spawn(miniCards, position, rot, callback) +end + +Spawner.spawnCardSpread = function(cardList, startPos, maxCols, rot, sort, callback) + if (sort) then + table.sort(cardList, Spawner.cardComparator) + end + + local position = { x = startPos.x, y = startPos.y, z = startPos.z } + -- Special handle the first row if we have less than a full single row, but only if there's a + -- reasonable max column count. Single-row spreads will send a large value for maxCols + if maxCols < 100 and #cardList < maxCols then + position.z = startPos.z + ((maxCols - #cardList) / 2 * SPREAD_Z_SHIFT) + end + local cardsInRow = 0 + local rows = 0 + for _, card in ipairs(cardList) do + Spawner.spawn({ card }, position, rot, callback) + position.z = position.z + SPREAD_Z_SHIFT + cardsInRow = cardsInRow + 1 + if cardsInRow >= maxCols then + rows = rows + 1 + local cardsForRow = #cardList - rows * maxCols + if cardsForRow > maxCols then + cardsForRow = maxCols + end + position.z = startPos.z + ((maxCols - cardsForRow) / 2 * SPREAD_Z_SHIFT) + position.x = position.x + SPREAD_X_SHIFT + cardsInRow = 0 + end + end +end + +-- Spawn a specific list of cards. This method is for internal use and should not be called +-- directly, use spawnCards instead. +---@param cardList table A list of Player Card data structures (data/metadata) +---@param pos table Position where the cards should be spawned (global) +---@param rot table Rotation for the orientation of the spawned cards (global) +---@param callback? function callback to be called after the card/deck spawns. +Spawner.spawn = function(cardList, pos, rot, callback) + if #cardList == 0 then return end + + -- Spawn a single card directly + if #cardList == 1 then + -- handle sideways card + if cardList[1].data.SidewaysCard then + rot = { rot.x, rot.y - 90, rot.z } + end + spawnObjectData({ + data = cardList[1].data, + position = pos, + rotation = rot, + callback_function = callback + }) + return + end + + -- For multiple cards, construct a deck and spawn that + local deck = Spawner.buildDeckDataTemplate() + + -- Decks won't inherently scale to the cards in them. The card list being spawned should be all + -- the same type/size by this point, so use the first card to set the size + deck.Transform = { + scaleX = cardList[1].data.Transform.scaleX, + scaleY = 1, + scaleZ = cardList[1].data.Transform.scaleZ + } + + local sidewaysDeck = true + for _, spawnCard in ipairs(cardList) do + Spawner.addCardToDeck(deck, spawnCard.data) + -- set sidewaysDeck to false if any card is not a sideways card + sidewaysDeck = (sidewaysDeck and spawnCard.data.SidewaysCard) + end + + -- set the alt view angle for sideways decks + if sidewaysDeck then + deck.AltLookAngle = { x = 0, y = 180, z = 90 } + rot = { rot.x, rot.y - 90, rot.z } + end + + spawnObjectData({ + data = deck, + position = pos, + rotation = rot, + callback_function = callback + }) +end + +-- Inserts a card into the given deck. This does three things: +-- 1. Add the card's data to ContainedObjects +-- 2. Add the card's ID (the TTS CardID, not the Arkham ID) to the deck's +-- ID list. Note that the deck's ID list is "DeckIDs" even though it +-- contains a list of card Ids +-- 3. Extract the card's CustomDeck table and add it to the deck. The deck's +-- "CustomDeck" field is a list of all CustomDecks used by cards within the +-- deck, keyed by the DeckID and referencing the custom deck table +---@param deck table TTS deck data structure to add to +---@param cardData table Data for the card to be inserted +Spawner.addCardToDeck = function(deck, cardData) + for customDeckId, customDeckData in pairs(cardData.CustomDeck) do + if (deck.CustomDeck[customDeckId] == nil) then + -- CustomDeck not added to deck yet, add it + deck.CustomDeck[customDeckId] = customDeckData + elseif (deck.CustomDeck[customDeckId].FaceURL == customDeckData.FaceURL) then + -- CustomDeck for this card matches the current one for the deck, do nothing + else + -- CustomDeck data conflict + local newDeckId = nil + for deckId, customDeck in pairs(deck.CustomDeck) do + if (customDeckData.FaceURL == customDeck.FaceURL) then + newDeckId = deckId + end + end + if (newDeckId == nil) then + -- No non-conflicting custom deck for this card, add a new one + newDeckId = Spawner.findNextAvailableId(deck.CustomDeck, "1000") + deck.CustomDeck[newDeckId] = customDeckData + end + -- Update the card with the new CustomDeck info + cardData.CardID = newDeckId..string.sub(cardData.CardID, 5) + cardData.CustomDeck[customDeckId] = nil + cardData.CustomDeck[newDeckId] = customDeckData + break + end + end + table.insert(deck.ContainedObjects, cardData) + table.insert(deck.DeckIDs, cardData.CardID) +end + +-- Create an empty deck data table which can have cards added to it. This +-- creates a new table on each call without using metatables or previous +-- definitions because we can't be sure that TTS doesn't modify the structure +---@return table deck Table containing the minimal TTS deck data structure +Spawner.buildDeckDataTemplate = function() + local deck = {} + deck.Name = "Deck" + + -- Card data. DeckIDs and CustomDeck entries will be built from the cards + deck.ContainedObjects = {} + deck.DeckIDs = {} + deck.CustomDeck = {} + + -- Transform is required, Position and Rotation will be overridden by the spawn call so can be omitted here + deck.Transform = { + scaleX = 1, + scaleY = 1, + scaleZ = 1, + } + + return deck +end + +-- Returns the first ID which does not exist in the given table, starting at startId and increasing +---@param objectTable table keyed by strings which are numbers +---@param startId string possible ID. +---@return string id >= startId +Spawner.findNextAvailableId = function(objectTable, startId) + local id = startId + while (objectTable[id] ~= nil) do + id = tostring(tonumber(id) + 1) + end + return id +end + +-- Get the PBCN (Permanent/Bonded/Customizable/Normal) value from the given metadata. +---@return number PBCN 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are +-- irrelevant as they provide only grouping and the order between them doesn't matter. +Spawner.getpbcn = function(metadata) + if metadata.permanent then + return 1 + elseif metadata.bonded_to ~= nil then + return 2 + else -- Normal card + return 3 + end +end + +-- Comparison function used to sort the cards in a deck. Groups bonded or +-- permanent cards first, then sorts within theose types by name/subname. +-- Normal cards will sort in standard alphabetical order, while +-- permanent/bonded/customizable will be in reverse alphabetical order. +-- +-- Since cards spawn in the order provided by this comparator, with the first +-- cards ending up at the bottom of a pile, this ordering will spawn in reverse +-- alphabetical order. This presents the cards in order for non-face-down +-- areas, and presents them in order when Searching the face-down deck. +Spawner.cardComparator = function(card1, card2) + local pbcn1 = Spawner.getpbcn(card1.metadata) + local pbcn2 = Spawner.getpbcn(card2.metadata) + if pbcn1 ~= pbcn2 then + return pbcn1 > pbcn2 + end + if pbcn1 == 3 then + if card1.data.Nickname ~= card2.data.Nickname then + return card1.data.Nickname < card2.data.Nickname + end + return card1.data.Description < card2.data.Description + else + if card1.data.Nickname ~= card2.data.Nickname then + return card1.data.Nickname > card2.data.Nickname + end + return card1.data.Description > card2.data.Description + end +end +end) +__bundle_register("playermat/Zones", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Sets up and returns coordinates for all possible spawn zones. Because Lua assigns tables by reference +-- and there is no built-in function to copy a table this is relatively brute force. +-- +-- Positions are all relative to the player mat, and most are consistent. The +-- exception are the SetAside# zones, which are placed to the left of the mat +-- for White/Green, and the right of the mat for Orange/Red. +-- +-- Investigator: Investigator card area. +-- Minicard: Placement for the investigator's minicard, just above the player mat +-- Deck, Discard: Standard locations for the deck and discard piles. +-- Blank1: used for assets that start in play (e.g. Duke) +-- Tarot, Hand1, Hand2, Ally, Blank4, Accessory, Arcane1, Arcane2, Body: Asset slot positions +-- Threat[1-4]: Threat area slots. Threat[1-3] correspond to the named threat area slots, and Threat4 is the blank threat area slot. +-- SetAside[1-3]: Column closest to the player mat, with 1 at the top and 3 at the bottom. +-- SetAside[4-6]: Column farther away from the mat, with 4 at the top and 6 at the bottom. +-- SetAside1: Permanent cards +-- SetAside2: Bonded cards +-- SetAside3: Ancestral Knowledge / Underworld Market +-- SetAside4: Upgrade sheets for customizable cards +-- SetAside5: Hunch Deck for Joe Diamond +-- SetAside6: currently unused +do + local playmatApi = require("playermat/PlaymatApi") + local Zones = { } + + local commonZones = {} + commonZones["Investigator"] = { -1.177, 0, 0.002 } + commonZones["Deck"] = { -1.82, 0, 0 } + commonZones["Discard"] = { -1.82, 0, 0.61 } + commonZones["Ally"] = { -0.615, 0, 0.024 } + commonZones["Body"] = { -0.630, 0, 0.553 } + commonZones["Hand1"] = { 0.215, 0, 0.042 } + commonZones["Hand2"] = { -0.180, 0, 0.037 } + commonZones["Arcane1"] = { 0.212, 0, 0.559 } + commonZones["Arcane2"] = { -0.171, 0, 0.557 } + commonZones["Tarot"] = { 0.602, 0, 0.033 } + commonZones["Accessory"] = { 0.602, 0, 0.555 } + commonZones["Blank1"] = { 1.758, 0, 0.040 } + commonZones["Blank2"] = { 1.754, 0, 0.563 } + commonZones["Blank3"] = { 1.371, 0, 0.038 } + commonZones["Blank4"] = { 1.371, 0, 0.558 } + commonZones["Blank5"] = { 0.98, 0, 0.035 } + commonZones["Blank6"] = { 0.977, 0, 0.556 } + commonZones["Threat1"] = { -0.911, 0, -0.625 } + commonZones["Threat2"] = { -0.454, 0, -0.625 } + commonZones["Threat3"] = { 0.002, 0, -0.625 } + commonZones["Threat4"] = { 0.459, 0, -0.625 } + + local zoneData = {} + zoneData["White"] = {} + zoneData["White"]["Investigator"] = commonZones["Investigator"] + zoneData["White"]["Deck"] = commonZones["Deck"] + zoneData["White"]["Discard"] = commonZones["Discard"] + zoneData["White"]["Ally"] = commonZones["Ally"] + zoneData["White"]["Body"] = commonZones["Body"] + zoneData["White"]["Hand1"] = commonZones["Hand1"] + zoneData["White"]["Hand2"] = commonZones["Hand2"] + zoneData["White"]["Arcane1"] = commonZones["Arcane1"] + zoneData["White"]["Arcane2"] = commonZones["Arcane2"] + zoneData["White"]["Tarot"] = commonZones["Tarot"] + zoneData["White"]["Accessory"] = commonZones["Accessory"] + zoneData["White"]["Blank1"] = commonZones["Blank1"] + zoneData["White"]["Blank2"] = commonZones["Blank2"] + zoneData["White"]["Blank3"] = commonZones["Blank3"] + zoneData["White"]["Blank4"] = commonZones["Blank4"] + zoneData["White"]["Blank5"] = commonZones["Blank5"] + zoneData["White"]["Blank6"] = commonZones["Blank6"] + zoneData["White"]["Threat1"] = commonZones["Threat1"] + zoneData["White"]["Threat2"] = commonZones["Threat2"] + zoneData["White"]["Threat3"] = commonZones["Threat3"] + zoneData["White"]["Threat4"] = commonZones["Threat4"] + zoneData["White"]["Minicard"] = { -1, 0, -1.45 } + zoneData["White"]["SetAside1"] = { 2.35, 0, -0.520 } + zoneData["White"]["SetAside2"] = { 2.35, 0, 0.042 } + zoneData["White"]["SetAside3"] = { 2.35, 0, 0.605 } + zoneData["White"]["UnderSetAside3"] = { 2.50, 0, 0.805 } + zoneData["White"]["SetAside4"] = { 2.78, 0, -0.520 } + zoneData["White"]["SetAside5"] = { 2.78, 0, 0.042 } + zoneData["White"]["SetAside6"] = { 2.78, 0, 0.605 } + zoneData["White"]["UnderSetAside6"] = { 2.93, 0, 0.805 } + + zoneData["Orange"] = {} + zoneData["Orange"]["Investigator"] = commonZones["Investigator"] + zoneData["Orange"]["Deck"] = commonZones["Deck"] + zoneData["Orange"]["Discard"] = commonZones["Discard"] + zoneData["Orange"]["Ally"] = commonZones["Ally"] + zoneData["Orange"]["Body"] = commonZones["Body"] + zoneData["Orange"]["Hand1"] = commonZones["Hand1"] + zoneData["Orange"]["Hand2"] = commonZones["Hand2"] + zoneData["Orange"]["Arcane1"] = commonZones["Arcane1"] + zoneData["Orange"]["Arcane2"] = commonZones["Arcane2"] + zoneData["Orange"]["Tarot"] = commonZones["Tarot"] + zoneData["Orange"]["Accessory"] = commonZones["Accessory"] + zoneData["Orange"]["Blank1"] = commonZones["Blank1"] + zoneData["Orange"]["Blank2"] = commonZones["Blank2"] + zoneData["Orange"]["Blank3"] = commonZones["Blank3"] + zoneData["Orange"]["Blank4"] = commonZones["Blank4"] + zoneData["Orange"]["Blank5"] = commonZones["Blank5"] + zoneData["Orange"]["Blank6"] = commonZones["Blank6"] + zoneData["Orange"]["Threat1"] = commonZones["Threat1"] + zoneData["Orange"]["Threat2"] = commonZones["Threat2"] + zoneData["Orange"]["Threat3"] = commonZones["Threat3"] + zoneData["Orange"]["Threat4"] = commonZones["Threat4"] + zoneData["Orange"]["Minicard"] = { 1, 0, -1.45 } + zoneData["Orange"]["SetAside1"] = { -2.35, 0, -0.520 } + zoneData["Orange"]["SetAside2"] = { -2.35, 0, 0.042} + zoneData["Orange"]["SetAside3"] = { -2.35, 0, 0.605 } + zoneData["Orange"]["UnderSetAside3"] = { -2.50, 0, 0.805 } + zoneData["Orange"]["SetAside4"] = { -2.78, 0, -0.520 } + zoneData["Orange"]["SetAside5"] = { -2.78, 0, 0.042 } + zoneData["Orange"]["SetAside6"] = { -2.78, 0, 0.605 } + zoneData["Orange"]["UnderSetAside6"] = { -2.93, 0, 0.805 } + + -- Green positions are the same as White and Red the same as Orange + zoneData["Red"] = zoneData["Orange"] + zoneData["Green"] = zoneData["White"] + + -- Gets the global position for the given zone on the specified player mat. + ---@param playerColor string Color name of the player mat to get the zone position for (e.g. "Red") + ---@param zoneName string Name of the zone to get the position for. See Zones object documentation for a list of valid zones. + ---@return tts__Vector|nil: Global position table, or nil if an invalid player color or zone is specified + Zones.getZonePosition = function(playerColor, zoneName) + if (playerColor ~= "Red" + and playerColor ~= "Orange" + and playerColor ~= "White" + and playerColor ~= "Green") then + return nil + end + return playmatApi.transformLocalPosition(zoneData[playerColor][zoneName], playerColor) + end + + -- Return the global rotation for a card on the given player mat, based on its zone. + ---@param playerColor string Color name of the player mat to get the rotation for (e.g. "Red") + ---@param zoneName string Name of the zone. See Zones object documentation for a list of valid zones. + ---@return tts__Vector: Global rotation vector for the given card. This will include the + -- Y rotation to orient the card on the given player mat as well as a + -- Z rotation to place the card face up or face down. + Zones.getDefaultCardRotation = function(playerColor, zoneName) + local cardRotation = playmatApi.returnRotation(playerColor) + if zoneName == "Deck" then + cardRotation = cardRotation + Vector(0, 0, 180) + end + return cardRotation + end + + return Zones +end +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + end + + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("arkhamdb/DeckImporterMain") +end) __bundle_register("arkhamdb/DeckImporterMain", function(require, _LOADED, __bundle_register, __bundle_modules) require("arkhamdb/DeckImporterUi") require("playercards/PlayerCardSpawner") local allCardsBagApi = require("playercards/AllCardsBagApi") local arkhamDb = require("arkhamdb/ArkhamDb") -local playAreaApi = require("core/PlayAreaApi") local playmatApi = require("playermat/PlaymatApi") local zones = require("playermat/Zones") @@ -66,8 +1053,8 @@ end function onSave() return JSON.encode(getUiState()) end -- Returns the zone name where the specified card should be placed, based on its metadata. ----@param cardMetadata Table of card metadata. ----@return Zone String Name of the zone such as "Deck", "SetAside1", etc. +---@param cardMetadata table Contains card metadata +---@return string Zone Name of the zone such as "Deck", "SetAside1", etc. -- See Zones object documentation for a list of valid zones. function getDefaultCardZone(cardMetadata, bondedList) if (cardMetadata.id == "09080-m") then -- Have to check the Servitor before other minicards @@ -107,7 +1094,7 @@ function buildDeck(playerColor, deckId) arkhamDb.getDecklist( playerColor, deckId, - uiState.private, + uiState.privateDeck, uiState.loadNewest, uiState.investigators, loadCards) @@ -118,17 +1105,17 @@ end -- This is a callback function which handles the results of ArkhamDb.getDecklist() -- This method uses an encapsulated coroutine with yields to make the card spawning cleaner. -- ----@param slots Table Key-Value table of cardId:count. cardId is the ArkhamDB ID of the card to spawn, +---@param slots table Key-Value table of cardId:count. cardId is the ArkhamDB ID of the card to spawn, -- and count is the number which should be spawned ----@param investigatorId String ArkhamDB ID (code) for this deck's investigator. +---@param investigatorId string ArkhamDB ID (code) for this deck's investigator. -- Investigator cards should already be added to the slots list if they -- should be spawned, but this value is separate to check for special -- handling for certain investigators ----@param bondedList Table A table of cardID keys to meaningless values. Card IDs in this list were added +---@param bondedList table A table of cardID keys to meaningless values. Card IDs in this list were added -- from a parent bonded card. ----@param customizations String ArkhamDB data for customizations on customizable cards ----@param playerColor String Color name of the player mat to place this deck on (e.g. "Red") ----@param loadAltInvestigator String Contains the name of alternative art for the investigator ("normal", "revised" or "promo") +---@param customizations string ArkhamDB data for customizations on customizable cards +---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red") +---@param loadAltInvestigator string Contains the name of alternative art for the investigator ("normal", "revised" or "promo") function loadCards(slots, investigatorId, bondedList, customizations, playerColor, loadAltInvestigator) function coinside() local cardsToSpawn = {} @@ -158,8 +1145,8 @@ function loadCards(slots, investigatorId, bondedList, customizations, playerColo local zoneDecks = buildZoneLists(cardsToSpawn) -- Spawn the list for each zone for zone, zoneCards in pairs(zoneDecks) do - local deckPos = zones.getZonePosition(playerColor, zone) - deckPos.y = 3 + local deckPos = zones.getZonePosition(playerColor, zone):setAt("y", 3) + local deckRot = zones.getDefaultCardRotation(playerColor, zone) local callback = nil -- If cards are spread too close together TTS groups them weirdly, selecting multiples @@ -181,13 +1168,7 @@ function loadCards(slots, investigatorId, bondedList, customizations, playerColo elseif zone == "Investigator" or zone == "Minicard" then callback = function(card) loadAltArt(card, loadAltInvestigator) end end - Spawner.spawnCards( - zoneCards, - deckPos, - zones.getDefaultCardRotation(playerColor, zone), - true, -- Sort deck - callback) - + Spawner.spawnCards(zoneCards, deckPos, deckRot, true, callback) coroutine.yield(0) end @@ -210,8 +1191,8 @@ end -- Callback handler for the main deck spawning. Looks for cards which should start in hand, and -- draws them for the appropriate player. ----@param deck Object Callback-provided spawned deck object ----@param playerColor String Color of the player to draw the cards to +---@param deck tts__Object Callback-provided spawned deck object +---@param playerColor string Color of the player to draw the cards to function deckSpawned(deck, playerColor) local player = Player[playmatApi.getPlayerColor(playerColor)] local handPos = player.getHandTransform(1).position -- Only one hand zone per player @@ -233,7 +1214,7 @@ end -- Converts the Raven Quill's selections from card IDs to card names. This could be more elegant -- but the inputs are very static so we're using some brute force. ----@param selectionString String provided by ArkhamDB, indicates the customization selections +---@param selectionString string provided by ArkhamDB, indicates the customization selections -- Should be either a single card ID or two separated by a ^ (e.g. XXXXX^YYYYY) function convertRavenQuillSelections(selectionString) if (string.len(selectionString) == 5) then @@ -244,7 +1225,7 @@ function convertRavenQuillSelections(selectionString) end -- Converts Grizzled's selections from a single string with "^". ----@param selectionString String provided by ArkhamDB, indicates the customization selections +---@param selectionString string provided by ArkhamDB, indicates the customization selections -- Should be two Traits separated by a ^ (e.g. XXXXX^YYYYY) function convertGrizzledSelections(selectionString) return selectionString:gsub("%^", ", ") @@ -265,8 +1246,8 @@ function getCardName(cardId) end -- Split a single list of cards into a separate table of lists, keyed by the zone ----@param cards Table Table of {cardData, cardMetadata, zone} ----@return: Table of {zoneName=card list} +---@param cards table Table of {cardData, cardMetadata, zone} +---@return table ZoneNames Table with zoneName as index: {zoneName=card list} function buildZoneLists(cards) local zoneList = {} for _, card in ipairs(cards) do @@ -280,7 +1261,7 @@ function buildZoneLists(cards) end -- Check to see if the deck list has Ancestral Knowledge. If it does, move 5 random skills to SetAside3 ----@param cardList Table Deck list being created +---@param cardList table Deck list being created function handleAncestralKnowledge(cardList) local hasAncestralKnowledge = false local skillList = {} @@ -306,8 +1287,8 @@ function handleAncestralKnowledge(cardList) end -- Check for and handle Underworld Market by moving all Illicit cards to UnderSetAside3 ----@param cardList Table Deck list being created ----@param playerColor String Color this deck is being loaded for +---@param cardList table Deck list being created +---@param playerColor string Color this deck is being loaded for function handleUnderworldMarket(cardList, playerColor) local hasMarket = false local illicitList = {} @@ -324,9 +1305,7 @@ function handleUnderworldMarket(cardList, playerColor) if hasMarket then if #illicitList < 10 then - printToAll("Only " .. #illicitList .. - " Illicit cards in your deck, you can't trigger Underworld Market's ability.", - playerColor) + printToAll("Only " .. #illicitList .. " Illicit cards in your deck, you can't trigger Underworld Market's ability.", playerColor) else -- Process cards to move them to the market deck. This is done in reverse -- order because the sorting needs to be reversed (deck sorts for face down) @@ -341,9 +1320,7 @@ function handleUnderworldMarket(cardList, playerColor) end if #illicitList > 10 then - printToAll("Moved all " .. #illicitList .. - " Illicit cards to the Market deck, reduce it to 10", - playerColor) + printToAll("Moved all " .. #illicitList .. " Illicit cards to the Market deck, reduce it to 10", playerColor) else printToAll("Built the Market deck", playerColor) end @@ -351,12 +1328,11 @@ function handleUnderworldMarket(cardList, playerColor) end end --- If the investigator is Joe Diamond, extract all Insight events to SetAside5 to build the Hunch --- Deck. ----@param investigatorId String ID for the deck's investigator card. Passed separately because the +-- If the investigator is Joe Diamond, extract all Insight events to SetAside5 to build the Hunch Deck +---@param investigatorId string ID for the deck's investigator card. Passed separately because the --- investigator may not be included in the cardList ----@param cardList Table Deck list being created ----@param playerColor String Color this deck is being loaded for +---@param cardList table Deck list being created +---@param playerColor string Color this deck is being loaded for function handleHunchDeck(investigatorId, cardList, playerColor) if investigatorId == "05002" then -- Joe Diamond local insightList = {} @@ -391,12 +1367,11 @@ function handleHunchDeck(investigatorId, cardList, playerColor) end end --- If the investigator is Parallel Jim Culver, extract all Ally assets to SetAside5 to build the Spirit --- Deck. ----@param investigatorId String ID for the deck's investigator card. Passed separately because the +-- If the investigator is Parallel Jim Culver, extract all Ally assets to SetAside5 to build the Spirit Deck +---@param investigatorId string ID for the deck's investigator card. Passed separately because the --- investigator may not be included in the cardList ----@param cardList Table Deck list being created ----@param playerColor String Color this deck is being loaded for +---@param cardList table Deck list being created +---@param playerColor string Color this deck is being loaded for function handleSpiritDeck(investigatorId, cardList, playerColor) if investigatorId == "02004-p" or investigatorId == "02004-pb" then -- Parallel Jim Culver local spiritList = {} @@ -435,8 +1410,8 @@ end -- For any customization upgrade cards in the card list, process the metadata from the deck to -- set the save state to show the correct checkboxes/text field values ----@param cardList Table Deck list being created ----@param customizations String ArkhamDB data for customizations on customizable cards +---@param cardList table Deck list being created +---@param customizations string ArkhamDB data for customizations on customizable cards function handleCustomizableUpgrades(cardList, customizations) for _, card in ipairs(cardList) do if card.metadata.type == "UpgradeSheet" then @@ -505,9 +1480,9 @@ function handleCustomizableUpgrades(cardList, customizations) end -- Handles cards that start in play under specific conditions for Ashcan Pete (Regular Pete - Duke, Parallel Pete - Guitar) ----@param investigatorId String ID for the deck's investigator card. Passed separately because the +---@param investigatorId string ID for the deck's investigator card. Passed separately because the --- investigator may not be included in the cardList ----@param cardList Table Deck list being created +---@param cardList table Deck list being created function handlePeteSignatureAssets(investigatorId, cardList) if investigatorId == "02005" or investigatorId == "02005-pb" then -- regular Pete's front for i, card in ipairs(cardList) do @@ -525,8 +1500,8 @@ function handlePeteSignatureAssets(investigatorId, cardList) end -- Callback function for investigator cards and minicards to set the correct state for alt art ----@param card Object Card which needs to be set the state for ----@param loadAltInvestigator String Contains the name of alternative art for the investigator ("normal", "revised" or "promo") +---@param card tts__Object Card which needs to be set the state for +---@param loadAltInvestigator string Contains the name of alternative art for the investigator ("normal", "revised" or "promo") function loadAltArt(card, loadAltInvestigator) -- states are set up this way: -- 1 - normal, 2 - revised/promo, 3 - promo (if 2 is revised) @@ -541,411 +1516,21 @@ function loadAltArt(card, loadAltInvestigator) end end end) -__bundle_register("playercards/AllCardsBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local AllCardsBagApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getAllCardsBag() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "AllCardsBag") - end - - -- Returns a specific card from the bag, based on ArkhamDB ID - ---@param id table String ID of the card to retrieve - ---@return table table - -- If the indexes are still being constructed, an empty table is - -- returned. Otherwise, a single table with the following fields - -- cardData: TTS object data, suitable for spawning the card - -- cardMetadata: Table of parsed metadata - AllCardsBagApi.getCardById = function(id) - return getAllCardsBag().call("getCardById", {id = id}) - end - - -- Gets a random basic weakness from the bag. Once a given ID has been returned - -- it will be removed from the list and cannot be selected again until a reload - -- occurs or the indexes are rebuilt, which will refresh the list to include all - -- weaknesses. - ---@return id String ID of the selected weakness. - AllCardsBagApi.getRandomWeaknessId = function() - return getAllCardsBag().call("getRandomWeaknessId") - end - - AllCardsBagApi.isIndexReady = function() - return getAllCardsBag().call("isIndexReady") - end - - -- Called by Hotfix bags when they load. If we are still loading indexes, then - -- the all cards and hotfix bags are being loaded together, and we can ignore - -- this call as the hotfix will be included in the initial indexing. If it is - -- called once indexing is complete it means the hotfix bag has been added - -- later, and we should rebuild the index to integrate the hotfix bag. - AllCardsBagApi.rebuildIndexForHotfix = function() - return getAllCardsBag().call("rebuildIndexForHotfix") - end - - -- Searches the bag for cards which match the given name and returns a list. Note that this is - -- an O(n) search without index support. It may be slow. - ---@param name String or string fragment to search for names - ---@param exact Boolean Whether the name match should be exact - AllCardsBagApi.getCardsByName = function(name, exact) - return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) - end - - AllCardsBagApi.isBagPresent = function() - return getAllCardsBag() and true - end - - -- Returns a list of cards from the bag matching a class and level (0 or upgraded) - ---@param class String class to retrieve ("Guardian", "Seeker", etc) - ---@param upgraded Boolean true for upgraded cards (Level 1-5), false for Level 0 - ---@return: If the indexes are still being constructed, returns an empty table. - -- Otherwise, a list of tables, each with the following fields - -- cardData: TTS object data, suitable for spawning the card - -- cardMetadata: Table of parsed metadata - AllCardsBagApi.getCardsByClassAndLevel = function(class, upgraded) - return getAllCardsBag().call("getCardsByClassAndLevel", {class = class, upgraded = upgraded}) - end - - AllCardsBagApi.getCardsByCycle = function(cycle) - return getAllCardsBag().call("getCardsByCycle", cycle) - end - - AllCardsBagApi.getUniqueWeaknesses = function() - return getAllCardsBag().call("getUniqueWeaknesses") - end - - return AllCardsBagApi -end -end) -__bundle_register("playercards/PlayerCardSpawner", function(require, _LOADED, __bundle_register, __bundle_modules) --- Amount to shift for the next card (zShift) or next row of cards (xShift) --- Note that the table rotation is weird, and the X axis is vertical while the --- Z axis is horizontal -local SPREAD_Z_SHIFT = -2.3 -local SPREAD_X_SHIFT = -3.66 - -Spawner = { } - --- Spawns a list of cards at the given position/rotation. This will separate cards by size - --- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If --- there are different types, the provided callback will be called once for each type as it spawns --- either a card or deck. --- @param cardList: A list of Player Card data structures (data/metadata) --- @param pos Position table where the cards should be spawned (global) --- @param rot Rotation table for the orientation of the spawned cards (global) --- @param sort Boolean, true if this list of cards should be sorted before spawning --- @param callback Function, callback to be called after the card/deck spawns. -Spawner.spawnCards = function(cardList, pos, rot, sort, callback) - if (sort) then - table.sort(cardList, Spawner.cardComparator) - end - - local miniCards = { } - local standardCards = { } - local investigatorCards = { } - - for _, card in ipairs(cardList) do - if (card.metadata.type == "Investigator") then - table.insert(investigatorCards, card) - elseif (card.metadata.type == "Minicard") then - table.insert(miniCards, card) - else - table.insert(standardCards, card) - end - end - -- Spawn each of the three types individually. Each Y position shift accounts for the thickness - -- of the spawned deck - local position = { x = pos.x, y = pos.y, z = pos.z } - Spawner.spawn(investigatorCards, position, { rot.x, rot.y - 90, rot.z }, callback) - - position.y = position.y + (#investigatorCards + #standardCards) * 0.07 - Spawner.spawn(standardCards, position, rot, callback) - - position.y = position.y + (#standardCards + #miniCards) * 0.07 - Spawner.spawn(miniCards, position, rot, callback) -end - -Spawner.spawnCardSpread = function(cardList, startPos, maxCols, rot, sort, callback) - if (sort) then - table.sort(cardList, Spawner.cardComparator) - end - - local position = { x = startPos.x, y = startPos.y, z = startPos.z } - -- Special handle the first row if we have less than a full single row, but only if there's a - -- reasonable max column count. Single-row spreads will send a large value for maxCols - if maxCols < 100 and #cardList < maxCols then - position.z = startPos.z + ((maxCols - #cardList) / 2 * SPREAD_Z_SHIFT) - end - local cardsInRow = 0 - local rows = 0 - for _, card in ipairs(cardList) do - Spawner.spawn({ card }, position, rot, callback) - position.z = position.z + SPREAD_Z_SHIFT - cardsInRow = cardsInRow + 1 - if cardsInRow >= maxCols then - rows = rows + 1 - local cardsForRow = #cardList - rows * maxCols - if cardsForRow > maxCols then - cardsForRow = maxCols - end - position.z = startPos.z + ((maxCols - cardsForRow) / 2 * SPREAD_Z_SHIFT) - position.x = position.x + SPREAD_X_SHIFT - cardsInRow = 0 - end - end -end - --- Spawn a specific list of cards. This method is for internal use and should not be called --- directly, use spawnCards instead. ----@param cardList: A list of Player Card data structures (data/metadata) ----@param pos table Position where the cards should be spawned (global) ----@param rot table Rotation for the orientation of the spawned cards (global) ----@param callback function callback to be called after the card/deck spawns. -Spawner.spawn = function(cardList, pos, rot, callback) - if (#cardList == 0) then - return - end - -- Spawn a single card directly - if (#cardList == 1) then - spawnObjectData({ - data = cardList[1].data, - position = pos, - rotation = rot, - callback_function = callback, - }) - return - end - -- For multiple cards, construct a deck and spawn that - local deck = Spawner.buildDeckDataTemplate() - -- Decks won't inherently scale to the cards in them. The card list being spawned should be all - -- the same type/size by this point, so use the first card to set the size - deck.Transform = { - scaleX = cardList[1].data.Transform.scaleX, - scaleY = 1, - scaleZ = cardList[1].data.Transform.scaleZ, - } - local sidewaysDeck = true - for _, spawnCard in ipairs(cardList) do - Spawner.addCardToDeck(deck, spawnCard.data) - -- set sidewaysDeck to false if any card is not a sideways card - sidewaysDeck = (sidewaysDeck and spawnCard.data.SidewaysCard) - end - -- set the alt view angle for sideway decks - if sidewaysDeck then - deck.AltLookAngle = { x = 0, y = 180, z = 90 } - end - spawnObjectData({ - data = deck, - position = pos, - rotation = rot, - callback_function = callback, - }) -end - --- Inserts a card into the given deck. This does three things: --- 1. Add the card's data to ContainedObjects --- 2. Add the card's ID (the TTS CardID, not the Arkham ID) to the deck's --- ID list. Note that the deck's ID list is "DeckIDs" even though it --- contains a list of card Ids --- 3. Extract the card's CustomDeck table and add it to the deck. The deck's --- "CustomDeck" field is a list of all CustomDecks used by cards within the --- deck, keyed by the DeckID and referencing the custom deck table ----@param deck: TTS deck data structure to add to ----@param cardData: Data for the card to be inserted -Spawner.addCardToDeck = function(deck, cardData) - for customDeckId, customDeckData in pairs(cardData.CustomDeck) do - if (deck.CustomDeck[customDeckId] == nil) then - -- CustomDeck not added to deck yet, add it - deck.CustomDeck[customDeckId] = customDeckData - elseif (deck.CustomDeck[customDeckId].FaceURL == customDeckData.FaceURL) then - -- CustomDeck for this card matches the current one for the deck, do nothing - else - -- CustomDeck data conflict - local newDeckId = nil - for deckId, customDeck in pairs(deck.CustomDeck) do - if (customDeckData.FaceURL == customDeck.FaceURL) then - newDeckId = deckId - end - end - if (newDeckId == nil) then - -- No non-conflicting custom deck for this card, add a new one - newDeckId = Spawner.findNextAvailableId(deck.CustomDeck, "1000") - deck.CustomDeck[newDeckId] = customDeckData - end - -- Update the card with the new CustomDeck info - cardData.CardID = newDeckId..string.sub(cardData.CardID, 5) - cardData.CustomDeck[customDeckId] = nil - cardData.CustomDeck[newDeckId] = customDeckData - break - end - end - table.insert(deck.ContainedObjects, cardData) - table.insert(deck.DeckIDs, cardData.CardID) -end - --- Create an empty deck data table which can have cards added to it. This --- creates a new table on each call without using metatables or previous --- definitions because we can't be sure that TTS doesn't modify the structure ----@return: Table containing the minimal TTS deck data structure -Spawner.buildDeckDataTemplate = function() - local deck = {} - deck.Name = "Deck" - - -- Card data. DeckIDs and CustomDeck entries will be built from the cards - deck.ContainedObjects = {} - deck.DeckIDs = {} - deck.CustomDeck = {} - - -- Transform is required, Position and Rotation will be overridden by the spawn call so can be omitted here - deck.Transform = { - scaleX = 1, - scaleY = 1, - scaleZ = 1, - } - - return deck -end - --- Returns the first ID which does not exist in the given table, starting at startId and increasing --- @param objectTable Table keyed by strings which are numbers --- @param startId First possible ID. --- @return String ID >= startId -Spawner.findNextAvailableId = function(objectTable, startId) - local id = startId - while (objectTable[id] ~= nil) do - id = tostring(tonumber(id) + 1) - end - - return id -end - --- Get the PBCN (Permanent/Bonded/Customizable/Normal) value from the given metadata. ----@return: 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are --- irrelevant as they provide only grouping and the order between them doesn't matter. -Spawner.getpbcn = function(metadata) - if metadata.permanent then - return 1 - elseif metadata.bonded_to ~= nil then - return 2 - else -- Normal card - return 3 - end -end - --- Comparison function used to sort the cards in a deck. Groups bonded or --- permanent cards first, then sorts within theose types by name/subname. --- Normal cards will sort in standard alphabetical order, while --- permanent/bonded/customizable will be in reverse alphabetical order. --- --- Since cards spawn in the order provided by this comparator, with the first --- cards ending up at the bottom of a pile, this ordering will spawn in reverse --- alphabetical order. This presents the cards in order for non-face-down --- areas, and presents them in order when Searching the face-down deck. -Spawner.cardComparator = function(card1, card2) - local pbcn1 = Spawner.getpbcn(card1.metadata) - local pbcn2 = Spawner.getpbcn(card2.metadata) - if pbcn1 ~= pbcn2 then - return pbcn1 > pbcn2 - end - if pbcn1 == 3 then - if card1.data.Nickname ~= card2.data.Nickname then - return card1.data.Nickname < card2.data.Nickname - end - return card1.data.Description < card2.data.Description - else - if card1.data.Nickname ~= card2.data.Nickname then - return card1.data.Nickname > card2.data.Nickname - end - return card1.data.Description > card2.data.Description - end -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("arkhamdb/DeckImporterMain") -end) __bundle_register("arkhamdb/ArkhamDb", function(require, _LOADED, __bundle_register, __bundle_modules) do local allCardsBagApi = require("playercards/AllCardsBagApi") local playAreaApi = require("core/PlayAreaApi") + + local ArkhamDb = {} + local internal = {} - local ArkhamDb = { } - local internal = { } + local tabooList = {} + local configuration local RANDOM_WEAKNESS_ID = "01000" - local tabooList = { } - --Forward declaration - ---@type Request + ---@class Request local Request = {} - local configuration -- Sets up the ArkhamDb interface. Should be called from the parent object on load. ArkhamDb.initialize = function() @@ -953,7 +1538,6 @@ do Request.start({ configuration.api_uri, configuration.taboo }, function(status) local json = JSON.decode(internal.fixUtf16String(status.text)) for _, taboo in pairs(json) do - ---@type local cards = {} for _, card in pairs(JSON.decode(taboo.cards)) do @@ -971,18 +1555,19 @@ do -- Start the deck build process for the given player color and deck ID. This -- will retrieve the deck from ArkhamDB, and pass to a callback for processing. - ---@param playerColor String. Color name of the player mat to place this deck on (e.g. "Red"). - ---@param deckId String. ArkhamDB deck id to be loaded - ---@param isPrivate Boolean. Whether this deck is published or private on ArkhamDB - ---@param loadNewest Boolean. Whether the newest version of this deck should be loaded - ---@param loadInvestigators Boolean. Whether investigator cards should be loaded as part of this - --- deck - ---@param callback Function. Callback which will be sent the results of this load. Parameters - --- to the callback will be: - --- slots Table. A map of card ID to count in the deck + ---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red"). + ---@param deckId string ArkhamDB deck id to be loaded + ---@param isPrivate boolean Whether this deck is published or private on ArkhamDB + ---@param loadNewest boolean Whether the newest version of this deck should be loaded + ---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck + ---@param callback function Callback which will be sent the results of this load + --- Parameters to the callback will be: + --- slots table A map of card ID to count in the deck --- investigatorCode String. ID of the investigator in this deck - --- customizations Table. The decoded table of customization upgrades in this deck + --- customizations table The decoded table of customization upgrades in this deck --- playerColor String. Color this deck is being loaded for + ---@return boolean + ---@return string ArkhamDb.getDecklist = function( playerColor, deckId, @@ -994,16 +1579,19 @@ do -- the deck load. The called method will handle player notification. local checkCard = allCardsBagApi.getCardById("01001") if (checkCard ~= nil and checkCard.data == nil) then - return + return false, "Indexing not complete" end - local deckUri = { configuration.api_uri, - isPrivate and configuration.private_deck or configuration.public_deck, deckId } + local deckUri = { + configuration.api_uri, + isPrivate and configuration.private_deck or configuration.public_deck, + deckId + } local deck = Request.start(deckUri, function(status) if string.find(status.text, "") then internal.maybePrint("Private deck ID " .. deckId .. " is not shared", playerColor) - return false, table.concat({ "Private deck ", deckId, " is not shared" }) + return false, "Private deck " .. deckId .. " is not shared" end local json = JSON.decode(status.text) @@ -1021,8 +1609,8 @@ do -- Logs that a card could not be loaded in the mod by printing it to the console in the given -- color of the player owning the deck. Attempts to look up the name on ArkhamDB for clarity, -- but prints the card ID if the name cannot be retrieved. - ---@param cardId String. ArkhamDB ID of the card that could not be found - ---@param playerColor String. Color of the player's deck that had the problem + ---@param cardId string ArkhamDB ID of the card that could not be found + ---@param playerColor string Color of the player's deck that had the problem ArkhamDb.logCardNotFound = function(cardId, playerColor) local request = Request.start({ configuration.api_uri, @@ -1036,9 +1624,9 @@ do if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then cardName = cardName .. " (" .. adbCardInfo.xp .. ")" end - internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) + internal.maybePrint("Card not found: " .. cardName .. ", card ID " .. cardId, playerColor) else - internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) + internal.maybePrint("Card not found in ArkhamDB/Index, ID " .. cardId, playerColor) end end) end @@ -1047,18 +1635,17 @@ do -- response then applies standard transformations to the deck such as adding -- random weaknesses and checking for taboos. Once the deck is processed, -- passes to loadCards to actually spawn the defined deck. - ---@param deck ArkhamImportDeck - ---@param playerColor String Color name of the player mat to place this deck on (e.g. "Red") - ---@param loadNewest Boolean Whether the newest version of this deck should be loaded - ---@param loadInvestigators Boolean Whether investigator cards should be loaded as part of this - --- deck - ---@param callback Function Callback which will be sent the results of this load. Parameters - --- to the callback will be: - --- slots Table. A map of card ID to count in the deck + ---@param deck table ArkhamImportDeck + ---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red") + ---@param loadNewest boolean Whether the newest version of this deck should be loaded + ---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck + ---@param callback function Callback which will be sent the results of this load. + --- Parameters to the callback will be: + --- slots table A map of card ID to count in the deck --- investigatorCode String. ID of the investigator in this deck --- bondedList A table of cardID keys to meaningless values. Card IDs in this list were --- added from a parent bonded card. - --- customizations Table. The decoded table of customization upgrades in this deck + --- customizations table The decoded table of customization upgrades in this deck --- playerColor String. Color this deck is being loaded for internal.onDeckResult = function(deck, playerColor, loadNewest, loadInvestigators, callback) -- Load the next deck in the upgrade path if the option is enabled @@ -1074,12 +1661,14 @@ do -- investigator may have bonded cards or taboo entries, and should be present local slots = deck.slots internal.maybeDrawRandomWeakness(slots, playerColor) + + -- handles alternative investigators (parallel, promo or revised art) local loadAltInvestigator = "normal" if loadInvestigators then loadAltInvestigator = internal.addInvestigatorCards(deck, slots) end - - internal.maybeModifyDeckFromDescription(slots, deck.description_md) + + internal.maybeModifyDeckFromDescription(slots, deck.description_md, playerColor) internal.maybeAddSummonedServitor(slots) internal.maybeAddOnTheMend(slots, playerColor) internal.maybeAddRealityAcidReference(slots) @@ -1099,9 +1688,9 @@ do -- Checks to see if the slot list includes the random weakness ID. If it does, -- removes it from the deck and replaces it with the ID of a random basic weakness provided by the -- all cards bag - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number --- of those cards which will be spawned - ---@param playerColor String Color of the player this deck is being loaded for. Used for broadcast + ---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast --- if a weakness is added. internal.maybeDrawRandomWeakness = function(slots, playerColor) local randomWeaknessAmount = slots[RANDOM_WEAKNESS_ID] or 0 @@ -1117,14 +1706,15 @@ do end -- Adds both the investigator (XXXXX) and minicard (XXXXX-m) slots with one copy each - ---@param deck Table The processed ArkhamDB deck response - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the + ---@param deck table The processed ArkhamDB deck response + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the --- number of those cards which will be spawned ---@return string: Contains the name of the art that should be loaded ("normal", "promo" or "revised") internal.addInvestigatorCards = function(deck, slots) local investigatorId = deck.investigator_code slots[investigatorId .. "-m"] = 1 local deckMeta = JSON.decode(deck.meta) + -- handling alternative investigator art and parallel investigators local loadAltInvestigator = "normal" if deckMeta ~= nil then @@ -1172,7 +1762,7 @@ do end -- Process the card list looking for the customizable cards, and add their upgrade sheets if needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddUpgradeSheets = function(slots) for cardId, _ in pairs(slots) do @@ -1186,7 +1776,7 @@ do -- Process the card list looking for the Summoned Servitor, and add its minicard to the list if -- needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddSummonedServitor = function(slots) if slots["09080"] ~= nil then @@ -1196,9 +1786,9 @@ do -- On the Mend should have 1-per-investigator copies set aside, but ArkhamDB always sends 1. Update -- the count based on the investigator count - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned - ---@param playerColor String Color of the player this deck is being loaded for. Used for broadcast if an error occurs + ---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast if an error occurs internal.maybeAddOnTheMend = function(slots, playerColor) if slots["09006"] ~= nil then local investigatorCount = playAreaApi.getInvestigatorCount() @@ -1212,7 +1802,7 @@ do end -- Process the card list looking for Reality Acid and adds the reference sheet when needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddRealityAcidReference = function(slots) if slots["89004"] ~= nil then @@ -1221,16 +1811,16 @@ do end -- Processes the deck description from ArkhamDB and modifies the slot list accordingly - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number - ---@param description String The deck desription from ArkhamDB - internal.maybeModifyDeckFromDescription = function(slots, description) + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param description string The deck desription from ArkhamDB + internal.maybeModifyDeckFromDescription = function(slots, description, playerColor) -- check for import instructions local pos = string.find(description, "++SCED import instructions++") if not pos then return end - -- remove everything before instructions (including newline) - local tempStr = string.sub(description, pos + 30) - + -- remove everything before instructions + local tempStr = string.sub(description, pos) + -- parse each line in instructions for line in tempStr:gmatch("([^\n]+)") do -- remove dashes at the start @@ -1239,6 +1829,10 @@ do -- remove spaces line = line:gsub("%s", "") + -- remove balanced brackets + line = line:gsub("%b()", "") + line = line:gsub("%b[]", "") + -- get instructor local instructor = "" for word in line:gmatch("%a+:") do @@ -1246,26 +1840,42 @@ do break end - if instructor == "" or (instructor ~= "add:" and instructor ~= "remove:") then return end + -- go to the next line if no valid instructor found + if instructor ~= "add:" and instructor ~= "remove:" then + goto nextLine + end -- remove instructor from line line = line:gsub(instructor, "") -- evaluate instructions - local cardIds = {} for str in line:gmatch("([^,]+)") do if instructor == "add:" then slots[str] = (slots[str] or 0) + 1 elseif instructor == "remove:" then - if slots[str] == nil then break end - slots[str] = math.max(slots[str] - 1, 0) + if slots[str] == nil then + internal.maybePrint("Tried to remove card ID " .. str .. ", but didn't find card in deck.", playerColor) + else + slots[str] = math.max(slots[str] - 1, 0) + + -- fully remove cards that have a quantity of 0 + if slots[str] == 0 then + slots[str] = nil + + -- also remove related minicard + slots[str .. "-m"] = nil + end + end end end + + -- jump mark at the end of the loop + ::nextLine:: end end -- Process the slot list and looks for any cards which are bonded to those in the deck. Adds those cards to the slot list. - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned internal.extractBondedCards = function(slots) -- Create a list of bonded cards first so we don't modify slots while iterating local bondedCards = { } @@ -1296,8 +1906,8 @@ do end -- Check the deck for cards on its taboo list. If they're found, replace the entry in the slot with the Taboo id (i.e. "XXXX" becomes "XXXX-t") - ---@param tabooId String The deck's taboo ID, taken from the deck response taboo_id field. May be nil, indicating that no taboo list should be used - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned + ---@param tabooId string The deck's taboo ID, taken from the deck response taboo_id field. May be nil, indicating that no taboo list should be used + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned internal.checkTaboos = function(tabooId, slots, playerColor) if tabooId then for cardId, _ in pairs(tabooList[tabooId].cards) do @@ -1325,9 +1935,9 @@ do end -- Gets the ArkhamDB config info from the configuration object. - ---@return Table. Configuration data + ---@return table: configuration data internal.getConfiguration = function() - local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") + local configuration = getObjectsWithTag("import_configuration_provider")[1].getTable("configuration") printPriority = configuration.priority return configuration end @@ -1338,15 +1948,14 @@ do end) end - ---@type Request Request = { is_done = false, is_successful = false } - -- Creates a new instance of a Request. Should not be directly called. Instead use Request.start and Request.deferred. - ---@param uri string - ---@param configure fun(request: Request, status: WebRequestStatus) + -- Creates a new instance of a Request. Should not be directly called. Instead use Request.start() and Request.deferred(). + ---@param uri table + ---@param configure fun(request, status) ---@return Request function Request:new(uri, configure) local this = {} @@ -1359,20 +1968,16 @@ do end this.uri = uri - - WebRequest.get(uri, function(status) - configure(this, status) - end) + WebRequest.get(uri, function(status) configure(this, status) end) return this end -- Creates a new request. on_success should set the request's is_done, is_successful, and content variables. -- Deferred should be used when you don't want to set is_done immediately (such as if you want to wait for another request to finish) - ---@param uri string - ---@param on_success fun(request: Request, status: WebRequestStatus, vararg any) - ---@param on_error fun(status: WebRequestStatus)|nil - ---@vararg any[] + ---@param uri table + ---@param on_success fun(request, status, vararg) + ---@param on_error fun(status)|nil ---@return Request function Request.deferred(uri, on_success, on_error, ...) local parameters = table.pack(...) @@ -1389,11 +1994,11 @@ do end) end - -- Creates a new request. on_success should return weather the resultant data is as expected, and the processed content of the request. - ---@param uri string - ---@param on_success fun(status: WebRequestStatus, vararg any): boolean, any - ---@param on_error nil|fun(status: WebRequestStatus, vararg any): string - ---@vararg any[] + -- Creates a new request. on_success should return whether the resultant data is as expected, and the processed content of the request. + ---@param uri table + ---@param on_success fun(status, vararg): boolean, any + ---@param on_error nil|fun(status, vararg): string + ---@vararg any ---@return Request function Request.start(uri, on_success, on_error, ...) local parameters = table.pack(...) @@ -1406,17 +2011,14 @@ do end ---@param requests Request[] - ---@param on_success fun(content: any[], vararg any[]) - ---@param on_error fun(requests: Request[], vararg any[])|nil + ---@param on_success fun(content: any, vararg: any) + ---@param on_error fun(requests: Request, vararg: any)|nil ---@vararg any function Request.with_all(requests, on_success, on_error, ...) local parameters = table.pack(...) Wait.condition(function() - ---@type any[] local results = {} - - ---@type Request[] local errors = {} for _, request in ipairs(requests) do @@ -1444,7 +2046,6 @@ do end) end - ---@param callback fun(content: any, vararg any) function Request:with(callback, ...) local arguments = table.pack(...) Wait.condition(function() @@ -1488,36 +2089,21 @@ local loadInvestigators = false -- Returns a table with the full state of the UI, including options and deck IDs. -- This can be used to persist via onSave(), or provide values for a load operation --- Table values: --- redDeck: Deck ID to load for the red player --- orangeDeck: Deck ID to load for the orange player --- whiteDeck: Deck ID to load for the white player --- greenDeck: Deck ID to load for the green player --- private: True to load a private deck, false to load a public deck --- loadNewest: True if the most upgraded version of the deck should be loaded --- investigators: True if investigator cards should be spawned +---@return uiStateTable uiStateTable Contains data about the current UI state function getUiState() return { redDeck = redDeckId, orangeDeck = orangeDeckId, whiteDeck = whiteDeckId, greenDeck = greenDeckId, - private = privateDeck, + privateDeck = privateDeck, loadNewest = loadNewestDeck, investigators = loadInvestigators } end -- Updates the state of the UI based on the provided table. Any values not provided will be left the same. ----@param uiStateTable Table of values to update on importer --- Table values: --- redDeck: Deck ID to load for the red player --- orangeDeck: Deck ID to load for the orange player --- whiteDeck: Deck ID to load for the white player --- greenDeck: Deck ID to load for the green player --- private: True to load a private deck, false to load a public deck --- loadNewest: True if the most upgraded version of the deck should be loaded --- investigators: True if investigator cards should be spawned +---@param uiStateTable table Table of values to update on importer function setUiState(uiStateTable) self.clearButtons() self.clearInputs() @@ -1531,7 +2117,7 @@ function initializeUi(savedUiState) orangeDeckId = savedUiState.orangeDeck whiteDeckId = savedUiState.whiteDeck greenDeckId = savedUiState.greenDeck - privateDeck = savedUiState.private + privateDeck = savedUiState.privateDeck loadNewestDeck = savedUiState.loadNewest loadInvestigators = savedUiState.investigators end @@ -1672,594 +2258,4 @@ function loadDecks() end end end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") - end - - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") - end - - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") - end - - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) - end - - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) - end - - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("playermat/Zones", function(require, _LOADED, __bundle_register, __bundle_modules) --- Sets up and returns coordinates for all possible spawn zones. Because Lua assigns tables by reference --- and there is no built-in function to copy a table this is relatively brute force. --- --- Positions are all relative to the player mat, and most are consistent. The --- exception are the SetAside# zones, which are placed to the left of the mat --- for White/Green, and the right of the mat for Orange/Red. --- --- Investigator: Investigator card area. --- Minicard: Placement for the investigator's minicard, just above the player mat --- Deck, Discard: Standard locations for the deck and discard piles. --- Blank1: used for assets that start in play (e.g. Duke) --- Tarot, Hand1, Hand2, Ally, Blank4, Accessory, Arcane1, Arcane2, Body: Asset slot positions --- Threat[1-4]: Threat area slots. Threat[1-3] correspond to the named threat area slots, and Threat4 is the blank threat area slot. --- SetAside[1-3]: Column closest to the player mat, with 1 at the top and 3 at the bottom. --- SetAside[4-6]: Column farther away from the mat, with 4 at the top and 6 at the bottom. --- SetAside1: Permanent cards --- SetAside2: Bonded cards --- SetAside3: Ancestral Knowledge / Underworld Market --- SetAside4: Upgrade sheets for customizable cards --- SetAside5: Hunch Deck for Joe Diamond --- SetAside6: currently unused -do - local playmatApi = require("playermat/PlaymatApi") - local Zones = { } - - local commonZones = {} - commonZones["Investigator"] = { -1.177, 0, 0.002 } - commonZones["Deck"] = { -1.82, 0, 0 } - commonZones["Discard"] = { -1.82, 0, 0.61 } - commonZones["Ally"] = { -0.615, 0, 0.024 } - commonZones["Body"] = { -0.630, 0, 0.553 } - commonZones["Hand1"] = { 0.215, 0, 0.042 } - commonZones["Hand2"] = { -0.180, 0, 0.037 } - commonZones["Arcane1"] = { 0.212, 0, 0.559 } - commonZones["Arcane2"] = { -0.171, 0, 0.557 } - commonZones["Tarot"] = { 0.602, 0, 0.033 } - commonZones["Accessory"] = { 0.602, 0, 0.555 } - commonZones["Blank1"] = { 1.758, 0, 0.040 } - commonZones["Blank2"] = { 1.754, 0, 0.563 } - commonZones["Blank3"] = { 1.371, 0, 0.038 } - commonZones["Blank4"] = { 1.371, 0, 0.558 } - commonZones["Blank5"] = { 0.98, 0, 0.035 } - commonZones["Blank6"] = { 0.977, 0, 0.556 } - commonZones["Threat1"] = { -0.911, 0, -0.625 } - commonZones["Threat2"] = { -0.454, 0, -0.625 } - commonZones["Threat3"] = { 0.002, 0, -0.625 } - commonZones["Threat4"] = { 0.459, 0, -0.625 } - - local zoneData = {} - zoneData["White"] = {} - zoneData["White"]["Investigator"] = commonZones["Investigator"] - zoneData["White"]["Deck"] = commonZones["Deck"] - zoneData["White"]["Discard"] = commonZones["Discard"] - zoneData["White"]["Ally"] = commonZones["Ally"] - zoneData["White"]["Body"] = commonZones["Body"] - zoneData["White"]["Hand1"] = commonZones["Hand1"] - zoneData["White"]["Hand2"] = commonZones["Hand2"] - zoneData["White"]["Arcane1"] = commonZones["Arcane1"] - zoneData["White"]["Arcane2"] = commonZones["Arcane2"] - zoneData["White"]["Tarot"] = commonZones["Tarot"] - zoneData["White"]["Accessory"] = commonZones["Accessory"] - zoneData["White"]["Blank1"] = commonZones["Blank1"] - zoneData["White"]["Blank2"] = commonZones["Blank2"] - zoneData["White"]["Blank3"] = commonZones["Blank3"] - zoneData["White"]["Blank4"] = commonZones["Blank4"] - zoneData["White"]["Blank5"] = commonZones["Blank5"] - zoneData["White"]["Blank6"] = commonZones["Blank6"] - zoneData["White"]["Threat1"] = commonZones["Threat1"] - zoneData["White"]["Threat2"] = commonZones["Threat2"] - zoneData["White"]["Threat3"] = commonZones["Threat3"] - zoneData["White"]["Threat4"] = commonZones["Threat4"] - zoneData["White"]["Minicard"] = { -1, 0, -1.45 } - zoneData["White"]["SetAside1"] = { 2.35, 0, -0.520 } - zoneData["White"]["SetAside2"] = { 2.35, 0, 0.042 } - zoneData["White"]["SetAside3"] = { 2.35, 0, 0.605 } - zoneData["White"]["UnderSetAside3"] = { 2.50, 0, 0.805 } - zoneData["White"]["SetAside4"] = { 2.78, 0, -0.520 } - zoneData["White"]["SetAside5"] = { 2.78, 0, 0.042 } - zoneData["White"]["SetAside6"] = { 2.78, 0, 0.605 } - zoneData["White"]["UnderSetAside6"] = { 2.93, 0, 0.805 } - - zoneData["Orange"] = {} - zoneData["Orange"]["Investigator"] = commonZones["Investigator"] - zoneData["Orange"]["Deck"] = commonZones["Deck"] - zoneData["Orange"]["Discard"] = commonZones["Discard"] - zoneData["Orange"]["Ally"] = commonZones["Ally"] - zoneData["Orange"]["Body"] = commonZones["Body"] - zoneData["Orange"]["Hand1"] = commonZones["Hand1"] - zoneData["Orange"]["Hand2"] = commonZones["Hand2"] - zoneData["Orange"]["Arcane1"] = commonZones["Arcane1"] - zoneData["Orange"]["Arcane2"] = commonZones["Arcane2"] - zoneData["Orange"]["Tarot"] = commonZones["Tarot"] - zoneData["Orange"]["Accessory"] = commonZones["Accessory"] - zoneData["Orange"]["Blank1"] = commonZones["Blank1"] - zoneData["Orange"]["Blank2"] = commonZones["Blank2"] - zoneData["Orange"]["Blank3"] = commonZones["Blank3"] - zoneData["Orange"]["Blank4"] = commonZones["Blank4"] - zoneData["Orange"]["Blank5"] = commonZones["Blank5"] - zoneData["Orange"]["Blank6"] = commonZones["Blank6"] - zoneData["Orange"]["Threat1"] = commonZones["Threat1"] - zoneData["Orange"]["Threat2"] = commonZones["Threat2"] - zoneData["Orange"]["Threat3"] = commonZones["Threat3"] - zoneData["Orange"]["Threat4"] = commonZones["Threat4"] - zoneData["Orange"]["Minicard"] = { 1, 0, -1.45 } - zoneData["Orange"]["SetAside1"] = { -2.35, 0, -0.520 } - zoneData["Orange"]["SetAside2"] = { -2.35, 0, 0.042} - zoneData["Orange"]["SetAside3"] = { -2.35, 0, 0.605 } - zoneData["Orange"]["UnderSetAside3"] = { -2.50, 0, 0.805 } - zoneData["Orange"]["SetAside4"] = { -2.78, 0, -0.520 } - zoneData["Orange"]["SetAside5"] = { -2.78, 0, 0.042 } - zoneData["Orange"]["SetAside6"] = { -2.78, 0, 0.605 } - zoneData["Orange"]["UnderSetAside6"] = { -2.93, 0, 0.805 } - - -- Green positions are the same as White and Red the same as Orange - zoneData["Red"] = zoneData["Orange"] - zoneData["Green"] = zoneData["White"] - - -- Gets the global position for the given zone on the specified player mat. - ---@param playerColor: Color name of the player mat to get the zone position for (e.g. "Red") - ---@param zoneName: Name of the zone to get the position for. See Zones object documentation for a list of valid zones. - ---@return: Global position table, or nil if an invalid player color or zone is specified - Zones.getZonePosition = function(playerColor, zoneName) - if (playerColor ~= "Red" - and playerColor ~= "Orange" - and playerColor ~= "White" - and playerColor ~= "Green") then - return nil - end - return playmatApi.transformLocalPosition(zoneData[playerColor][zoneName], playerColor) - end - - -- Return the global rotation for a card on the given player mat, based on its zone. - ---@param playerColor: Color name of the player mat to get the rotation for (e.g. "Red") - ---@param zoneName: Name of the zone. See Zones object documentation for a list of valid zones. - ---@return: Global rotation vector for the given card. This will include the - -- Y rotation to orient the card on the given player mat as well as a - -- Z rotation to place the card face up or face down. - Zones.getDefaultCardRotation = function(playerColor, zoneName) - local cardRotation = playmatApi.returnRotation(playerColor) - if zoneName == "Deck" then - cardRotation = cardRotation + Vector(0, 0, 180) - end - return cardRotation - end - - return Zones -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") diff --git a/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml b/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml index cc5acda5c..6cde14617 100644 --- a/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml +++ b/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.yaml @@ -29,7 +29,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true LuaScript: !include 'Custom_Tile ArkhamDB Deck Importer a28140.ttslua' -LuaScriptState: '{"greenDeck":"","investigators":true,"loadNewest":true,"orangeDeck":"","private":true,"redDeck":"","whiteDeck":""}' +LuaScriptState: '{"greenDeck":"","investigators":true,"loadNewest":true,"orangeDeck":"","privateDeck":true,"redDeck":"","whiteDeck":""}' MeasureMovement: false Name: Custom_Tile Nickname: ArkhamDB Deck Importer diff --git a/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua index 1324b445e..c3b1d1a63 100644 --- a/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua +++ b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua @@ -359,6 +359,197 @@ function loadTrauma(log) end end end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -373,60 +564,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -443,13 +629,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -469,7 +655,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -481,6 +667,342 @@ do return PlayAreaApi end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("accessories/CampaignImporterExporter") +end) +__bundle_register("arkhamdb/DeckImporterApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local DeckImporterApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getDeckImporter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "DeckImporter") + end + + ---@class uiStateTable + ---@field redDeck string Deck ID to load for the red player + ---@field orangeDeck string Deck ID to load for the orange player + ---@field whiteDeck string Deck ID to load for the white player + ---@field greenDeck string Deck ID to load for the green player + ---@field privateDeck boolean True to load a private deck, false to load a public deck + ---@field loadNewest boolean True if the most upgraded version of the deck should be loaded + ---@field investigators boolean True if investigator cards should be spawned + + -- Returns a table with the full state of the UI, including options and deck IDs. + -- This can be used to persist via onSave(), or provide values for a load operation + ---@return uiStateTable uiStateTable Contains data about the current UI state + DeckImporterApi.getUiState = function() + local passthroughTable = {} + for k,v in pairs(getDeckImporter().call("getUiState")) do + passthroughTable[k] = v + end + return passthroughTable + end + + -- Updates the state of the UI based on the provided table. Any values not provided will be left the same. + ---@return uiStateTable uiStateTable Contains data about the current UI state + DeckImporterApi.setUiState = function(uiStateTable) + return getDeckImporter().call("setUiState", uiStateTable) + end + + return DeckImporterApi +end +end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -494,14 +1016,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -514,7 +1039,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -549,524 +1074,4 @@ do return SearchLib end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("accessories/CampaignImporterExporter") -end) -__bundle_register("arkhamdb/DeckImporterApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local DeckImporterApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getDeckImporter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "DeckImporter") - end - - -- Returns a table with the full state of the UI, including options and deck IDs. - -- This can be used to persist via onSave(), or provide values for a load operation - -- Table values: - -- redDeck: Deck ID to load for the red player - -- orangeDeck: Deck ID to load for the orange player - -- whiteDeck: Deck ID to load for the white player - -- greenDeck: Deck ID to load for the green player - -- private: True to load a private deck, false to load a public deck - -- loadNewest: True if the most upgraded version of the deck should be loaded - -- investigators: True if investigator cards should be spawned - DeckImporterApi.getUiState = function() - local passthroughTable = {} - for k,v in pairs(getDeckImporter().call("getUiState")) do - passthroughTable[k] = v - end - return passthroughTable - end - - -- Updates the state of the UI based on the provided table. Any values not provided will be left the same. - ---@param uiStateTable Table of values to update on importer - -- Table values: - -- redDeck: Deck ID to load for the red player - -- orangeDeck: Deck ID to load for the orange player - -- whiteDeck: Deck ID to load for the white player - -- greenDeck: Deck ID to load for the green player - -- private: True to load a private deck, false to load a public deck - -- loadNewest: True if the most upgraded version of the deck should be loaded - -- investigators: True if investigator cards should be spawned - DeckImporterApi.setUiState = function(uiStateTable) - return getDeckImporter().call("setUiState", uiStateTable) - end - - return DeckImporterApi -end -end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile Campaign Overview e03c01.yaml b/unpacked/Custom_Tile Campaign Overview e03c01.yaml index c477e5566..b292408a1 100644 --- a/unpacked/Custom_Tile Campaign Overview e03c01.yaml +++ b/unpacked/Custom_Tile Campaign Overview e03c01.yaml @@ -37,14 +37,14 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 6.5 + posX: -1.6 posY: 1.48 - posZ: -87 + posZ: -58.5 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 10 + scaleX: 13 scaleY: 1 - scaleZ: 10 + scaleZ: 13 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua b/unpacked/Custom_Tile Chaos Bag Manager 023240.ttslua similarity index 77% rename from unpacked/Custom_Token Chaos Bag Manager 023240.ttslua rename to unpacked/Custom_Tile Chaos Bag Manager 023240.ttslua index b5eec7d85..8c377992e 100644 --- a/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua +++ b/unpacked/Custom_Tile Chaos Bag Manager 023240.ttslua @@ -41,10 +41,7 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("accessories/ChaosBagManager") -end) -__bundle_register("accessories/ChaosBagManager", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("chaosbag/ChaosBagManager", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") local TOKEN_IDS = { @@ -65,39 +62,40 @@ local BUTTON_TOOLTIP = { "Elder Sign", "Skull", "Cultist", "Tablet", "Elder Thing", "Auto-fail" } -local BUTTON_POSITION = { +local BUTTON_POSITION_X = { -- first row - -1.90, -1.14, -0.38, 0.38, 1.14, 1.90, + -0.9, -0.54, -0.18, 0.18, 0.54, 0.9, -- second row - -1.90, -1.14, -0.38, 0.38, 1.90, + -0.9, -0.54, -0.18, 0.18, 0.9, -- third row - -1.90, -1.14, -0.38, 0.38, 1.14, 1.90 + -0.9, -0.54, -0.18, 0.18, 0.54, 0.9 } +local BUTTON_POSITION_Z = { -0.298, 0.05, 0.399 } + -- common button parameters local buttonParameters = {} buttonParameters.function_owner = self buttonParameters.color = { 0, 0, 0, 0 } -buttonParameters.width = 300 -buttonParameters.height = 300 - -local name -local tokens = {} +buttonParameters.width = 160 +buttonParameters.height = 160 function onLoad() -- create buttons for tokens - for i = 1, #BUTTON_POSITION do + for i = 1, #BUTTON_POSITION_X do local funcName = "buttonClick" .. i self.setVar(funcName, function(_, _, isRightClick) buttonClick(i, isRightClick) end) buttonParameters.click_function = funcName buttonParameters.tooltip = BUTTON_TOOLTIP[i] - buttonParameters.position = { x = BUTTON_POSITION[i], y = 0, z = 0 } + buttonParameters.position = { x = BUTTON_POSITION_X[i], y = 0 } if i < 7 then - buttonParameters.position.z = -0.778 - elseif i > 11 then - buttonParameters.position.z = 0.755 + buttonParameters.position.z = BUTTON_POSITION_Z[1] + elseif i < 12 then + buttonParameters.position.z = BUTTON_POSITION_Z[2] + else + buttonParameters.position.z = BUTTON_POSITION_Z[3] end self.createButton(buttonParameters) @@ -135,7 +133,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -162,29 +160,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -193,14 +192,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -212,4 +215,7 @@ do return ChaosBagApi end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("chaosbag/ChaosBagManager") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Chaos Bag Manager 023240.yaml b/unpacked/Custom_Tile Chaos Bag Manager 023240.yaml similarity index 67% rename from unpacked/Custom_Token Chaos Bag Manager 023240.yaml rename to unpacked/Custom_Tile Chaos Bag Manager 023240.yaml index 645f2963d..f3416760d 100644 --- a/unpacked/Custom_Token Chaos Bag Manager 023240.yaml +++ b/unpacked/Custom_Tile Chaos Bag Manager 023240.yaml @@ -8,14 +8,14 @@ ColorDiffuse: g: 1 r: 1 CustomImage: - CustomToken: - MergeDistancePixels: 15 + CustomTile: Stackable: false - StandUp: false + Stretch: true Thickness: 0.1 + Type: 3 ImageScalar: 1 ImageSecondaryURL: '' - ImageURL: http://cloud-3.steamusercontent.com/ugc/1857193769884995506/A760D5A6C66A035C4E4812BF5F0D511010EF526C/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/2503508192889053854/82E219D04F01E9B0E5106114E1181A6C176A477B/ WidthScale: 0 Description: 'Adds/removes the desired token from the chaos bag. @@ -31,10 +31,10 @@ HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true -LuaScript: !include 'Custom_Token Chaos Bag Manager 023240.ttslua' +LuaScript: !include 'Custom_Tile Chaos Bag Manager 023240.ttslua' LuaScriptState: '' MeasureMovement: false -Name: Custom_Token +Name: Custom_Tile Nickname: Chaos Bag Manager Snap: true Sticky: true @@ -42,14 +42,14 @@ Tags: - displacement_excluded Tooltip: true Transform: - posX: -66 - posY: 1.53 - posZ: -49.5 + posX: -65 + posY: 1.48 + posZ: -50 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 2.5 + scaleX: 4.8 scaleY: 1 - scaleZ: 2.5 + scaleZ: 4.8 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Tile Mythos Area 9f334f.ttslua b/unpacked/Custom_Tile Mythos Area 9f334f.ttslua index a23edce17..03f9d2f35 100644 --- a/unpacked/Custom_Tile Mythos Area 9f334f.ttslua +++ b/unpacked/Custom_Tile Mythos Area 9f334f.ttslua @@ -41,6 +41,364 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local DeckLib = {} + local searchLib = require("util/SearchLib") + + -- places a card/deck at a position or merges into an existing deck + ---@param obj tts__Object Object to move + ---@param pos table New position for the object + ---@param rot table New rotation for the object (optional) + DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) + if obj == nil or pos == nil then return end + + -- search the new position for existing card/deck + local searchResult = searchLib.atPosition(pos, "isCardOrDeck") + + -- get new position + local newPos + local offset = 0.5 + if #searchResult == 1 then + local bounds = searchResult[1].getBounds() + newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) + else + newPos = Vector(pos) + Vector(0, offset, 0) + end + + -- allow moving the objects smoothly out of the hand + obj.use_hands = false + + if rot then + obj.setRotationSmooth(rot, false, true) + end + obj.setPositionSmooth(newPos, false, true) + + -- continue if the card stops smooth moving + Wait.condition( + function() + obj.use_hands = true + -- this avoids a TTS bug that merges unrelated cards that are not resting + if #searchResult == 1 and searchResult[1] ~= obj then + -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) + pcall(function() searchResult[1].putObject(obj) end) + end + end, + function() return not obj.isSmoothMoving() end, 3) + end + + return DeckLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/MythosArea") +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + end + + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } + + local TokenChecker = {} + + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true + else + return false + end + end + + return TokenChecker +end +end) +__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenSpawnTracker = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getSpawnTracker() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + end + + TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) + return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + end + + TokenSpawnTracker.markTokensSpawned = function(cardGuid) + return getSpawnTracker().call("markTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetTokensSpawned = function(cardGuid) + return getSpawnTracker().call("resetTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetAllAssetAndEvents = function() + return getSpawnTracker().call("resetAllAssetAndEvents") + end + + TokenSpawnTracker.resetAllLocations = function() + return getSpawnTracker().call("resetAllLocations") + end + + TokenSpawnTracker.resetAll = function() + return getSpawnTracker().call("resetAll") + end + + return TokenSpawnTracker +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("core/MythosArea", function(require, _LOADED, __bundle_register, __bundle_modules) local deckLib = require("util/DeckLib") local guidReferenceApi = require("core/GUIDReferenceApi") @@ -63,6 +421,7 @@ local ENCOUNTER_DISCARD_AREA = { local ENCOUNTER_DECK_POS = { x = -3.93, y = 1, z = 5.76 } local ENCOUNTER_DISCARD_POSITION = { x = -3.85, y = 1, z = 10.38 } local isReshuffling = false +local collisionEnabled = false local currentScenario, useFrontData, tokenData local TRASH, DATA_HELPER @@ -75,6 +434,8 @@ function onLoad(saveState) end TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") + + Wait.time(function() collisionEnabled = true end, 0.1) end function onSave() @@ -91,8 +452,14 @@ end -- TTS event handler. Handles scenario name event triggering and encounter card token resets. function onCollisionEnter(collisionInfo) + if not collisionEnabled then return end + local object = collisionInfo.collision_object + -- early exit for better performance + if object.type ~= "Card" then return end + + -- get scenario name and maybe fire followup event if object.getName() == "Scenario" then local description = object.getDescription() @@ -116,7 +483,7 @@ function onCollisionEnter(collisionInfo) local localPos = self.positionToLocal(object.getPosition()) if inArea(localPos, ENCOUNTER_DECK_AREA) or inArea(localPos, ENCOUNTER_DISCARD_AREA) then - tokenSpawnTrackerApi.resetTokensSpawned(object.getGUID()) + Wait.frames(function() tokenSpawnTrackerApi.resetTokensSpawned(object.getGUID()) end, 1) removeTokensFromObject(object) end end @@ -244,9 +611,9 @@ end --------------------------------------------------------- -- Simple method to check if the given point is in a specified area ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within ----@return Boolean: True if the point is in the area defined by bounds +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within +---@return boolean: True if the point is in the area defined by bounds function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -275,8 +642,8 @@ do local guidReferenceApi = require("core/GUIDReferenceApi") -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass local function callIfExistent(functionName, argument) local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") if tokenArranger ~= nil then @@ -285,7 +652,7 @@ do end -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata + ---@param fullData table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -303,362 +670,4 @@ do return TokenArrangerApi end end) -__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local DeckLib = {} - local searchLib = require("util/SearchLib") - - -- places a card/deck at a position or merges into an existing deck - ---@param obj TTSObject Object to move - ---@param pos Table New position for the object - ---@param rot Table New rotation for the object (optional) - DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) - if obj == nil or pos == nil then return end - - -- search the new position for existing card/deck - local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - - -- get new position - local newPos - local offset = 0.5 - if #searchResult == 1 then - local bounds = searchResult[1].getBounds() - newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) - else - newPos = Vector(pos) + Vector(0, offset, 0) - end - - -- allow moving the objects smoothly out of the hand - obj.use_hands = false - - if rot then - obj.setRotationSmooth(rot, false, true) - end - obj.setPositionSmooth(newPos, false, true) - - -- continue if the card stops smooth moving - Wait.condition( - function() - obj.use_hands = true - -- this avoids a TTS bug that merges unrelated cards that are not resting - if #searchResult == 1 and searchResult[1] ~= obj then - -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) - pcall(function() searchResult[1].putObject(obj) end) - end - end, - function() return not obj.isSmoothMoving() end, 3) - end - - return DeckLib -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/MythosArea") -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") - end - - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") - end - - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") - end - - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) - end - - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) - end - - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true - } - - local TokenChecker = {} - - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true - else - return false - end - end - - return TokenChecker -end -end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenSpawnTracker = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") - end - - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) - end - - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") - end - - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") - end - - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") - end - - return TokenSpawnTracker -end -end) return __bundle_require("__root") diff --git a/unpacked/Custom_Tile Player Cards 2d30ee.ttslua b/unpacked/Custom_Tile Player Cards 2d30ee.ttslua index 84f0b6e99..12e0142ba 100644 --- a/unpacked/Custom_Tile Player Cards 2d30ee.ttslua +++ b/unpacked/Custom_Tile Player Cards 2d30ee.ttslua @@ -41,1029 +41,24 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("playercards/SpawnBag", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/PlayerCardSpawner") - --- Allows spawning of defined lists of cards which will be created from the template in the All --- Player Cards bag. SpawnBag.spawn will create objects based on a table definition, while --- SpawnBag.recall will clean them all up. Recall will be limited to a small area around the --- spawned objects. Objects moved out of this area will not be cleaned up. --- --- SpawnSpec: Spawning requires a spawn specification with the following structure: --- { --- name: Name of this spawn content, used for internal tracking. Multiple specs can be spawned, --- but each requires a separate name --- cards: A list of card IDs to be spawned --- globalPos: Where the spawned objects should be placed, in global coordinates. This should be --- a valid Vector with x, y, and z defined, e.g. { x = 5, y = 1, z = 15 } --- rotation: Rotation for the spawned objects. X=180 should be used for face down items. As with --- globalPos, this should be a valid Vector with x, y, and z defined --- spread: Optional Boolean. If present and true, cards will be spawned next to each other in a --- spread moving to the right. globalPos will define the location of the first card, each --- after that will be moved a predefined distance --- spreadCols: Optional integer. If spread is true, specifies the maximum columns cards will be --- laid out in before starting a new row. If spread is true but spreadCols is not set, all --- cards will be in a single row (however long that may be) --- } --- See BondedBag.ttslua for an example -do - local allCardsBagApi = require("playercards/AllCardsBagApi") - - local SpawnBag = { } - local internal = { } - - -- To assist debugging, will draw a box around the recall zone when it's set up - local SHOW_RECALL_ZONE = false - - -- Distance to expand the recall zone around any added object. - local RECALL_BUFFER_X = 0.9 - local RECALL_BUFFER_Z = 0.5 - - -- In order to mimic the behavior of the previous memory buttons we use a temporary bag when - -- recalling objects. This bag is tiny and transparent, and will be placed at the same location as - -- this object. Once all placed cards are recalled bag to this bag, it will be destroyed - local RECALL_BAG = { - Name = "Bag", - Transform = { - scaleX = 0.01, - scaleY = 0.01, - scaleZ = 0.01, - }, - ColorDiffuse = { - r = 0, - g = 0, - b = 0, - a = 0, - }, - Locked = true, - Grid = true, - Snap = false, - Tooltip = false, - } - - -- Tracks what has been placed by this "bag" so they can be recalled - local placedSpecs = { } - local placedObjectGuids = { } - local recallZone = nil - - -- Loads a table of saved state, extracted during the parent object's onLoad - SpawnBag.loadFromSave = function(saveTable) - placedSpecs = saveTable.placed - placedObjectGuids = saveTable.placedObjects - recallZone = saveTable.recall - end - - -- Generates a table of save state that can be included in the parent object's onSave - SpawnBag.getStateForSave = function() - return { - placed = placedSpecs, - placedObjects = placedObjectGuids, - recall = recallZone, - } - end - - -- Places the given spawnSpec on the table. See SpawnBag.ttslua header for spawnSpec table data and - -- examples - SpawnBag.spawn = function(spawnSpec) - -- Limit to one placement at a time - if (placedSpecs[spawnSpec.name]) then - return - end - if (spawnSpec == nil) then - -- TODO: error here - return - end - local cardsToSpawn = { } - local cardList = spawnSpec.cards - for _, cardId in ipairs(cardList) do - local cardData = allCardsBagApi.getCardById(cardId) - if (cardData ~= nil) then - table.insert(cardsToSpawn, cardData) - else - -- TODO: error here - end - end - if (spawnSpec.spread) then - Spawner.spawnCardSpread(cardsToSpawn, spawnSpec.globalPos, spawnSpec.spreadCols or 9999, spawnSpec.rotation, false, internal.recordPlacedObject) - else - -- TTS decks come out in reverse order of the cards, reverse the list so the input order stays - -- This only applies for decks; spreads are spawned by us in the order given - if spawnSpec.rotation.z ~= 180 then - cardsToSpawn = internal.reverseList(cardsToSpawn) - end - Spawner.spawnCards(cardsToSpawn, spawnSpec.globalPos, spawnSpec.rotation, false, internal.recordPlacedObject) - end - placedSpecs[spawnSpec.name] = true - end - - -- Recalls all spawned objects to the bag, and clears the placedObjectGuids list - ---@param fast Boolean. If true, cards will be deleted directly without faking the bag recall. - SpawnBag.recall = function(fast) - if fast then - internal.deleteSpawned() - else - internal.recallSpawned() - end - - -- We've recalled everything we can, some cards may have been moved out of the - -- card area. Just reset at this point. - placedSpecs = { } - placedObjectGuids = { } - recallZone = nil - end - - -- Deleted all spawned cards. - internal.deleteSpawned = function() - for guid, _ in pairs(placedObjectGuids) do - local obj = getObjectFromGUID(guid) - if (obj ~= nil) then - if (internal.isInRecallZone(obj)) then - obj.destruct() - end - placedObjectGuids[guid] = nil - end - end - end - - -- Recalls spawned cards with a fake bag that replicates the memory bag recall style. - internal.recallSpawned = function() - local trash = spawnObjectData({data = RECALL_BAG, position = self.getPosition()}) - for guid, _ in pairs(placedObjectGuids) do - local obj = getObjectFromGUID(guid) - if (obj ~= nil) then - if (internal.isInRecallZone(obj)) then - trash.putObject(obj) - end - placedObjectGuids[guid] = nil - end - end - - trash.destruct() - end - - - -- Callback for when an object has been spawned. Tracks the object for later recall and updates the - -- recall zone. - internal.recordPlacedObject = function(spawned) - placedObjectGuids[spawned.getGUID()] = true - internal.expandRecallZone(spawned) - end - - -- Expands the current recall zone based on the position of the given object. The recall zone will - -- be maintained as the bounding box of the extreme object positions, plus a small amount of buffer - internal.expandRecallZone = function(spawnedCard) - local pos = spawnedCard.getPosition() - if (recallZone == nil) then - -- First card out of the bag, initialize surrounding that - recallZone = { } - recallZone.upperLeft = { x = pos.x + RECALL_BUFFER_X, z = pos.z + RECALL_BUFFER_Z } - recallZone.lowerRight = { x = pos.x - RECALL_BUFFER_X, z = pos.z - RECALL_BUFFER_Z } - return - else - if (pos.x > recallZone.upperLeft.x) then - recallZone.upperLeft.x = pos.x + RECALL_BUFFER_X - end - if (pos.x < recallZone.lowerRight.x) then - recallZone.lowerRight.x = pos.x - RECALL_BUFFER_X - end - if (pos.z > recallZone.upperLeft.z) then - recallZone.upperLeft.z = pos.z + RECALL_BUFFER_Z - end - if (pos.z < recallZone.lowerRight.z) then - recallZone.lowerRight.z = pos.z - RECALL_BUFFER_Z - end - end - if (SHOW_RECALL_ZONE) then - local y = 1.5 - local thick = 0.05 - Global.setVectorLines({ - { - points = { {recallZone.upperLeft.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.lowerRight.z} }, - color = {1,0,0}, - thickness = thick, - rotation = {0,0,0}, - }, - { - points = { {recallZone.upperLeft.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.lowerRight.z} }, - color = {1,0,0}, - thickness = thick, - rotation = {0,0,0}, - }, - { - points = { {recallZone.lowerRight.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.upperLeft.z} }, - color = {1,0,0}, - thickness = thick, - rotation = {0,0,0}, - }, - { - points = { {recallZone.lowerRight.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.upperLeft.z} }, - color = {1,0,0}, - thickness = thick, - rotation = {0,0,0}, - }, - }) - end - end - - -- Checks to see if the given object is in the current recall zone. If there isn't a recall zone, - -- will return true so that everything can be easily cleaned up. - internal.isInRecallZone = function(obj) - if (recallZone == nil) then - return true - end - local pos = obj.getPosition() - return (pos.x < recallZone.upperLeft.x and pos.x > recallZone.lowerRight.x - and pos.z < recallZone.upperLeft.z and pos.z > recallZone.lowerRight.z) - end - - internal.reverseList = function(list) - local reversed = { } - for i = 1, #list do - reversed[i] = list[#list - i + 1] - end - - return reversed - end - - return SpawnBag -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/PlayerCardPanel") end) -__bundle_register("playercards/PlayerCardPanel", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/PlayerCardPanelData") - -local allCardsBagApi = require("playercards/AllCardsBagApi") -local arkhamDb = require("arkhamdb/ArkhamDb") -local spawnBag = require("playercards/SpawnBag") - --- Size and position information for the three rows of class buttons -local CIRCLE_BUTTON_SIZE = 250 -local CLASS_BUTTONS_X_OFFSET = 0.1325 -local INVESTIGATOR_ROW_START = Vector(0.125, 0.1, -0.447) -local LEVEL_ZERO_ROW_START = Vector(0.125, 0.1, -0.007) -local UPGRADED_ROW_START = Vector(0.125, 0.1, 0.333) - --- Size and position information for the two blocks of other buttons -local MISC_BUTTONS_X_OFFSET = 0.155 -local WEAKNESS_ROW_START = Vector(0.157, 0.1, 0.666) -local OTHER_ROW_START = Vector(0.605, 0.1, 0.666) - --- Size and position information for the Cycle (box) buttons -local CYCLE_BUTTON_SIZE = 468 -local CYCLE_BUTTON_START = Vector(-0.716, 0.1, -0.39) -local CYCLE_COLUMN_COUNT = 3 -local CYCLE_BUTTONS_X_OFFSET = 0.267 -local CYCLE_BUTTONS_Z_OFFSET = 0.2665 - -local STARTER_DECK_MODE_SELECTED_COLOR = { 0.2, 0.2, 0.2, 0.8 } -local TRANSPARENT = { 0, 0, 0, 0 } -local STARTER_DECK_MODE_STARTERS = "starters" -local STARTER_DECK_MODE_CARDS_ONLY = "cards" - -local FACE_UP_ROTATION = { x = 0, y = 270, z = 0} -local FACE_DOWN_ROTATION = { x = 0, y = 270, z = 180} - --- ---------- IMPORTANT ---------- --- Coordinates defined below are in global dimensions relative to the panel - DO NOT USE THESE --- DIRECTLY. Call scalePositions() before use, and reference the variables below - --- Layout width for a single card, in global coordinate space -local CARD_WIDTH = 2.3 - --- Coordinates to begin laying out cards. These vary based on the cards that are being placed by --- considering the width of the cards, number of cards, and desired spread intervals. --- IMPORTANT! Because of the mix of global card sizes and relative-to-scale positions, the X and Y --- coordinates on these provide global disances while the Z is local. -local START_POSITIONS = { - classCards = Vector(CARD_WIDTH * 9.5, 2, 1.4), - investigator = Vector(6 * 2.5, 2, 1.3), - cycle = Vector(CARD_WIDTH * 9.5, 2, 2.4), - other = Vector(CARD_WIDTH * 9.5, 2, 1.4), - randomWeakness = Vector(0, 2, 1.4), - -- Because the card spread is handled by the SpawnBag, we don't know (programatically) where this - -- should be placed. If more customizable cards are added it will need to be moved. - summonedServitor = Vector(CARD_WIDTH * -7.5, 2, 1.7), -} - --- Shifts to move rows of cards, and groups of rows, as different groupings are laid out -local CARD_ROW_OFFSET = 3.7 -local CARD_GROUP_OFFSET = 2 - --- Position offsets for investigator decks in investigator mode, defines the spacing for how the --- rows and columns are laid out -local INVESTIGATOR_POSITION_SHIFT_ROW = Vector(0, 0, 11) -local INVESTIGATOR_POSITION_SHIFT_COL = Vector(-6, 0, 0) -local INVESTIGATOR_MAX_COLS = 6 - --- Positions relative to the minicard to place other stacks. Both signature card piles and starter --- decks use SIGNATURE_OFFSET -local INVESTIGATOR_CARD_OFFSET = Vector(0, 0, 2.55) -local INVESTIGATOR_SIGNATURE_OFFSET = Vector(0, 0, 5.75) - --- USE THESE! Positions and offset shifts accounting for the scale of the panel -local startPositions -local cardRowOffset -local cardGroupOffset -local investigatorPositionShiftRow -local investigatorPositionShiftCol -local investigatorCardOffset -local investigatorSignatureOffset - -local CLASS_LIST = { "Guardian", "Seeker", "Rogue", "Mystic", "Survivor", "Neutral" } -local CYCLE_LIST = { - "Core", - "The Dunwich Legacy", - "The Path to Carcosa", - "The Forgotten Age", - "The Circle Undone", - "The Dream-Eaters", - "The Innsmouth Conspiracy", - "Edge of the Earth", - "The Scarlet Keys", - "The Feast of Hemlock Vale", - "Investigator Packs" -} - -local excludedNonBasicWeaknesses - -local starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY -local helpVisibleToPlayers = { } - -function onSave() - local saveState = { - spawnBagState = spawnBag.getStateForSave(), - } - return JSON.encode(saveState) -end - -function onLoad(savedData) - arkhamDb.initialize() - if (savedData ~= nil) then - local saveState = JSON.decode(savedData) or { } - if (saveState.spawnBagState ~= nil) then - spawnBag.loadFromSave(saveState.spawnBagState) - end - end - buildExcludedWeaknessList() - createButtons() -end - --- Build a list of non-basic weaknesses which should be excluded from the last weakness set, --- including all signature cards and evolved weaknesses. -function buildExcludedWeaknessList() - excludedNonBasicWeaknesses = { } - for _, investigator in pairs(INVESTIGATORS) do - for _, signatureId in ipairs(investigator.signatures) do - excludedNonBasicWeaknesses[signatureId] = true - end - end - for _, weaknessId in ipairs(EVOLVED_WEAKNESSES) do - excludedNonBasicWeaknesses[weaknessId] = true - end -end - -function createButtons() - createHelpButton() - createInvestigatorButtons() - createLevelZeroButtons() - createUpgradedButtons() - createWeaknessButtons() - createOtherButtons() - createCycleButtons() - createClearButton() - -- Create investigator mode buttons last so the indexes are set when we need to update them - createInvestigatorModeButtons() -end - -function createHelpButton() - self.createButton({ - function_owner = self, - click_function = "toggleHelp", - position = Vector(0.845, 0.1, -0.855), - rotation = Vector(0, 0, 0), - height = 180, - width = 180, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - }) -end - -function createInvestigatorButtons() - local invButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CIRCLE_BUTTON_SIZE, - width = CIRCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = INVESTIGATOR_ROW_START:copy() - for _, class in ipairs(CLASS_LIST) do - invButtonParams.click_function = "spawnInvestigators" .. class - invButtonParams.position = buttonPos - self.createButton(invButtonParams) - buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET - self.setVar(invButtonParams.click_function, function(_, _, _) spawnInvestigatorGroup(class) end) - end -end - -function createLevelZeroButtons() - local l0ButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CIRCLE_BUTTON_SIZE, - width = CIRCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = LEVEL_ZERO_ROW_START:copy() - for _, class in ipairs(CLASS_LIST) do - l0ButtonParams.click_function = "spawnBasic" .. class - l0ButtonParams.position = buttonPos - self.createButton(l0ButtonParams) - buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET - self.setVar(l0ButtonParams.click_function, function(_, _, _) spawnClassCards(class, false) end) - end -end - -function createUpgradedButtons() - local upgradedButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CIRCLE_BUTTON_SIZE, - width = CIRCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = UPGRADED_ROW_START:copy() - for _, class in ipairs(CLASS_LIST) do - upgradedButtonParams.click_function = "spawnUpgraded" .. class - upgradedButtonParams.position = buttonPos - self.createButton(upgradedButtonParams) - buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET - self.setVar(upgradedButtonParams.click_function, function(_, _, _) spawnClassCards(class, true) end) - end -end - -function createWeaknessButtons() - local weaknessButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CIRCLE_BUTTON_SIZE, - width = CIRCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = WEAKNESS_ROW_START:copy() - weaknessButtonParams.click_function = "spawnWeaknesses" - weaknessButtonParams.tooltip = "All Weaknesses" - weaknessButtonParams.position = buttonPos - self.createButton(weaknessButtonParams) - buttonPos.x = buttonPos.x + MISC_BUTTONS_X_OFFSET - weaknessButtonParams.click_function = "spawnRandomWeakness" - weaknessButtonParams.tooltip = "Random Basic Weakness" - weaknessButtonParams.position = buttonPos - self.createButton(weaknessButtonParams) -end - -function createOtherButtons() - local otherButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CIRCLE_BUTTON_SIZE, - width = CIRCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = OTHER_ROW_START:copy() - otherButtonParams.click_function = "spawnBonded" - otherButtonParams.tooltip = "Bonded Cards" - otherButtonParams.position = buttonPos - self.createButton(otherButtonParams) - buttonPos.x = buttonPos.x + MISC_BUTTONS_X_OFFSET - otherButtonParams.click_function = "spawnUpgradeSheets" - otherButtonParams.tooltip = "Customization Upgrade Sheets" - otherButtonParams.position = buttonPos - self.createButton(otherButtonParams) -end - -function createCycleButtons() - local cycleButtonParams = { - function_owner = self, - rotation = Vector(0, 0, 0), - height = CYCLE_BUTTON_SIZE, - width = CYCLE_BUTTON_SIZE, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - } - local buttonPos = CYCLE_BUTTON_START:copy() - local rowCount = 0 - local colCount = 0 - for _, cycle in ipairs(CYCLE_LIST) do - cycleButtonParams.click_function = "spawnCycle" .. cycle - cycleButtonParams.position = buttonPos - cycleButtonParams.tooltip = cycle - self.createButton(cycleButtonParams) - self.setVar(cycleButtonParams.click_function, function(_, _, _) spawnCycle(cycle) end) - colCount = colCount + 1 - -- If we've reached the end of a row, shift down and back to the first column - if colCount >= CYCLE_COLUMN_COUNT then - buttonPos = CYCLE_BUTTON_START:copy() - rowCount = rowCount + 1 - colCount = 0 - buttonPos.z = buttonPos.z + CYCLE_BUTTONS_Z_OFFSET * rowCount - if rowCount == 3 then - -- Account for two centered buttons on the final row - buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET / 2 - --[[ Account for centered button on the final row - buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET - ]] - end - else - buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET - end - end -end - -function createClearButton() - self.createButton({ - function_owner = self, - click_function = "deleteAll", - position = Vector(0, 0.1, 0.852), - rotation = Vector(0, 0, 0), - height = 170, - width = 750, - scale = Vector(0.25, 1, 0.25), - color = TRANSPARENT, - }) -end - -function createInvestigatorModeButtons() - local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS - - self.createButton({ - function_owner = self, - click_function = "setCardsOnlyMode", - position = Vector(0.251, 0.1, -0.322), - rotation = Vector(0, 0, 0), - height = 170, - width = 760, - scale = Vector(0.25, 1, 0.25), - color = starterMode and TRANSPARENT or STARTER_DECK_MODE_SELECTED_COLOR - }) - self.createButton({ - function_owner = self, - click_function = "setStarterDeckMode", - position = Vector(0.66, 0.1, -0.322), - rotation = Vector(0, 0, 0), - height = 170, - width = 760, - scale = Vector(0.25, 1, 0.25), - color = starterMode and STARTER_DECK_MODE_SELECTED_COLOR or TRANSPARENT - }) - local checkX = starterMode and 0.52 or 0.11 - self.createButton({ - function_owner = self, - label = "✓", - click_function = "doNothing", - position = Vector(checkX, 0.11, -0.317), - rotation = Vector(0, 0, 0), - height = 0, - width = 0, - scale = Vector(0.3, 1, 0.3), - font_color = { 0, 0, 0 }, - color = { 1, 1, 1 } - }) -end - -function toggleHelp(_, playerColor, _) - if helpVisibleToPlayers[playerColor] then - helpVisibleToPlayers[playerColor] = nil - else - helpVisibleToPlayers[playerColor] = true - end - updateHelpVisibility() -end - -function updateHelpVisibility() - local visibility = "" - for player, _ in pairs(helpVisibleToPlayers) do - if string.len(visibility) > 0 then - visibility = visibility .. "|" .. player - else - visibility = player - end - end - self.UI.setAttribute("helpText", "visibility", visibility) - self.UI.setAttribute("helpPanel", "visibility", visibility) - self.UI.setAttribute("helpPanel", "active", string.len(visibility) > 0) -end - -function setStarterDeckMode() - starterDeckMode = STARTER_DECK_MODE_STARTERS - updateStarterModeButtons() -end - -function setCardsOnlyMode() - starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY - updateStarterModeButtons() -end - -function updateStarterModeButtons() - local buttonCount = #self.getButtons() - -- Buttons are 0-indexed, so the last three are -1, -2, and -3 from the size - self.removeButton(buttonCount - 1) - self.removeButton(buttonCount - 2) - self.removeButton(buttonCount - 3) - createInvestigatorModeButtons() -end - --- Clears the table and updates positions based on scale. Should be called before ANY card --- placement -function prepareToPlaceCards() - deleteAll() - scalePositions() -end - --- Updates the positions based on the current object scale to ensure the relative layout functions --- properly at different scales. -function scalePositions() - -- Assume scaling is consistent in X and Z dimensions - local scale = 1 / self.getScale().x - startPositions = { } - for key, pos in pairs(START_POSITIONS) do - -- Because a scaled object means a different global size, using global distance for Z results in - -- the cards being closer or farther depending on the scale. Leave the Z values and only scale - -- X and Y - startPositions[key] = Vector(pos) - startPositions[key].x = startPositions[key].x * scale - startPositions[key].y = startPositions[key].y * scale - end - cardRowOffset = CARD_ROW_OFFSET * scale - cardGroupOffset = CARD_GROUP_OFFSET * scale - investigatorPositionShiftRow = Vector(INVESTIGATOR_POSITION_SHIFT_ROW):scale(scale) - investigatorPositionShiftCol = Vector(INVESTIGATOR_POSITION_SHIFT_COL):scale(scale) - investigatorCardOffset = Vector(INVESTIGATOR_CARD_OFFSET):scale(scale) - investigatorSignatureOffset = Vector(INVESTIGATOR_SIGNATURE_OFFSET):scale(scale) -end - --- Deletes all cards currently placed on the table -function deleteAll() - spawnBag.recall(true) -end - --- Spawn an investigator group, based on the current UI setting for either investigators or starter --- decks. ----@param groupName String. Name of the group to spawn, matching a key in InvestigatorPanelData -function spawnInvestigatorGroup(groupName) - local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS - prepareToPlaceCards() - Wait.frames(function() - if starterMode then - spawnStarters(groupName) - else - spawnInvestigators(groupName) - end - end, 2) -end - --- Spawn cards for all investigators in the given group. This creates piles for all defined --- investigator cards and minicards as well as the signature cards. ----@param groupName String. Name of the group to spawn, matching a key in InvestigatorPanelData -function spawnInvestigators(groupName) - if INVESTIGATOR_GROUPS[groupName] == nil then - printToAll("No " .. groupName .. " data yet") - return - end - - local col = 1 - local row = 1 - local investigatorCount = #INVESTIGATOR_GROUPS[groupName] - local position = getInvestigatorRowStartPos(investigatorCount, row) - - for i, investigatorName in ipairs(INVESTIGATOR_GROUPS[groupName]) do - for _, spawnSpec in ipairs(buildInvestigatorSpawnSpec(investigatorName, INVESTIGATORS[investigatorName], position)) do - spawnBag.spawn(spawnSpec) - end - position:add(investigatorPositionShiftCol) - col = col + 1 - if col > INVESTIGATOR_MAX_COLS then - col = 1 - row = row + 1 - position = getInvestigatorRowStartPos(investigatorCount, row) - end - end -end - -function getInvestigatorRowStartPos(investigatorCount, row) - local rowStart = Vector(startPositions.investigator) - rowStart:add(Vector( - investigatorPositionShiftRow.x * (row - 1), - investigatorPositionShiftRow.y * (row - 1), - investigatorPositionShiftRow.z * (row - 1))) - local investigatorsInRow = - math.min(investigatorCount - INVESTIGATOR_MAX_COLS * (row - 1), INVESTIGATOR_MAX_COLS) - rowStart:add(Vector( - investigatorPositionShiftCol.x * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, - investigatorPositionShiftCol.y * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, - investigatorPositionShiftCol.z * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2)) - - return rowStart -end - --- Creates the spawn spec for the investigator's signature cards. ----@param investigatorName String. Name of the investigator, matching a key in ---- InvestigatorPanelData ----@param investigatorData Table. Spawn definition for the investigator, retrieved from ---- INVESTIGATORS ----@param position Vector. Where to spawn the minicard; investigagor cards will be placed below -function buildInvestigatorSpawnSpec(investigatorName, investigatorData, position) - local sigPos = Vector(position):add(investigatorSignatureOffset) - local spawns = buildCommonSpawnSpec(investigatorName, investigatorData, position) - table.insert(spawns, { - name = investigatorName.."signatures", - cards = investigatorData.signatures, - globalPos = self.positionToWorld(sigPos), - rotation = FACE_UP_ROTATION, - }) - - return spawns -end - --- Builds the spawn specs for minicards and investigator cards. These are common enough to be --- shared, and will only differ in whether they spawn the full stack of possible investigator and --- minicards, or only the first of each. ----@param investigatorName String. Name of the investigator, matching a key in ---- InvestigatorPanelData ----@param investigatorData Table. Spawn definition for the investigator, retrieved from ---- INVESTIGATORS ----@param position Vector. Where to spawn the minicard; investigagor cards will be placed below ----@param oneCardOnly Boolean. If true, will spawn only the first card in the investigator card ---- and minicard lists. Otherwise, spawn them all in a deck -function buildCommonSpawnSpec(investigatorName, investigatorData, position, oneCardOnly) - local cardPos = Vector(position):add(investigatorCardOffset) - return { - { - name = investigatorName.."minicards", - cards = oneCardOnly and { investigatorData.minicards[1] } or investigatorData.minicards, - globalPos = self.positionToWorld(position), - rotation = FACE_UP_ROTATION, - }, - { - name = investigatorName.."cards", - cards = oneCardOnly and { investigatorData.cards[1] } or investigatorData.cards, - globalPos = self.positionToWorld(cardPos), - rotation = FACE_UP_ROTATION, - }, - } -end - --- Spawns all starter decks (single minicard and investigator card, plus the starter deck) for --- investigators in the given group. ----@param groupName String. Name of the group to spawn, matching a key in InvestigatorPanelData -function spawnStarters(groupName) - local col = 1 - local row = 1 - local investigatorCount = #INVESTIGATOR_GROUPS[groupName] - local position = getInvestigatorRowStartPos(investigatorCount, row) - for _, investigatorName in ipairs(INVESTIGATOR_GROUPS[groupName]) do - spawnStarterDeck(investigatorName, INVESTIGATORS[investigatorName], position) - position:add(investigatorPositionShiftCol) - col = col + 1 - if col > INVESTIGATOR_MAX_COLS then - col = 1 - row = row + 1 - position = getInvestigatorRowStartPos(investigatorCount, row) - end - end -end - --- Spawns the defined starter deck for the given investigator's. ----@param investigatorName String. Name of the investigator, matching a key in ---- InvestigatorPanelData -function spawnStarterDeck(investigatorName, investigatorData, position) - for _, spawnSpec in ipairs( - buildCommonSpawnSpec(investigatorName, INVESTIGATORS[investigatorName], position, true)) do - spawnBag.spawn(spawnSpec) - end - local deckPos = Vector(position):add(investigatorSignatureOffset) - arkhamDb.getDecklist("None", investigatorData.starterDeck, true, false, false, function(slots) - local cardIdList = { } - for id, count in pairs(slots) do - for i = 1, count do - table.insert(cardIdList, id) - end - end - spawnBag.spawn({ - name = investigatorName.."starter", - cards = cardIdList, - globalPos = self.positionToWorld(deckPos), - rotation = FACE_DOWN_ROTATION - }) - end) -end --- Clears the currently placed cards, then places cards for the given class and level spread ----@param cardClass String. Class to place ("Guardian", "Seeker", etc) ----@param isUpgraded Boolean. If true, spawn the Level 1-5 cards. Otherwise, Level 0. -function spawnClassCards(cardClass, isUpgraded) - prepareToPlaceCards() - Wait.frames(function() placeClassCards(cardClass, isUpgraded) end, 2) -end - --- Spawn the class cards. ----@param cardClass String. Class to place ("Guardian", "Seeker", etc) ----@param isUpgraded Boolean. If true, spawn the Level 1-5 cards. Otherwise, Level 0. -function placeClassCards(cardClass, isUpgraded) - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end - local cardIdList = allCardsBagApi.getCardsByClassAndLevel(cardClass, isUpgraded) - - local skillList = { } - local eventList = { } - local assetList = { } - for _, cardId in ipairs(cardIdList) do - local cardMetadata = allCardsBagApi.getCardById(cardId).metadata - if (cardMetadata.type == "Skill") then - table.insert(skillList, cardId) - elseif (cardMetadata.type == "Event") then - table.insert(eventList, cardId) - elseif (cardMetadata.type == "Asset") then - table.insert(assetList, cardId) - end - end - local groupPos = Vector(startPositions.classCards) - if #skillList > 0 then - spawnBag.spawn({ - name = cardClass .. (isUpgraded and "upgraded" or "basic"), - cards = skillList, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - groupPos.z = groupPos.z + math.ceil(#skillList / 20) * cardRowOffset + cardGroupOffset - end - if #eventList > 0 then - spawnBag.spawn({ - name = cardClass .. "event" .. (isUpgraded and "upgraded" or "basic"), - cards = eventList, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - groupPos.z = groupPos.z + math.ceil(#eventList / 20) * cardRowOffset + cardGroupOffset - end - if #assetList > 0 then - spawnBag.spawn({ - name = cardClass .. "asset" .. (isUpgraded and "upgraded" or "basic"), - cards = assetList, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - end -end - --- Spawns the investigator sets and all cards for the given cycle ----@param cycle String Name of a cycle, should match the standard used in card metadata -function spawnCycle(cycle) - prepareToPlaceCards() - spawnInvestigators(cycle) - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end - local cycleCardList = allCardsBagApi.getCardsByCycle(cycle) - local copiedList = { } - for i, id in ipairs(cycleCardList) do - copiedList[i] = id - end - spawnBag.spawn({ - name = "cycle"..cycle, - cards = copiedList, - globalPos = self.positionToWorld(startPositions.cycle), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) -end - -function spawnBonded() - prepareToPlaceCards() - spawnBag.spawn({ - name = "bonded", - cards = BONDED_CARD_LIST, - globalPos = self.positionToWorld(startPositions.classCards), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) -end - -function spawnUpgradeSheets() - prepareToPlaceCards() - spawnBag.spawn({ - name = "upgradeSheets", - cards = UPGRADE_SHEET_LIST, - globalPos = self.positionToWorld(startPositions.classCards), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - spawnBag.spawn({ - name = "servitor", - cards = { "09080-m" }, - globalPos = self.positionToWorld(startPositions.summonedServitor), - rotation = FACE_UP_ROTATION, - }) -end - --- Clears the current cards, and places all basic weaknesses on the table. -function spawnWeaknesses() - prepareToPlaceCards() - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end - local weaknessIdList = allCardsBagApi.getUniqueWeaknesses() - local basicWeaknessList = { } - local otherWeaknessList = { } - for i, id in ipairs(weaknessIdList) do - local cardMetadata = allCardsBagApi.getCardById(id).metadata - if cardMetadata.basicWeaknessCount ~= nil and cardMetadata.basicWeaknessCount > 0 then - table.insert(basicWeaknessList, id) - elseif excludedNonBasicWeaknesses[id] == nil then - table.insert(otherWeaknessList, id) - end - end - local groupPos = Vector(startPositions.classCards) - spawnBag.spawn({ - name = "basicWeaknesses", - cards = basicWeaknessList, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - groupPos.z = groupPos.z + math.ceil(#basicWeaknessList / 20) * cardRowOffset + cardGroupOffset - spawnBag.spawn({ - name = "evolvedWeaknesses", - cards = EVOLVED_WEAKNESSES, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) - groupPos.z = groupPos.z + math.ceil(#EVOLVED_WEAKNESSES / 20) * cardRowOffset + cardGroupOffset - spawnBag.spawn({ - name = "otherWeaknesses", - cards = otherWeaknessList, - globalPos = self.positionToWorld(groupPos), - rotation = FACE_UP_ROTATION, - spread = true, - spreadCols = 20 - }) -end - -function spawnRandomWeakness() - prepareToPlaceCards() - local weaknessId = allCardsBagApi.getRandomWeaknessId() - if (weaknessId == nil) then - broadcastToAll("All basic weaknesses are in play!", {0.9, 0.2, 0.2}) - return - end - spawnBag.spawn({ - name = "randomWeakness", - cards = { weaknessId }, - globalPos = self.positionToWorld(startPositions.randomWeakness), - rotation = FACE_UP_ROTATION, - }) -end -end) __bundle_register("arkhamdb/ArkhamDb", function(require, _LOADED, __bundle_register, __bundle_modules) do local allCardsBagApi = require("playercards/AllCardsBagApi") local playAreaApi = require("core/PlayAreaApi") + + local ArkhamDb = {} + local internal = {} - local ArkhamDb = { } - local internal = { } + local tabooList = {} + local configuration local RANDOM_WEAKNESS_ID = "01000" - local tabooList = { } - --Forward declaration - ---@type Request + ---@class Request local Request = {} - local configuration -- Sets up the ArkhamDb interface. Should be called from the parent object on load. ArkhamDb.initialize = function() @@ -1071,7 +66,6 @@ do Request.start({ configuration.api_uri, configuration.taboo }, function(status) local json = JSON.decode(internal.fixUtf16String(status.text)) for _, taboo in pairs(json) do - ---@type local cards = {} for _, card in pairs(JSON.decode(taboo.cards)) do @@ -1089,18 +83,19 @@ do -- Start the deck build process for the given player color and deck ID. This -- will retrieve the deck from ArkhamDB, and pass to a callback for processing. - ---@param playerColor String. Color name of the player mat to place this deck on (e.g. "Red"). - ---@param deckId String. ArkhamDB deck id to be loaded - ---@param isPrivate Boolean. Whether this deck is published or private on ArkhamDB - ---@param loadNewest Boolean. Whether the newest version of this deck should be loaded - ---@param loadInvestigators Boolean. Whether investigator cards should be loaded as part of this - --- deck - ---@param callback Function. Callback which will be sent the results of this load. Parameters - --- to the callback will be: - --- slots Table. A map of card ID to count in the deck + ---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red"). + ---@param deckId string ArkhamDB deck id to be loaded + ---@param isPrivate boolean Whether this deck is published or private on ArkhamDB + ---@param loadNewest boolean Whether the newest version of this deck should be loaded + ---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck + ---@param callback function Callback which will be sent the results of this load + --- Parameters to the callback will be: + --- slots table A map of card ID to count in the deck --- investigatorCode String. ID of the investigator in this deck - --- customizations Table. The decoded table of customization upgrades in this deck + --- customizations table The decoded table of customization upgrades in this deck --- playerColor String. Color this deck is being loaded for + ---@return boolean + ---@return string ArkhamDb.getDecklist = function( playerColor, deckId, @@ -1112,16 +107,19 @@ do -- the deck load. The called method will handle player notification. local checkCard = allCardsBagApi.getCardById("01001") if (checkCard ~= nil and checkCard.data == nil) then - return + return false, "Indexing not complete" end - local deckUri = { configuration.api_uri, - isPrivate and configuration.private_deck or configuration.public_deck, deckId } + local deckUri = { + configuration.api_uri, + isPrivate and configuration.private_deck or configuration.public_deck, + deckId + } local deck = Request.start(deckUri, function(status) if string.find(status.text, "") then internal.maybePrint("Private deck ID " .. deckId .. " is not shared", playerColor) - return false, table.concat({ "Private deck ", deckId, " is not shared" }) + return false, "Private deck " .. deckId .. " is not shared" end local json = JSON.decode(status.text) @@ -1139,8 +137,8 @@ do -- Logs that a card could not be loaded in the mod by printing it to the console in the given -- color of the player owning the deck. Attempts to look up the name on ArkhamDB for clarity, -- but prints the card ID if the name cannot be retrieved. - ---@param cardId String. ArkhamDB ID of the card that could not be found - ---@param playerColor String. Color of the player's deck that had the problem + ---@param cardId string ArkhamDB ID of the card that could not be found + ---@param playerColor string Color of the player's deck that had the problem ArkhamDb.logCardNotFound = function(cardId, playerColor) local request = Request.start({ configuration.api_uri, @@ -1154,9 +152,9 @@ do if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then cardName = cardName .. " (" .. adbCardInfo.xp .. ")" end - internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) + internal.maybePrint("Card not found: " .. cardName .. ", card ID " .. cardId, playerColor) else - internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) + internal.maybePrint("Card not found in ArkhamDB/Index, ID " .. cardId, playerColor) end end) end @@ -1165,18 +163,17 @@ do -- response then applies standard transformations to the deck such as adding -- random weaknesses and checking for taboos. Once the deck is processed, -- passes to loadCards to actually spawn the defined deck. - ---@param deck ArkhamImportDeck - ---@param playerColor String Color name of the player mat to place this deck on (e.g. "Red") - ---@param loadNewest Boolean Whether the newest version of this deck should be loaded - ---@param loadInvestigators Boolean Whether investigator cards should be loaded as part of this - --- deck - ---@param callback Function Callback which will be sent the results of this load. Parameters - --- to the callback will be: - --- slots Table. A map of card ID to count in the deck + ---@param deck table ArkhamImportDeck + ---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red") + ---@param loadNewest boolean Whether the newest version of this deck should be loaded + ---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck + ---@param callback function Callback which will be sent the results of this load. + --- Parameters to the callback will be: + --- slots table A map of card ID to count in the deck --- investigatorCode String. ID of the investigator in this deck --- bondedList A table of cardID keys to meaningless values. Card IDs in this list were --- added from a parent bonded card. - --- customizations Table. The decoded table of customization upgrades in this deck + --- customizations table The decoded table of customization upgrades in this deck --- playerColor String. Color this deck is being loaded for internal.onDeckResult = function(deck, playerColor, loadNewest, loadInvestigators, callback) -- Load the next deck in the upgrade path if the option is enabled @@ -1192,12 +189,14 @@ do -- investigator may have bonded cards or taboo entries, and should be present local slots = deck.slots internal.maybeDrawRandomWeakness(slots, playerColor) + + -- handles alternative investigators (parallel, promo or revised art) local loadAltInvestigator = "normal" if loadInvestigators then loadAltInvestigator = internal.addInvestigatorCards(deck, slots) end - - internal.maybeModifyDeckFromDescription(slots, deck.description_md) + + internal.maybeModifyDeckFromDescription(slots, deck.description_md, playerColor) internal.maybeAddSummonedServitor(slots) internal.maybeAddOnTheMend(slots, playerColor) internal.maybeAddRealityAcidReference(slots) @@ -1217,9 +216,9 @@ do -- Checks to see if the slot list includes the random weakness ID. If it does, -- removes it from the deck and replaces it with the ID of a random basic weakness provided by the -- all cards bag - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number --- of those cards which will be spawned - ---@param playerColor String Color of the player this deck is being loaded for. Used for broadcast + ---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast --- if a weakness is added. internal.maybeDrawRandomWeakness = function(slots, playerColor) local randomWeaknessAmount = slots[RANDOM_WEAKNESS_ID] or 0 @@ -1235,14 +234,15 @@ do end -- Adds both the investigator (XXXXX) and minicard (XXXXX-m) slots with one copy each - ---@param deck Table The processed ArkhamDB deck response - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the + ---@param deck table The processed ArkhamDB deck response + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the --- number of those cards which will be spawned ---@return string: Contains the name of the art that should be loaded ("normal", "promo" or "revised") internal.addInvestigatorCards = function(deck, slots) local investigatorId = deck.investigator_code slots[investigatorId .. "-m"] = 1 local deckMeta = JSON.decode(deck.meta) + -- handling alternative investigator art and parallel investigators local loadAltInvestigator = "normal" if deckMeta ~= nil then @@ -1290,7 +290,7 @@ do end -- Process the card list looking for the customizable cards, and add their upgrade sheets if needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddUpgradeSheets = function(slots) for cardId, _ in pairs(slots) do @@ -1304,7 +304,7 @@ do -- Process the card list looking for the Summoned Servitor, and add its minicard to the list if -- needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddSummonedServitor = function(slots) if slots["09080"] ~= nil then @@ -1314,9 +314,9 @@ do -- On the Mend should have 1-per-investigator copies set aside, but ArkhamDB always sends 1. Update -- the count based on the investigator count - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned - ---@param playerColor String Color of the player this deck is being loaded for. Used for broadcast if an error occurs + ---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast if an error occurs internal.maybeAddOnTheMend = function(slots, playerColor) if slots["09006"] ~= nil then local investigatorCount = playAreaApi.getInvestigatorCount() @@ -1330,7 +330,7 @@ do end -- Process the card list looking for Reality Acid and adds the reference sheet when needed - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number -- of those cards which will be spawned internal.maybeAddRealityAcidReference = function(slots) if slots["89004"] ~= nil then @@ -1339,16 +339,16 @@ do end -- Processes the deck description from ArkhamDB and modifies the slot list accordingly - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number - ---@param description String The deck desription from ArkhamDB - internal.maybeModifyDeckFromDescription = function(slots, description) + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number + ---@param description string The deck desription from ArkhamDB + internal.maybeModifyDeckFromDescription = function(slots, description, playerColor) -- check for import instructions local pos = string.find(description, "++SCED import instructions++") if not pos then return end - -- remove everything before instructions (including newline) - local tempStr = string.sub(description, pos + 30) - + -- remove everything before instructions + local tempStr = string.sub(description, pos) + -- parse each line in instructions for line in tempStr:gmatch("([^\n]+)") do -- remove dashes at the start @@ -1357,6 +357,10 @@ do -- remove spaces line = line:gsub("%s", "") + -- remove balanced brackets + line = line:gsub("%b()", "") + line = line:gsub("%b[]", "") + -- get instructor local instructor = "" for word in line:gmatch("%a+:") do @@ -1364,26 +368,42 @@ do break end - if instructor == "" or (instructor ~= "add:" and instructor ~= "remove:") then return end + -- go to the next line if no valid instructor found + if instructor ~= "add:" and instructor ~= "remove:" then + goto nextLine + end -- remove instructor from line line = line:gsub(instructor, "") -- evaluate instructions - local cardIds = {} for str in line:gmatch("([^,]+)") do if instructor == "add:" then slots[str] = (slots[str] or 0) + 1 elseif instructor == "remove:" then - if slots[str] == nil then break end - slots[str] = math.max(slots[str] - 1, 0) + if slots[str] == nil then + internal.maybePrint("Tried to remove card ID " .. str .. ", but didn't find card in deck.", playerColor) + else + slots[str] = math.max(slots[str] - 1, 0) + + -- fully remove cards that have a quantity of 0 + if slots[str] == 0 then + slots[str] = nil + + -- also remove related minicard + slots[str .. "-m"] = nil + end + end end end + + -- jump mark at the end of the loop + ::nextLine:: end end -- Process the slot list and looks for any cards which are bonded to those in the deck. Adds those cards to the slot list. - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned internal.extractBondedCards = function(slots) -- Create a list of bonded cards first so we don't modify slots while iterating local bondedCards = { } @@ -1414,8 +434,8 @@ do end -- Check the deck for cards on its taboo list. If they're found, replace the entry in the slot with the Taboo id (i.e. "XXXX" becomes "XXXX-t") - ---@param tabooId String The deck's taboo ID, taken from the deck response taboo_id field. May be nil, indicating that no taboo list should be used - ---@param slots Table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned + ---@param tabooId string The deck's taboo ID, taken from the deck response taboo_id field. May be nil, indicating that no taboo list should be used + ---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number of those cards which will be spawned internal.checkTaboos = function(tabooId, slots, playerColor) if tabooId then for cardId, _ in pairs(tabooList[tabooId].cards) do @@ -1443,9 +463,9 @@ do end -- Gets the ArkhamDB config info from the configuration object. - ---@return Table. Configuration data + ---@return table: configuration data internal.getConfiguration = function() - local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") + local configuration = getObjectsWithTag("import_configuration_provider")[1].getTable("configuration") printPriority = configuration.priority return configuration end @@ -1456,15 +476,14 @@ do end) end - ---@type Request Request = { is_done = false, is_successful = false } - -- Creates a new instance of a Request. Should not be directly called. Instead use Request.start and Request.deferred. - ---@param uri string - ---@param configure fun(request: Request, status: WebRequestStatus) + -- Creates a new instance of a Request. Should not be directly called. Instead use Request.start() and Request.deferred(). + ---@param uri table + ---@param configure fun(request, status) ---@return Request function Request:new(uri, configure) local this = {} @@ -1477,20 +496,16 @@ do end this.uri = uri - - WebRequest.get(uri, function(status) - configure(this, status) - end) + WebRequest.get(uri, function(status) configure(this, status) end) return this end -- Creates a new request. on_success should set the request's is_done, is_successful, and content variables. -- Deferred should be used when you don't want to set is_done immediately (such as if you want to wait for another request to finish) - ---@param uri string - ---@param on_success fun(request: Request, status: WebRequestStatus, vararg any) - ---@param on_error fun(status: WebRequestStatus)|nil - ---@vararg any[] + ---@param uri table + ---@param on_success fun(request, status, vararg) + ---@param on_error fun(status)|nil ---@return Request function Request.deferred(uri, on_success, on_error, ...) local parameters = table.pack(...) @@ -1507,11 +522,11 @@ do end) end - -- Creates a new request. on_success should return weather the resultant data is as expected, and the processed content of the request. - ---@param uri string - ---@param on_success fun(status: WebRequestStatus, vararg any): boolean, any - ---@param on_error nil|fun(status: WebRequestStatus, vararg any): string - ---@vararg any[] + -- Creates a new request. on_success should return whether the resultant data is as expected, and the processed content of the request. + ---@param uri table + ---@param on_success fun(status, vararg): boolean, any + ---@param on_error nil|fun(status, vararg): string + ---@vararg any ---@return Request function Request.start(uri, on_success, on_error, ...) local parameters = table.pack(...) @@ -1524,17 +539,14 @@ do end ---@param requests Request[] - ---@param on_success fun(content: any[], vararg any[]) - ---@param on_error fun(requests: Request[], vararg any[])|nil + ---@param on_success fun(content: any, vararg: any) + ---@param on_error fun(requests: Request, vararg: any)|nil ---@vararg any function Request.with_all(requests, on_success, on_error, ...) local parameters = table.pack(...) Wait.condition(function() - ---@type any[] local results = {} - - ---@type Request[] local errors = {} for _, request in ipairs(requests) do @@ -1562,7 +574,6 @@ do end) end - ---@param callback fun(content: any, vararg any) function Request:with(callback, ...) local arguments = table.pack(...) Wait.condition(function() @@ -1600,7 +611,7 @@ do -- it will be removed from the list and cannot be selected again until a reload -- occurs or the indexes are rebuilt, which will refresh the list to include all -- weaknesses. - ---@return id String ID of the selected weakness. + ---@return string: ID of the selected weakness. AllCardsBagApi.getRandomWeaknessId = function() return getAllCardsBag().call("getRandomWeaknessId") end @@ -1620,8 +631,8 @@ do -- Searches the bag for cards which match the given name and returns a list. Note that this is -- an O(n) search without index support. It may be slow. - ---@param name String or string fragment to search for names - ---@param exact Boolean Whether the name match should be exact + ---@param name string or string fragment to search for names + ---@param exact boolean Whether the name match should be exact AllCardsBagApi.getCardsByName = function(name, exact) return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) end @@ -1631,9 +642,9 @@ do end -- Returns a list of cards from the bag matching a class and level (0 or upgraded) - ---@param class String class to retrieve ("Guardian", "Seeker", etc) - ---@param upgraded Boolean true for upgraded cards (Level 1-5), false for Level 0 - ---@return: If the indexes are still being constructed, returns an empty table. + ---@param class string class to retrieve ("Guardian", "Seeker", etc) + ---@param upgraded boolean true for upgraded cards (Level 1-5), false for Level 0 + ---@return table: If the indexes are still being constructed, returns an empty table. -- Otherwise, a list of tables, each with the following fields -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata @@ -1670,7 +681,18 @@ BONDED_CARD_LIST = { "06015a", -- Dream-Gate "10006", -- Aetheric Current (Yuggoth) "10007", -- Aetheric Current (Yoth) - "10045" -- Uncanny Growth + "10036", -- Blade of Yoth + "10039", -- Evanescent Ascension + "10045", -- Uncanny Growth + "10063", -- Bianca + "10086", -- Rot + "10087", -- Rot + "10088", -- Rot + "10089", -- Rot + "10090", -- Rot + "10106", -- Keeper of the Key + "10107", -- Servant of Brass + "10134", -- Twilight Diadem } UPGRADE_SHEET_LIST = { @@ -2235,126 +1257,250 @@ INVESTIGATORS["Gloria Goldberg"] = { } ------------------ END INVESTIGATOR DATA DEFINITION ------------------ end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("playercards/SpawnBag", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playercards/PlayerCardSpawner") + +-- Allows spawning of defined lists of cards which will be created from the template in the All +-- Player Cards bag. SpawnBag.spawn will create objects based on a table definition, while +-- SpawnBag.recall will clean them all up. Recall will be limited to a small area around the +-- spawned objects. Objects moved out of this area will not be cleaned up. +-- +-- SpawnSpec: Spawning requires a spawn specification with the following structure: +-- { +-- name: Name of this spawn content, used for internal tracking. Multiple specs can be spawned, +-- but each requires a separate name +-- cards: A list of card IDs to be spawned +-- globalPos: Where the spawned objects should be placed, in global coordinates. This should be +-- a valid Vector with x, y, and z defined, e.g. { x = 5, y = 1, z = 15 } +-- rotation: Rotation for the spawned objects. X=180 should be used for face down items. As with +-- globalPos, this should be a valid Vector with x, y, and z defined +-- spread: Optional Boolean. If present and true, cards will be spawned next to each other in a +-- spread moving to the right. globalPos will define the location of the first card, each +-- after that will be moved a predefined distance +-- spreadCols: Optional integer. If spread is true, specifies the maximum columns cards will be +-- laid out in before starting a new row. If spread is true but spreadCols is not set, all +-- cards will be in a single row (however long that may be) +-- } +-- See BondedBag.ttslua for an example do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local allCardsBagApi = require("playercards/AllCardsBagApi") - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + local SpawnBag = { } + local internal = { } + + -- To assist debugging, will draw a box around the recall zone when it's set up + local SHOW_RECALL_ZONE = false + + -- Distance to expand the recall zone around any added object. + local RECALL_BUFFER_X = 0.9 + local RECALL_BUFFER_Z = 0.5 + + -- In order to mimic the behavior of the previous memory buttons we use a temporary bag when + -- recalling objects. This bag is tiny and transparent, and will be placed at the same location as + -- this object. Once all placed cards are recalled bag to this bag, it will be destroyed + local RECALL_BAG = { + Name = "Bag", + Transform = { + scaleX = 0.01, + scaleY = 0.01, + scaleZ = 0.01, + }, + ColorDiffuse = { + r = 0, + g = 0, + b = 0, + a = 0, + }, + Locked = true, + Grid = true, + Snap = false, + Tooltip = false + } + + -- Tracks what has been placed by this "bag" so they can be recalled + local placedSpecs = { } + local placedObjectGuids = { } + local recallZone = nil + + -- Loads a table of saved state, extracted during the parent object's onLoad + SpawnBag.loadFromSave = function(saveTable) + placedSpecs = saveTable.placed + placedObjectGuids = saveTable.placedObjects + recallZone = saveTable.recall end - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + -- Generates a table of save state that can be included in the parent object's onSave + SpawnBag.getStateForSave = function() + return { + placed = placedSpecs, + placedObjects = placedObjectGuids, + recall = recallZone, + } end - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") + -- Places the given spawnSpec on the table. See comment at the start of the file for spawnSpec table data and examples + SpawnBag.spawn = function(spawnSpec) + -- Limit to one placement at a time + if (placedSpecs[spawnSpec.name]) then + return + end + if (spawnSpec == nil) then + -- TODO: error here + return + end + local cardsToSpawn = { } + local cardList = spawnSpec.cards + for _, cardId in ipairs(cardList) do + local cardData = allCardsBagApi.getCardById(cardId) + if (cardData ~= nil) then + table.insert(cardsToSpawn, cardData) + else + -- TODO: error here + end + end + if (spawnSpec.spread) then + Spawner.spawnCardSpread(cardsToSpawn, spawnSpec.globalPos, spawnSpec.spreadCols or 9999, spawnSpec.rotation, false, internal.recordPlacedObject) + else + -- TTS decks come out in reverse order of the cards, reverse the list so the input order stays + -- This only applies for decks; spreads are spawned by us in the order given + if spawnSpec.rotation.z ~= 180 then + cardsToSpawn = internal.reverseList(cardsToSpawn) + end + Spawner.spawnCards(cardsToSpawn, spawnSpec.globalPos, spawnSpec.rotation, false, internal.recordPlacedObject) + end + placedSpecs[spawnSpec.name] = true end - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) + -- Recalls all spawned objects to the bag, and clears the placedObjectGuids list + ---@param fast boolean If true, cards will be deleted directly without faking the bag recall. + SpawnBag.recall = function(fast) + if fast then + internal.deleteSpawned() + else + internal.recallSpawned() + end + + -- We've recalled everything we can, some cards may have been moved out of the + -- card area. Just reset at this point. + placedSpecs = { } + placedObjectGuids = { } + recallZone = nil end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + -- Deleted all spawned cards. + internal.deleteSpawned = function() + for guid, _ in pairs(placedObjectGuids) do + local obj = getObjectFromGUID(guid) + if (obj ~= nil) then + if (internal.isInRecallZone(obj)) then + obj.destruct() + end + placedObjectGuids[guid] = nil + end + end end - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + -- Recalls spawned cards with a fake bag that replicates the memory bag recall style. + internal.recallSpawned = function() + local trash = spawnObjectData({data = RECALL_BAG, position = self.getPosition()}) + for guid, _ in pairs(placedObjectGuids) do + local obj = getObjectFromGUID(guid) + if (obj ~= nil) then + if (internal.isInRecallZone(obj)) then + trash.putObject(obj) + end + placedObjectGuids[guid] = nil + end + end + + trash.destruct() end - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + + -- Callback for when an object has been spawned. Tracks the object for later recall and updates the + -- recall zone. + internal.recordPlacedObject = function(spawned) + placedObjectGuids[spawned.getGUID()] = true + internal.expandRecallZone(spawned) end - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + -- Expands the current recall zone based on the position of the given object. The recall zone will + -- be maintained as the bounding box of the extreme object positions, plus a small amount of buffer + internal.expandRecallZone = function(spawnedCard) + local pos = spawnedCard.getPosition() + if (recallZone == nil) then + -- First card out of the bag, initialize surrounding that + recallZone = { } + recallZone.upperLeft = { x = pos.x + RECALL_BUFFER_X, z = pos.z + RECALL_BUFFER_Z } + recallZone.lowerRight = { x = pos.x - RECALL_BUFFER_X, z = pos.z - RECALL_BUFFER_Z } + return + else + if (pos.x > recallZone.upperLeft.x) then + recallZone.upperLeft.x = pos.x + RECALL_BUFFER_X + end + if (pos.x < recallZone.lowerRight.x) then + recallZone.lowerRight.x = pos.x - RECALL_BUFFER_X + end + if (pos.z > recallZone.upperLeft.z) then + recallZone.upperLeft.z = pos.z + RECALL_BUFFER_Z + end + if (pos.z < recallZone.lowerRight.z) then + recallZone.lowerRight.z = pos.z - RECALL_BUFFER_Z + end + end + if (SHOW_RECALL_ZONE) then + local y = 1.5 + local thick = 0.05 + Global.setVectorLines({ + { + points = { {recallZone.upperLeft.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.lowerRight.z} }, + color = {1,0,0}, + thickness = thick, + rotation = {0,0,0} + }, + { + points = { {recallZone.upperLeft.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.lowerRight.z} }, + color = {1,0,0}, + thickness = thick, + rotation = {0,0,0} + }, + { + points = { {recallZone.lowerRight.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.upperLeft.z} }, + color = {1,0,0}, + thickness = thick, + rotation = {0,0,0} + }, + { + points = { {recallZone.lowerRight.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.upperLeft.z} }, + color = {1,0,0}, + thickness = thick, + rotation = {0,0,0} + } + }) + end end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") + -- Checks to see if the given object is in the current recall zone. If there isn't a recall zone, + -- will return true so that everything can be easily cleaned up. + internal.isInRecallZone = function(obj) + if (recallZone == nil) then + return true + end + local pos = obj.getPosition() + return (pos.x < recallZone.upperLeft.x and pos.x > recallZone.lowerRight.x + and pos.z < recallZone.upperLeft.z and pos.z > recallZone.lowerRight.z) end - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) + internal.reverseList = function(list) + local reversed = { } + for i = 1, #list do + reversed[i] = list[#list - i + 1] + end + + return reversed end - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi + return SpawnBag end end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -2365,29 +1511,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -2412,11 +1560,11 @@ Spawner = { } -- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If -- there are different types, the provided callback will be called once for each type as it spawns -- either a card or deck. --- @param cardList: A list of Player Card data structures (data/metadata) --- @param pos Position table where the cards should be spawned (global) --- @param rot Rotation table for the orientation of the spawned cards (global) --- @param sort Boolean, true if this list of cards should be sorted before spawning --- @param callback Function, callback to be called after the card/deck spawns. +---@param cardList table A list of Player Card data structures (data/metadata) +---@param pos tts__Vector table where the cards should be spawned (global) +---@param rot tts__Vector table for the orientation of the spawned cards (global) +---@param sort boolean True if this list of cards should be sorted before spawning +---@param callback? function Callback to be called after the card/deck spawns. Spawner.spawnCards = function(cardList, pos, rot, sort, callback) if (sort) then table.sort(cardList, Spawner.cardComparator) @@ -2438,7 +1586,7 @@ Spawner.spawnCards = function(cardList, pos, rot, sort, callback) -- Spawn each of the three types individually. Each Y position shift accounts for the thickness -- of the spawned deck local position = { x = pos.x, y = pos.y, z = pos.z } - Spawner.spawn(investigatorCards, position, { rot.x, rot.y - 90, rot.z }, callback) + Spawner.spawn(investigatorCards, position, rot, callback) position.y = position.y + (#investigatorCards + #standardCards) * 0.07 Spawner.spawn(standardCards, position, rot, callback) @@ -2479,48 +1627,57 @@ end -- Spawn a specific list of cards. This method is for internal use and should not be called -- directly, use spawnCards instead. ----@param cardList: A list of Player Card data structures (data/metadata) +---@param cardList table A list of Player Card data structures (data/metadata) ---@param pos table Position where the cards should be spawned (global) ---@param rot table Rotation for the orientation of the spawned cards (global) ----@param callback function callback to be called after the card/deck spawns. +---@param callback? function callback to be called after the card/deck spawns. Spawner.spawn = function(cardList, pos, rot, callback) - if (#cardList == 0) then - return - end + if #cardList == 0 then return end + -- Spawn a single card directly - if (#cardList == 1) then + if #cardList == 1 then + -- handle sideways card + if cardList[1].data.SidewaysCard then + rot = { rot.x, rot.y - 90, rot.z } + end spawnObjectData({ data = cardList[1].data, position = pos, rotation = rot, - callback_function = callback, + callback_function = callback }) return end + -- For multiple cards, construct a deck and spawn that local deck = Spawner.buildDeckDataTemplate() + -- Decks won't inherently scale to the cards in them. The card list being spawned should be all -- the same type/size by this point, so use the first card to set the size deck.Transform = { scaleX = cardList[1].data.Transform.scaleX, scaleY = 1, - scaleZ = cardList[1].data.Transform.scaleZ, + scaleZ = cardList[1].data.Transform.scaleZ } + local sidewaysDeck = true for _, spawnCard in ipairs(cardList) do Spawner.addCardToDeck(deck, spawnCard.data) -- set sidewaysDeck to false if any card is not a sideways card sidewaysDeck = (sidewaysDeck and spawnCard.data.SidewaysCard) end - -- set the alt view angle for sideway decks + + -- set the alt view angle for sideways decks if sidewaysDeck then deck.AltLookAngle = { x = 0, y = 180, z = 90 } + rot = { rot.x, rot.y - 90, rot.z } end + spawnObjectData({ data = deck, position = pos, rotation = rot, - callback_function = callback, + callback_function = callback }) end @@ -2532,8 +1689,8 @@ end -- 3. Extract the card's CustomDeck table and add it to the deck. The deck's -- "CustomDeck" field is a list of all CustomDecks used by cards within the -- deck, keyed by the DeckID and referencing the custom deck table ----@param deck: TTS deck data structure to add to ----@param cardData: Data for the card to be inserted +---@param deck table TTS deck data structure to add to +---@param cardData table Data for the card to be inserted Spawner.addCardToDeck = function(deck, cardData) for customDeckId, customDeckData in pairs(cardData.CustomDeck) do if (deck.CustomDeck[customDeckId] == nil) then @@ -2568,7 +1725,7 @@ end -- Create an empty deck data table which can have cards added to it. This -- creates a new table on each call without using metatables or previous -- definitions because we can't be sure that TTS doesn't modify the structure ----@return: Table containing the minimal TTS deck data structure +---@return table deck Table containing the minimal TTS deck data structure Spawner.buildDeckDataTemplate = function() local deck = {} deck.Name = "Deck" @@ -2589,20 +1746,19 @@ Spawner.buildDeckDataTemplate = function() end -- Returns the first ID which does not exist in the given table, starting at startId and increasing --- @param objectTable Table keyed by strings which are numbers --- @param startId First possible ID. --- @return String ID >= startId +---@param objectTable table keyed by strings which are numbers +---@param startId string possible ID. +---@return string id >= startId Spawner.findNextAvailableId = function(objectTable, startId) local id = startId while (objectTable[id] ~= nil) do id = tostring(tonumber(id) + 1) end - return id end -- Get the PBCN (Permanent/Bonded/Customizable/Normal) value from the given metadata. ----@return: 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are +---@return number PBCN 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are -- irrelevant as they provide only grouping and the order between them doesn't matter. Spawner.getpbcn = function(metadata) if metadata.permanent then @@ -2642,4 +1798,856 @@ Spawner.cardComparator = function(card1, card2) end end end) +__bundle_register("playercards/PlayerCardPanel", function(require, _LOADED, __bundle_register, __bundle_modules) +---@diagnostic disable: param-type-mismatch +require("playercards/PlayerCardPanelData") + +local allCardsBagApi = require("playercards/AllCardsBagApi") +local arkhamDb = require("arkhamdb/ArkhamDb") +local spawnBag = require("playercards/SpawnBag") + +-- Size and position information for the three rows of class buttons +local CIRCLE_BUTTON_SIZE = 250 +local CLASS_BUTTONS_X_OFFSET = 0.1325 +local INVESTIGATOR_ROW_START = Vector(0.125, 0.1, -0.447) +local LEVEL_ZERO_ROW_START = Vector(0.125, 0.1, -0.007) +local UPGRADED_ROW_START = Vector(0.125, 0.1, 0.333) + +-- Size and position information for the two blocks of other buttons +local MISC_BUTTONS_X_OFFSET = 0.155 +local WEAKNESS_ROW_START = Vector(0.157, 0.1, 0.666) +local OTHER_ROW_START = Vector(0.605, 0.1, 0.666) + +-- Size and position information for the Cycle (box) buttons +local CYCLE_BUTTON_SIZE = 468 +local CYCLE_BUTTON_START = Vector(-0.716, 0.1, -0.39) +local CYCLE_COLUMN_COUNT = 3 +local CYCLE_BUTTONS_X_OFFSET = 0.267 +local CYCLE_BUTTONS_Z_OFFSET = 0.2665 + +local STARTER_DECK_MODE_SELECTED_COLOR = { 0.2, 0.2, 0.2, 0.8 } +local TRANSPARENT = { 0, 0, 0, 0 } +local STARTER_DECK_MODE_STARTERS = "starters" +local STARTER_DECK_MODE_CARDS_ONLY = "cards" + +local FACE_UP_ROTATION = { x = 0, y = 270, z = 0} +local FACE_DOWN_ROTATION = { x = 0, y = 270, z = 180} + +-- ---------- IMPORTANT ---------- +-- Coordinates defined below are in global dimensions relative to the panel - DO NOT USE THESE +-- DIRECTLY. Call scalePositions() before use, and reference the variables below + +-- Layout width for a single card, in global coordinate space +local CARD_WIDTH = 2.3 + +-- Coordinates to begin laying out cards. These vary based on the cards that are being placed by +-- considering the width of the cards, number of cards, and desired spread intervals. +-- IMPORTANT! Because of the mix of global card sizes and relative-to-scale positions, the X and Y +-- coordinates on these provide global disances while the Z is local. +local START_POSITIONS = { + classCards = Vector(CARD_WIDTH * 9.5, 2, 1.4), + investigator = Vector(6 * 2.5, 2, 1.3), + cycle = Vector(CARD_WIDTH * 9.5, 2, 2.4), + other = Vector(CARD_WIDTH * 9.5, 2, 1.4), + randomWeakness = Vector(0, 2, 1.4), + -- Because the card spread is handled by the SpawnBag, we don't know (programatically) where this + -- should be placed. If more customizable cards are added it will need to be moved. + summonedServitor = Vector(CARD_WIDTH * -7.5, 2, 1.7) +} + +-- Shifts to move rows of cards, and groups of rows, as different groupings are laid out +local CARD_ROW_OFFSET = 3.7 +local CARD_GROUP_OFFSET = 2 + +-- Position offsets for investigator decks in investigator mode, defines the spacing for how the +-- rows and columns are laid out +local INVESTIGATOR_POSITION_SHIFT_ROW = Vector(0, 0, 11) +local INVESTIGATOR_POSITION_SHIFT_COL = Vector(-6, 0, 0) +local INVESTIGATOR_MAX_COLS = 6 + +-- Positions relative to the minicard to place other stacks. Both signature card piles and starter +-- decks use SIGNATURE_OFFSET +local INVESTIGATOR_CARD_OFFSET = Vector(0, 0, 2.55) +local INVESTIGATOR_SIGNATURE_OFFSET = Vector(0, 0, 5.75) + +-- USE THESE! Positions and offset shifts accounting for the scale of the panel +local startPositions +local cardRowOffset +local cardGroupOffset +local investigatorPositionShiftRow +local investigatorPositionShiftCol +local investigatorCardOffset +local investigatorSignatureOffset + +local CLASS_LIST = { "Guardian", "Seeker", "Rogue", "Mystic", "Survivor", "Neutral" } +local CYCLE_LIST = { + "Core", + "The Dunwich Legacy", + "The Path to Carcosa", + "The Forgotten Age", + "The Circle Undone", + "The Dream-Eaters", + "The Innsmouth Conspiracy", + "Edge of the Earth", + "The Scarlet Keys", + "The Feast of Hemlock Vale", + "Investigator Packs" +} + +local excludedNonBasicWeaknesses + +local starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY +local helpVisibleToPlayers = { } + +function onSave() + return JSON.encode({ spawnBagState = spawnBag.getStateForSave() }) +end + +function onLoad(savedData) + arkhamDb.initialize() + if (savedData ~= nil) then + local saveState = JSON.decode(savedData) or { } + if (saveState.spawnBagState ~= nil) then + spawnBag.loadFromSave(saveState.spawnBagState) + end + end + buildExcludedWeaknessList() + createButtons() +end + +-- Build a list of non-basic weaknesses which should be excluded from the last weakness set, +-- including all signature cards and evolved weaknesses. +function buildExcludedWeaknessList() + excludedNonBasicWeaknesses = { } + for _, investigator in pairs(INVESTIGATORS) do + for _, signatureId in ipairs(investigator.signatures) do + excludedNonBasicWeaknesses[signatureId] = true + end + end + for _, weaknessId in ipairs(EVOLVED_WEAKNESSES) do + excludedNonBasicWeaknesses[weaknessId] = true + end +end + +function createButtons() + createHelpButton() + createInvestigatorButtons() + createLevelZeroButtons() + createUpgradedButtons() + createWeaknessButtons() + createOtherButtons() + createCycleButtons() + createClearButton() + -- Create investigator mode buttons last so the indexes are set when we need to update them + createInvestigatorModeButtons() +end + +function createHelpButton() + self.createButton({ + function_owner = self, + click_function = "toggleHelp", + position = Vector(0.845, 0.1, -0.855), + height = 180, + width = 180, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + }) +end + +function createInvestigatorButtons() + local invButtonParams = { + function_owner = self, + height = CIRCLE_BUTTON_SIZE, + width = CIRCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = INVESTIGATOR_ROW_START:copy() + for _, class in ipairs(CLASS_LIST) do + invButtonParams.click_function = "spawnInvestigators" .. class + invButtonParams.position = buttonPos + self.createButton(invButtonParams) + buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET + self.setVar(invButtonParams.click_function, function(_, _, _) spawnInvestigatorGroup(class) end) + end +end + +function createLevelZeroButtons() + local l0ButtonParams = { + function_owner = self, + height = CIRCLE_BUTTON_SIZE, + width = CIRCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = LEVEL_ZERO_ROW_START:copy() + for _, class in ipairs(CLASS_LIST) do + l0ButtonParams.click_function = "spawnBasic" .. class + l0ButtonParams.position = buttonPos + self.createButton(l0ButtonParams) + buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET + self.setVar(l0ButtonParams.click_function, function(_, _, _) spawnClassCards(class, false) end) + end +end + +function createUpgradedButtons() + local upgradedButtonParams = { + function_owner = self, + height = CIRCLE_BUTTON_SIZE, + width = CIRCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = UPGRADED_ROW_START:copy() + for _, class in ipairs(CLASS_LIST) do + upgradedButtonParams.click_function = "spawnUpgraded" .. class + upgradedButtonParams.position = buttonPos + self.createButton(upgradedButtonParams) + buttonPos.x = buttonPos.x + CLASS_BUTTONS_X_OFFSET + self.setVar(upgradedButtonParams.click_function, function(_, _, _) spawnClassCards(class, true) end) + end +end + +function createWeaknessButtons() + local weaknessButtonParams = { + function_owner = self, + height = CIRCLE_BUTTON_SIZE, + width = CIRCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = WEAKNESS_ROW_START:copy() + weaknessButtonParams.click_function = "spawnWeaknesses" + weaknessButtonParams.tooltip = "All Weaknesses" + weaknessButtonParams.position = buttonPos + self.createButton(weaknessButtonParams) + buttonPos.x = buttonPos.x + MISC_BUTTONS_X_OFFSET + weaknessButtonParams.click_function = "spawnRandomWeakness" + weaknessButtonParams.tooltip = "Random Basic Weakness" + weaknessButtonParams.position = buttonPos + self.createButton(weaknessButtonParams) +end + +function createOtherButtons() + local otherButtonParams = { + function_owner = self, + height = CIRCLE_BUTTON_SIZE, + width = CIRCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = OTHER_ROW_START:copy() + otherButtonParams.click_function = "spawnBonded" + otherButtonParams.tooltip = "Bonded Cards" + otherButtonParams.position = buttonPos + self.createButton(otherButtonParams) + buttonPos.x = buttonPos.x + MISC_BUTTONS_X_OFFSET + otherButtonParams.click_function = "spawnUpgradeSheets" + otherButtonParams.tooltip = "Customization Upgrade Sheets" + otherButtonParams.position = buttonPos + self.createButton(otherButtonParams) +end + +function createCycleButtons() + local cycleButtonParams = { + function_owner = self, + height = CYCLE_BUTTON_SIZE, + width = CYCLE_BUTTON_SIZE, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + } + local buttonPos = CYCLE_BUTTON_START:copy() + local rowCount = 0 + local colCount = 0 + for _, cycle in ipairs(CYCLE_LIST) do + cycleButtonParams.click_function = "spawnCycle" .. cycle + cycleButtonParams.position = buttonPos + cycleButtonParams.tooltip = cycle + self.createButton(cycleButtonParams) + self.setVar(cycleButtonParams.click_function, function(_, _, _) spawnCycle(cycle) end) + colCount = colCount + 1 + -- If we've reached the end of a row, shift down and back to the first column + if colCount >= CYCLE_COLUMN_COUNT then + buttonPos = CYCLE_BUTTON_START:copy() + rowCount = rowCount + 1 + colCount = 0 + buttonPos.z = buttonPos.z + CYCLE_BUTTONS_Z_OFFSET * rowCount + if rowCount == 3 then + -- Account for two centered buttons on the final row + buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET / 2 + --[[ Account for centered button on the final row + buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET + ]] + end + else + buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET + end + end +end + +function createClearButton() + self.createButton({ + function_owner = self, + click_function = "deleteAll", + position = Vector(0, 0.1, 0.852), + height = 170, + width = 750, + scale = Vector(0.25, 1, 0.25), + color = TRANSPARENT + }) +end + +function createInvestigatorModeButtons() + local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS + + self.createButton({ + function_owner = self, + click_function = "setCardsOnlyMode", + position = Vector(0.251, 0.1, -0.322), + height = 170, + width = 760, + scale = Vector(0.25, 1, 0.25), + color = starterMode and TRANSPARENT or STARTER_DECK_MODE_SELECTED_COLOR + }) + self.createButton({ + function_owner = self, + click_function = "setStarterDeckMode", + position = Vector(0.66, 0.1, -0.322), + height = 170, + width = 760, + scale = Vector(0.25, 1, 0.25), + color = starterMode and STARTER_DECK_MODE_SELECTED_COLOR or TRANSPARENT + }) + local checkX = starterMode and 0.52 or 0.11 + self.createButton({ + function_owner = self, + label = "✓", + click_function = "doNothing", + position = Vector(checkX, 0.11, -0.317), + height = 0, + width = 0, + scale = Vector(0.3, 1, 0.3), + font_color = { 0, 0, 0 }, + color = { 1, 1, 1 } + }) +end + +function toggleHelp(_, playerColor, _) + if helpVisibleToPlayers[playerColor] then + helpVisibleToPlayers[playerColor] = nil + else + helpVisibleToPlayers[playerColor] = true + end + updateHelpVisibility() +end + +function updateHelpVisibility() + local visibility = "" + for player, _ in pairs(helpVisibleToPlayers) do + if string.len(visibility) > 0 then + visibility = visibility .. "|" .. player + else + visibility = player + end + end + self.UI.setAttribute("helpText", "visibility", visibility) + self.UI.setAttribute("helpPanel", "visibility", visibility) + self.UI.setAttribute("helpPanel", "active", string.len(visibility) > 0) +end + +function setStarterDeckMode() + starterDeckMode = STARTER_DECK_MODE_STARTERS + updateStarterModeButtons() +end + +function setCardsOnlyMode() + starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY + updateStarterModeButtons() +end + +function updateStarterModeButtons() + local buttonCount = #self.getButtons() + -- Buttons are 0-indexed, so the last three are -1, -2, and -3 from the size + self.removeButton(buttonCount - 1) + self.removeButton(buttonCount - 2) + self.removeButton(buttonCount - 3) + createInvestigatorModeButtons() +end + +-- Clears the table and updates positions based on scale (should be called before ANY card placement) +function prepareToPlaceCards() + deleteAll() + scalePositions() +end + +-- Updates the positions based on the current object scale to ensure the relative layout functions +-- properly at different scales. +function scalePositions() + -- Assume scaling is consistent in X and Z dimensions + local scale = 1 / self.getScale().x + startPositions = { } + for key, pos in pairs(START_POSITIONS) do + -- Because a scaled object means a different global size, using global distance for Z results in + -- the cards being closer or farther depending on the scale. Leave the Z values and only scale X and Y + startPositions[key] = Vector(pos) + startPositions[key].x = startPositions[key].x * scale + startPositions[key].y = startPositions[key].y * scale + end + cardRowOffset = CARD_ROW_OFFSET * scale + cardGroupOffset = CARD_GROUP_OFFSET * scale + investigatorPositionShiftRow = Vector(INVESTIGATOR_POSITION_SHIFT_ROW):scale(scale) + investigatorPositionShiftCol = Vector(INVESTIGATOR_POSITION_SHIFT_COL):scale(scale) + investigatorCardOffset = Vector(INVESTIGATOR_CARD_OFFSET):scale(scale) + investigatorSignatureOffset = Vector(INVESTIGATOR_SIGNATURE_OFFSET):scale(scale) +end + +-- Deletes all cards currently placed on the table +function deleteAll() + spawnBag.recall(true) +end + +-- Spawn an investigator group, based on the current UI setting for either investigators or starter +-- decks. +---@param groupName string Name of the group to spawn, matching a key in InvestigatorPanelData +function spawnInvestigatorGroup(groupName) + local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS + prepareToPlaceCards() + Wait.frames(function() + if starterMode then + spawnStarters(groupName) + else + spawnInvestigators(groupName) + end + end, 2) +end + +-- Spawn cards for all investigators in the given group. This creates piles for all defined +-- investigator cards and minicards as well as the signature cards. +---@param groupName string Name of the group to spawn, matching a key in InvestigatorPanelData +function spawnInvestigators(groupName) + if INVESTIGATOR_GROUPS[groupName] == nil then + printToAll("No " .. groupName .. " data yet") + return + end + + local col = 1 + local row = 1 + local investigatorCount = #INVESTIGATOR_GROUPS[groupName] + local position = getInvestigatorRowStartPos(investigatorCount, row) + + for i, investigatorName in ipairs(INVESTIGATOR_GROUPS[groupName]) do + for _, spawnSpec in ipairs(buildInvestigatorSpawnSpec(investigatorName, INVESTIGATORS[investigatorName], position)) do + spawnBag.spawn(spawnSpec) + end + position:add(investigatorPositionShiftCol) + col = col + 1 + if col > INVESTIGATOR_MAX_COLS then + col = 1 + row = row + 1 + position = getInvestigatorRowStartPos(investigatorCount, row) + end + end +end + +function getInvestigatorRowStartPos(investigatorCount, row) + local rowStart = Vector(startPositions.investigator) + rowStart:add(Vector( + investigatorPositionShiftRow.x * (row - 1), + investigatorPositionShiftRow.y * (row - 1), + investigatorPositionShiftRow.z * (row - 1))) + local investigatorsInRow = math.min(investigatorCount - INVESTIGATOR_MAX_COLS * (row - 1), INVESTIGATOR_MAX_COLS) + rowStart:add(Vector( + investigatorPositionShiftCol.x * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, + investigatorPositionShiftCol.y * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, + investigatorPositionShiftCol.z * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2)) + return rowStart +end + +-- Creates the spawn spec for the investigator's signature cards. +---@param investigatorName string Name of the investigator, matching a key in InvestigatorPanelData +---@param investigatorData table Spawn definition for the investigator, retrieved from INVESTIGATORS +---@param position tts__Vector Where to spawn the minicard; investigagor cards will be placed below +function buildInvestigatorSpawnSpec(investigatorName, investigatorData, position) + local sigPos = Vector(position):add(investigatorSignatureOffset) + local spawns = buildCommonSpawnSpec(investigatorName, investigatorData, position) + table.insert(spawns, { + name = investigatorName .. "signatures", + cards = investigatorData.signatures, + globalPos = self.positionToWorld(sigPos), + rotation = FACE_UP_ROTATION + }) + + return spawns +end + +-- Builds the spawn specs for minicards and investigator cards. These are common enough to be +-- shared, and will only differ in whether they spawn the full stack of possible investigator and +-- minicards, or only the first of each. +---@param investigatorName string Name of the investigator, matching a key in InvestigatorPanelData +---@param investigatorData table Spawn definition for the investigator, retrieved from INVESTIGATORS +---@param position tts__Vector Where to spawn the minicard; investigagor cards will be placed below +---@param oneCardOnly? boolean If true, will spawn only the first card in the investigator card +--- and minicard lists. Otherwise, spawn them all in a deck +function buildCommonSpawnSpec(investigatorName, investigatorData, position, oneCardOnly) + local cardPos = Vector(position):add(investigatorCardOffset) + return { + { + name = investigatorName .. "minicards", + cards = oneCardOnly and { investigatorData.minicards[1] } or investigatorData.minicards, + globalPos = self.positionToWorld(position), + rotation = FACE_UP_ROTATION + }, + { + name = investigatorName .. "cards", + cards = oneCardOnly and { investigatorData.cards[1] } or investigatorData.cards, + globalPos = self.positionToWorld(cardPos), + rotation = FACE_UP_ROTATION + } + } +end + +-- Spawns all starter decks (single minicard and investigator card, plus the starter deck) for +-- investigators in the given group. +---@param groupName string Name of the group to spawn, matching a key in InvestigatorPanelData +function spawnStarters(groupName) + local col = 1 + local row = 1 + local investigatorCount = #INVESTIGATOR_GROUPS[groupName] + local position = getInvestigatorRowStartPos(investigatorCount, row) + for _, investigatorName in ipairs(INVESTIGATOR_GROUPS[groupName]) do + spawnStarterDeck(investigatorName, INVESTIGATORS[investigatorName], position) + position:add(investigatorPositionShiftCol) + col = col + 1 + if col > INVESTIGATOR_MAX_COLS then + col = 1 + row = row + 1 + position = getInvestigatorRowStartPos(investigatorCount, row) + end + end +end + +-- Spawns the defined starter deck for the given investigator's. +---@param investigatorName string Name of the investigator, matching a key in InvestigatorPanelData +function spawnStarterDeck(investigatorName, investigatorData, position) + for _, spawnSpec in ipairs(buildCommonSpawnSpec(investigatorName, investigatorData, position, true)) do + spawnBag.spawn(spawnSpec) + end + local deckPos = Vector(position):add(investigatorSignatureOffset) + arkhamDb.getDecklist("None", investigatorData.starterDeck, true, false, false, function(slots) + local cardIdList = { } + for id, count in pairs(slots) do + for i = 1, count do + table.insert(cardIdList, id) + end + end + spawnBag.spawn({ + name = investigatorName.."starter", + cards = cardIdList, + globalPos = self.positionToWorld(deckPos), + rotation = FACE_DOWN_ROTATION + }) + end) +end +-- Clears the currently placed cards, then places cards for the given class and level spread +---@param cardClass string Class to place ("Guardian", "Seeker", etc) +---@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. +function spawnClassCards(cardClass, isUpgraded) + prepareToPlaceCards() + Wait.frames(function() placeClassCards(cardClass, isUpgraded) end, 2) +end + +-- Spawn the class cards. +---@param cardClass string Class to place ("Guardian", "Seeker", etc) +---@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. +function placeClassCards(cardClass, isUpgraded) + local indexReady = allCardsBagApi.isIndexReady() + if (not indexReady) then + broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) + return + end + local cardIdList = allCardsBagApi.getCardsByClassAndLevel(cardClass, isUpgraded) + + local skillList = { } + local eventList = { } + local assetList = { } + for _, cardId in ipairs(cardIdList) do + local cardMetadata = allCardsBagApi.getCardById(cardId).metadata + if (cardMetadata.type == "Skill") then + table.insert(skillList, cardId) + elseif (cardMetadata.type == "Event") then + table.insert(eventList, cardId) + elseif (cardMetadata.type == "Asset") then + table.insert(assetList, cardId) + end + end + local groupPos = Vector(startPositions.classCards) + if #skillList > 0 then + spawnBag.spawn({ + name = cardClass .. (isUpgraded and "upgraded" or "basic"), + cards = skillList, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + groupPos.z = groupPos.z + math.ceil(#skillList / 20) * cardRowOffset + cardGroupOffset + end + if #eventList > 0 then + spawnBag.spawn({ + name = cardClass .. "event" .. (isUpgraded and "upgraded" or "basic"), + cards = eventList, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + groupPos.z = groupPos.z + math.ceil(#eventList / 20) * cardRowOffset + cardGroupOffset + end + if #assetList > 0 then + spawnBag.spawn({ + name = cardClass .. "asset" .. (isUpgraded and "upgraded" or "basic"), + cards = assetList, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + end +end + +-- Spawns the investigator sets and all cards for the given cycle +---@param cycle string Name of a cycle, should match the standard used in card metadata +function spawnCycle(cycle) + prepareToPlaceCards() + spawnInvestigators(cycle) + local indexReady = allCardsBagApi.isIndexReady() + if (not indexReady) then + broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) + return + end + local cycleCardList = allCardsBagApi.getCardsByCycle(cycle) + local copiedList = { } + for i, id in ipairs(cycleCardList) do + copiedList[i] = id + end + spawnBag.spawn({ + name = "cycle"..cycle, + cards = copiedList, + globalPos = self.positionToWorld(startPositions.cycle), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) +end + +function spawnBonded() + prepareToPlaceCards() + spawnBag.spawn({ + name = "bonded", + cards = BONDED_CARD_LIST, + globalPos = self.positionToWorld(startPositions.classCards), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) +end + +function spawnUpgradeSheets() + prepareToPlaceCards() + spawnBag.spawn({ + name = "upgradeSheets", + cards = UPGRADE_SHEET_LIST, + globalPos = self.positionToWorld(startPositions.classCards), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + spawnBag.spawn({ + name = "servitor", + cards = { "09080-m" }, + globalPos = self.positionToWorld(startPositions.summonedServitor), + rotation = FACE_UP_ROTATION, + }) +end + +-- Clears the current cards, and places all basic weaknesses on the table. +function spawnWeaknesses() + prepareToPlaceCards() + local indexReady = allCardsBagApi.isIndexReady() + if (not indexReady) then + broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) + return + end + local weaknessIdList = allCardsBagApi.getUniqueWeaknesses() + local basicWeaknessList = { } + local otherWeaknessList = { } + for i, id in ipairs(weaknessIdList) do + local cardMetadata = allCardsBagApi.getCardById(id).metadata + if cardMetadata.basicWeaknessCount ~= nil and cardMetadata.basicWeaknessCount > 0 then + table.insert(basicWeaknessList, id) + elseif excludedNonBasicWeaknesses[id] == nil then + table.insert(otherWeaknessList, id) + end + end + local groupPos = Vector(startPositions.classCards) + spawnBag.spawn({ + name = "basicWeaknesses", + cards = basicWeaknessList, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + groupPos.z = groupPos.z + math.ceil(#basicWeaknessList / 20) * cardRowOffset + cardGroupOffset + spawnBag.spawn({ + name = "evolvedWeaknesses", + cards = EVOLVED_WEAKNESSES, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) + groupPos.z = groupPos.z + math.ceil(#EVOLVED_WEAKNESSES / 20) * cardRowOffset + cardGroupOffset + spawnBag.spawn({ + name = "otherWeaknesses", + cards = otherWeaknessList, + globalPos = self.positionToWorld(groupPos), + rotation = FACE_UP_ROTATION, + spread = true, + spreadCols = 20 + }) +end + +function spawnRandomWeakness() + prepareToPlaceCards() + local weaknessId = allCardsBagApi.getRandomWeaknessId() + if (weaknessId == nil) then + broadcastToAll("All basic weaknesses are in play!", {0.9, 0.2, 0.2}) + return + end + spawnBag.spawn({ + name = "randomWeakness", + cards = { weaknessId }, + globalPos = self.positionToWorld(startPositions.randomWeakness), + rotation = FACE_UP_ROTATION, + }) +end +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + end + + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile Player Cards 2d30ee.yaml b/unpacked/Custom_Tile Player Cards 2d30ee.yaml index c74caf728..2f8094069 100644 --- a/unpacked/Custom_Tile Player Cards 2d30ee.yaml +++ b/unpacked/Custom_Tile Player Cards 2d30ee.yaml @@ -15,7 +15,7 @@ CustomImage: Type: 3 ImageScalar: 1 ImageSecondaryURL: '' - ImageURL: http://cloud-3.steamusercontent.com/ugc/2021607169641075457/C12E95AE17A6C6043118449CB8012F8509828325/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/2342503777940937086/92256BDF101E6272AD1E3F5F0043D311DF708F03/ WidthScale: 0 Description: '' DragSelectable: true diff --git a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua index 624201554..8e5366a7e 100644 --- a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua +++ b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua @@ -41,237 +41,746 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local optionPanelApi = require("core/OptionPanelApi") + local playAreaApi = require("core/PlayAreaApi") + local searchLib = require("util/SearchLib") + local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") - local function getGuidHandler() - return getObjectFromGUID("123456") + local PLAYER_CARD_TOKEN_OFFSETS = { + [1] = { + Vector(0, 3, -0.2) + }, + [2] = { + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [3] = { + Vector(0, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [4] = { + Vector(0.4, 3, -0.9), + Vector(-0.4, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [5] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [6] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2) + }, + [7] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0, 3, 0.5) + }, + [8] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(-0.35, 3, 0.5), + Vector(0.35, 3, 0.5) + }, + [9] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5) + }, + [10] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0, 3, 1.2) + }, + [11] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(-0.35, 3, 1.2), + Vector(0.35, 3, 1.2) + }, + [12] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0.7, 3, 1.2), + Vector(0, 3, 1.2), + Vector(-0.7, 3, 1.2) + } + } + + -- stateIDs for the multi-stated resource tokens + local stateTable = { + ["resource"] = 1, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, + ["evidence"] = 5, + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 + } + + -- Table of data extracted from the token source bag, keyed by the Memo on each token which + -- should match the token type keys ("resource", "clue", etc) + local tokenTemplates + + local playerCardData + local locationData + + local TokenManager = { } + local internal = { } + + -- Spawns tokens for the card. This function is built to just throw a card at it and let it do + -- the work once a card has hit an area where it might spawn tokens. It will check to see if + -- the card has already spawned, find appropriate data from either the uses metadata or the Data + -- Helper, and spawn the tokens. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + TokenManager.spawnForCard = function(card, extraUses) + if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then + return + end + local metadata = JSON.decode(card.getGMNotes()) + if metadata ~= nil then + internal.spawnTokensFromUses(card, extraUses) + else + internal.spawnTokensFromDataHelper(card) + end end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type) - return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type }) + -- Spawns a set of tokens on the given card. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the + -- spawned state object rather than spawning multiple tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) + local optionPanel = optionPanelApi.getOptions() + + if tokenType == "damage" or tokenType == "horror" then + TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then + TokenManager.spawnResourceCounterToken(card, tokenCount) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then + TokenManager.spawnResourceCounterToken(card, tokenCount) + else + TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) + end end - -- returns all matching objects as a table with references - ---@param type String Type of object to search for - GUIDReferenceApi.getObjectsByType = function(type) - return getGuidHandler().call("getObjectsByType", type) + -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror + -- tokens. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other + -- types should use spawnMultipleTokens() + ---@param tokenValue number Value to set the damage/horror to + TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) + if tokenValue < 1 or tokenValue > 50 then return end + + local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) end) end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - GUIDReferenceApi.getObjectsByOwner = function(owner) - return getGuidHandler().call("getObjectsByOwner", owner) + TokenManager.spawnResourceCounterToken = function(card, tokenCount) + local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) + spawned.call("updateVal", tokenCount) + end) 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 + -- Spawns a number of tokens. + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". + -- Other types should use spawnCounterToken() + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) + -- not checking the max at this point since clue offsets are calculated dynamically + if tokenCount < 1 then return end + + local offsets = {} + if tokenType == "clue" then + offsets = internal.buildClueOffsets(card, tokenCount) + else + -- only up to 12 offset tables defined + if tokenCount > 12 then return end + for i = 1, tokenCount do + offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) + -- Fix the y-position for the spawn, since positionToWorld considers rotation which can + -- have bad results for face up/down differences + offsets[i].y = card.getPosition().y + 0.15 + end + end + + if shiftDown ~= nil then + -- Copy the offsets to make sure we don't change the static values + local baseOffsets = offsets + offsets = { } + + -- get a vector for the shifting (downwards local to the card) + local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) + for i, baseOffset in ipairs(baseOffsets) do + offsets[i] = baseOffset + shiftDownVector + end + end + + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + return + end + + -- handling for not provided subtype (for example when spawning from custom data helpers) + if subType == nil then + subType = "" + end + + -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") + local callback = nil + local stateID = stateTable[string.lower(subType)] + if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then + callback = function(spawned) spawned.setState(stateID) end + end + + for i = 1, tokenCount do + TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) + end + end + + -- Spawns a single token at the given global position by copying it from the template bag. + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", + -- "resource", "doom", or "clue" + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, + -- x and z will use the default rotation from the source bag + ---@param callback? function A callback function triggered after the new token is spawned + TokenManager.spawnToken = function(position, tokenType, rotation, callback) + internal.initTokenTemplates() + local loadTokenType = tokenType + if tokenType == "clue" or tokenType == "doom" then + loadTokenType = "clueDoom" + end + if tokenTemplates[loadTokenType] == nil then + error("Unknown token type '" .. tokenType .. "'") + return + end + local tokenTemplate = tokenTemplates[loadTokenType] + + -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag + local rot = Vector(tokenTemplate.Transform.rotX, + 270, + tokenTemplate.Transform.rotZ) + if rotation ~= nil then + rot.y = rotation.y + end + if tokenType == "doom" then + rot.z = 180 + end + + tokenTemplate.Nickname = "" + return spawnObjectData({ + data = tokenTemplate, + position = position, + rotation = rot, + callback_function = callback }) end - return GUIDReferenceApi + -- Checks a card for metadata to maybe replenish it + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + TokenManager.maybeReplenishCard = function(card, uses, mat) + -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) + if uses[1].count and uses[1].replenish then + internal.replenishTokens(card, uses, mat) + end + end + + -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some + -- callers. + ---@param card tts__Object Card object to reset the tokens for + TokenManager.resetTokensSpawned = function(card) + tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) + end + + -- Pushes new player card data into the local copy of the Data Helper player data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addPlayerCardData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + playerCardData[k] = v + end + end + + -- Pushes new location data into the local copy of the Data Helper location data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addLocationData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + locationData[k] = v + end + end + + -- Checks to see if the given card has location data in the DataHelper + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise + TokenManager.hasLocationData = function(card) + internal.initDataHelperData() + return internal.getLocationData(card) ~= nil + end + + internal.initTokenTemplates = function() + if tokenTemplates ~= nil then + return + end + tokenTemplates = {} + local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") + for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do + local tokenName = tokenTemplate.Memo + tokenTemplates[tokenName] = tokenTemplate + end + end + + -- Copies the data from the DataHelper. Will only happen once. + internal.initDataHelperData = function() + if playerCardData ~= nil then + return + end + local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") + playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') + locationData = dataHelper.getTable('LOCATIONS_DATA') + end + + -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + internal.spawnTokensFromUses = function(card, extraUses) + local uses = internal.getUses(card) + if uses == nil then return end + + -- go through tokens to spawn + local tokenCount + for i, useInfo in ipairs(uses) do + tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() + if extraUses ~= nil and extraUses[useInfo.type] ~= nil then + tokenCount = tokenCount + extraUses[useInfo.type] + end + -- Shift each spawned group after the first down so they don't pile on each other + TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) + end + + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + internal.spawnTokensFromDataHelper = function(card) + internal.initDataHelperData() + local playerData = internal.getPlayerCardData(card) + if playerData ~= nil then + internal.spawnPlayerCardTokensFromDataHelper(card, playerData) + end + local locationData = internal.getLocationData(card) + if locationData ~= nil then + internal.spawnLocationTokensFromDataHelper(card, locationData) + end + end + + -- Spawn tokens for a player card using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) + local token = playerData.tokenType + local tokenCount = playerData.tokenCount + TokenManager.spawnTokenGroup(card, token, tokenCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a location using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnLocationTokensFromDataHelper = function(card, locationData) + local clueCount = internal.getClueCountFromData(card, locationData) + if clueCount > 0 then + TokenManager.spawnTokenGroup(card, "clue", clueCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + end + + internal.getPlayerCardData = function(card) + return playerCardData[card.getName() .. ':' .. card.getDescription()] + or playerCardData[card.getName()] + end + + internal.getLocationData = function(card) + return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] + end + + internal.getClueCountFromData = function(card, locationData) + -- Return the number of clues to spawn on this location + if locationData == nil then + error('attempted to get clue for unexpected object: ' .. card.getName()) + return 0 + end + + if ((card.is_face_down and locationData.clueSide == 'back') + or (not card.is_face_down and locationData.clueSide == 'front')) then + if locationData.type == 'fixed' then + return locationData.value + elseif locationData.type == 'perPlayer' then + return locationData.value * playAreaApi.getInvestigatorCount() + end + error('unexpected location type: ' .. locationData.type) + end + return 0 + end + + -- Gets the right uses structure for this card, based on metadata and face up/down state + ---@param card tts__Object Card to pull the uses from + internal.getUses = function(card) + local metadata = JSON.decode(card.getGMNotes()) or { } + if metadata.type == "Location" then + if card.is_face_down and metadata.locationBack ~= nil then + return metadata.locationBack.uses + elseif not card.is_face_down and metadata.locationFront ~= nil then + return metadata.locationFront.uses + end + elseif not card.is_face_down then + return metadata.uses + end + + return nil + end + + -- Dynamically create positions for clues on a card. + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at + internal.buildClueOffsets = function(card, count) + local pos = card.getPosition() + local cluePositions = { } + for i = 1, count do + local row = math.floor(1 + (i - 1) / 4) + local column = (i - 1) % 4 + table.insert(cluePositions, Vector(pos.x + 1.5 - 0.55 * row, pos.y + 0.15, pos.z - 0.825 + 0.55 * column)) + end + return cluePositions + end + + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + internal.replenishTokens = function(card, uses, mat) + local cardPos = card.getPosition() + + -- don't continue for cards on the deck (Norman) or in the discard pile + if mat.positionToLocal(cardPos).x < -1 then return end + + -- get current amount of resource tokens on the card + local clickableResourceCounter = nil + local foundTokens = 0 + + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do + local memo = obj.getMemo() + + if (stateTable[memo] or 0) > 0 then + foundTokens = foundTokens + math.abs(obj.getQuantity()) + obj.destruct() + elseif memo == "resourceCounter" then + foundTokens = obj.getVar("val") + clickableResourceCounter = obj + break + end + end + + -- this is the theoretical new amount of uses (to be checked below) + local newCount = foundTokens + uses[1].replenish + + -- if there are already more uses than the replenish amount, keep them + if foundTokens > uses[1].count then + newCount = foundTokens + -- only replenish up until the replenish amount + elseif newCount > uses[1].count then + newCount = uses[1].count + end + + -- update the clickable counter or spawn a group of tokens + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", newCount) + else + TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) + end + end + + return TokenManager end end) -__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local MythosAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } - local function getMythosArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") - end - - -- returns the chaos token metadata (if provided through scenario reference card) - MythosAreaApi.returnTokenData = function() - return getMythosArea().call("returnTokenData") - end - - -- returns an object reference to the encounter deck - MythosAreaApi.getEncounterDeck = function() - return getMythosArea().call("getEncounterDeck") - end - - -- draw an encounter card for the requesting mat - MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) - end - - return MythosAreaApi -end -end) -__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local NavigationOverlayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getNOHandler() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") - end - - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player - NavigationOverlayApi.copyVisibility = function(startColor, targetColor) - getNOHandler().call("copyVisibility", { - startColor = startColor, - targetColor = targetColor + -- 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 }) - end - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for - NavigationOverlayApi.cycleVisibility = function(playerColor) - getNOHandler().call("cycleVisibility", playerColor) + -- filtering the result + 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 end - -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to - NavigationOverlayApi.loadCamera = function(player, camera) - getNOHandler().call("loadCameraFromApi", { - player = player, - camera = camera - }) + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - return NavigationOverlayApi + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib end end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlayAreaApi = {} + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenSpawnTracker = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + local function getSpawnTracker() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") end - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) + return getSpawnTracker().call("hasSpawnedTokens", cardGuid) end - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") + TokenSpawnTracker.markTokensSpawned = function(cardGuid) + return getSpawnTracker().call("markTokensSpawned", cardGuid) end - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) + TokenSpawnTracker.resetTokensSpawned = function(cardGuid) + return getSpawnTracker().call("resetTokensSpawned", cardGuid) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + TokenSpawnTracker.resetAllAssetAndEvents = function() + return getSpawnTracker().call("resetAllAssetAndEvents") end - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + TokenSpawnTracker.resetAllLocations = function() + return getSpawnTracker().call("resetAllLocations") end - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + TokenSpawnTracker.resetAll = function() + return getSpawnTracker().call("resetAll") end - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi + return TokenSpawnTracker end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/Playmat") +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end end) __bundle_register("playermat/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") @@ -420,8 +929,8 @@ function onLoad(saveState) end showDrawButton(isDrawButtonVisible) - collisionEnabled = true math.randomseed(os.time()) + Wait.time(function() collisionEnabled = true end, 0.1) end --------------------------------------------------------- @@ -466,8 +975,8 @@ function doNotReady(card) end -- rounds a number to the specified amount of decimal places ----@param num Number Initial value ----@param numDecimalPlaces Number Amount of decimal places +---@param num number Initial value +---@param numDecimalPlaces number Amount of decimal places function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult @@ -478,7 +987,7 @@ end --------------------------------------------------------- -- handles discarding for a list of objects ----@param objList Table List of objects to discard +---@param objList table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do if obj.type == "Card" or obj.type == "Deck" then @@ -576,14 +1085,12 @@ function doUpkeep(_, clickedByColor, isRightClick) -- flip investigator mini-card and summoned servitor mini-card -- (all characters allowed to account for custom IDs - e.g. 'Z0000' for TTS Zoop generated IDs) - if activeInvestigatorId ~= nil then - local miniId = string.match(activeInvestigatorId, ".....") .. "-m" - for _, obj in ipairs(getObjects()) do - if obj.type == "Card" and obj.is_face_down then - local notes = JSON.decode(obj.getGMNotes()) - if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then - obj.flip() - end + local miniId = string.match(activeInvestigatorId, ".....") .. "-m" + for _, obj in ipairs(getObjects()) do + if obj.type == "Card" and obj.is_face_down then + local notes = JSON.decode(obj.getGMNotes()) + if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then + obj.flip() end end end @@ -723,7 +1230,6 @@ function flipTopCardFromDeck() Wait.time(function() local deckAreaObjects = getDeckAreaObjects() if deckAreaObjects.topCard then - return elseif deckAreaObjects.draw then if deckAreaObjects.draw.type == "Card" then deckAreaObjects.draw.flip() @@ -763,7 +1269,9 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) - broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") + + local playerName = Player[playerColor].steam_name or playerColor + broadcastToAll(playerName .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1032,7 +1540,7 @@ end --------------------------------------------------------- -- updates the specific owned counter ----@param param Table Contains the information to update: +---@param param table Contains the information to update: --- type: String Counter to target --- newValue: Number Value to set the counter to --- modifier: Number If newValue is not provided, the existing value will be adjusted by this modifier @@ -1046,7 +1554,7 @@ function updateCounter(param) end -- returns the resource counter amount ----@param type String Counter to target +---@param type string Counter to target function getCounterValue(type) return ownedObjects[type].getVar("val") end @@ -1078,7 +1586,7 @@ function returnGlobalDiscardPosition() end -- Sets this playermat's draw 1 button to visible ----@param visible Boolean. Whether the draw 1 button should be visible +---@param visible boolean Whether the draw 1 button should be visible function showDrawButton(visible) isDrawButtonVisible = visible @@ -1107,7 +1615,7 @@ function showDrawButton(visible) end -- shows / hides a clickable clue counter for this playmat and sets the correct amount of clues ----@param showCounter Boolean Whether the clickable clue counter should be visible +---@param showCounter boolean Whether the clickable clue counter should be visible function clickableClues(showCounter) local clickerPos = ownedObjects.ClickableClueCounter.getPosition() local clueCount = 0 @@ -1145,7 +1653,7 @@ function removeClues() end -- reports the clue count ----@param useClickableCounters Boolean Controls which type of counter is getting checked +---@param useClickableCounters boolean Controls which type of counter is getting checked function getClueCount(useClickableCounters) if useClickableCounters then return ownedObjects.ClickableClueCounter.getVar("val") @@ -1154,11 +1662,10 @@ function getClueCount(useClickableCounters) end end --- Sets this playermat's snap points to limit snapping to matching card types or not. If matchTypes +-- Sets this playermat's snap points to limit snapping to matching card types or not. If 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 matchTypes Boolean. Whether snap points should only snap for the matching card types. +-- will only snap Investigators. If matchTypes is false, snap points will be reset to snap all cards. +---@param matchTypes boolean Whether snap points should only snap for the matching card types. function setLimitSnapsByType(matchTypes) local snaps = self.getSnapPoints() for i, snap in ipairs(snaps) do @@ -1192,10 +1699,10 @@ function setLimitSnapsByType(matchTypes) end -- Simple method to check if the given point is in a specified area. Local use only, ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample -- bounds definition. ----@return Boolean True if the point is in the area defined by bounds +---@return boolean: True if the point is in the area defined by bounds function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -1211,533 +1718,153 @@ function updatePlayerCards(args) tokenManager.addPlayerCardData(playerCardData) end end) -__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local guidReferenceApi = require("core/GUIDReferenceApi") - local optionPanelApi = require("core/OptionPanelApi") - local playAreaApi = require("core/PlayAreaApi") - local searchLib = require("util/SearchLib") - local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") + local GUIDReferenceApi = {} - local PLAYER_CARD_TOKEN_OFFSETS = { - [1] = { - Vector(0, 3, -0.2) - }, - [2] = { - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [3] = { - Vector(0, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [4] = { - Vector(0.4, 3, -0.9), - Vector(-0.4, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [5] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [6] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2) - }, - [7] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0, 3, 0.5) - }, - [8] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(-0.35, 3, 0.5), - Vector(0.35, 3, 0.5) - }, - [9] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5) - }, - [10] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0, 3, 1.2) - }, - [11] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(-0.35, 3, 1.2), - Vector(0.35, 3, 1.2) - }, - [12] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0.7, 3, 1.2), - Vector(0, 3, 1.2), - Vector(-0.7, 3, 1.2) - } - } - - -- stateIDs for the multi-stated resource tokens - local stateTable = { - ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, - ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 - } - - -- Table of data extracted from the token source bag, keyed by the Memo on each token which - -- should match the token type keys ("resource", "clue", etc) - local tokenTemplates - - local playerCardData - local locationData - - local TokenManager = { } - local internal = { } - - -- Spawns tokens for the card. This function is built to just throw a card at it and let it do - -- the work once a card has hit an area where it might spawn tokens. It will check to see if - -- the card has already spawned, find appropriate data from either the uses metadata or the Data - -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - TokenManager.spawnForCard = function(card, extraUses) - if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then - return - end - local metadata = JSON.decode(card.getGMNotes()) - if metadata ~= nil then - internal.spawnTokensFromUses(card, extraUses) - else - internal.spawnTokensFromDataHelper(card) - end + local function getGuidHandler() + return getObjectFromGUID("123456") end - -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the - -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) - local optionPanel = optionPanelApi.getOptions() - - if tokenType == "damage" or tokenType == "horror" then - TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then - TokenManager.spawnResourceCounterToken(card, tokenCount) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then - TokenManager.spawnResourceCounterToken(card, tokenCount) - else - TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) - end + ---@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 - -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror - -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other - -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to - TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) - if tokenValue < 1 or tokenValue > 50 then return end - - local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) 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 - TokenManager.spawnResourceCounterToken = function(card, tokenCount) - local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) - spawned.call("updateVal", tokenCount) - 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 - -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". - -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) - -- not checking the max at this point since clue offsets are calculated dynamically - if tokenCount < 1 then return end - - local offsets = {} - if tokenType == "clue" then - offsets = internal.buildClueOffsets(card, tokenCount) - else - -- only up to 12 offset tables defined - if tokenCount > 12 then return end - for i = 1, tokenCount do - offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) - -- Fix the y-position for the spawn, since positionToWorld considers rotation which can - -- have bad results for face up/down differences - offsets[i].y = card.getPosition().y + 0.15 - end - end - - if shiftDown ~= nil then - -- Copy the offsets to make sure we don't change the static values - local baseOffsets = offsets - offsets = { } - - -- get a vector for the shifting (downwards local to the card) - local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) - for i, baseOffset in ipairs(baseOffsets) do - offsets[i] = baseOffset + shiftDownVector - end - end - - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - return - end - - -- handling for not provided subtype (for example when spawning from custom data helpers) - if subType == nil then - subType = "" - end - - -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") - local callback = nil - local stateID = stateTable[string.lower(subType)] - if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then - callback = function(spawned) spawned.setState(stateID) end - end - - for i = 1, tokenCount do - TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) - end - end - - -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, - -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned - TokenManager.spawnToken = function(position, tokenType, rotation, callback) - internal.initTokenTemplates() - local loadTokenType = tokenType - if tokenType == "clue" or tokenType == "doom" then - loadTokenType = "clueDoom" - end - if tokenTemplates[loadTokenType] == nil then - error("Unknown token type '" .. tokenType .. "'") - return - end - local tokenTemplate = tokenTemplates[loadTokenType] - - -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag - local rot = Vector(tokenTemplate.Transform.rotX, - 270, - tokenTemplate.Transform.rotZ) - if rotation ~= nil then - rot.y = rotation.y - end - if tokenType == "doom" then - rot.z = 180 - end - - tokenTemplate.Nickname = "" - return spawnObjectData({ - data = tokenTemplate, - position = position, - rotation = rot, - callback_function = callback + -- 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 - -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - TokenManager.maybeReplenishCard = function(card, uses, mat) - -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) - if uses[1].count and uses[1].replenish then - internal.replenishTokens(card, uses, mat) - end + return GUIDReferenceApi +end +end) +__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local MythosAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getMythosArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some - -- callers. - ---@param card Object Card object to reset the tokens for - TokenManager.resetTokensSpawned = function(card) - tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) + MythosAreaApi.returnTokenData = function() + return getMythosArea().call("returnTokenData") + end + + ---@return any: Object reference to the encounter deck + MythosAreaApi.getEncounterDeck = function() + return getMythosArea().call("getEncounterDeck") end - -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addPlayerCardData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - playerCardData[k] = v - end + -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end - -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addLocationData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - locationData[k] = v - end + return MythosAreaApi +end +end) +__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local NavigationOverlayApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getNOHandler() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") end - -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise - TokenManager.hasLocationData = function(card) - internal.initDataHelperData() - return internal.getLocationData(card) ~= nil + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player + NavigationOverlayApi.copyVisibility = function(startColor, targetColor) + getNOHandler().call("copyVisibility", { + startColor = startColor, + targetColor = targetColor + }) end - internal.initTokenTemplates = function() - if tokenTemplates ~= nil then - return - end - tokenTemplates = {} - local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") - for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do - local tokenName = tokenTemplate.Memo - tokenTemplates[tokenName] = tokenTemplate - end + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for + NavigationOverlayApi.cycleVisibility = function(playerColor) + getNOHandler().call("cycleVisibility", playerColor) end - -- Copies the data from the DataHelper. Will only happen once. - internal.initDataHelperData = function() - if playerCardData ~= nil then - return - end - local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') - locationData = dataHelper.getTable('LOCATIONS_DATA') + -- loads the specified camera for a player + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to + NavigationOverlayApi.loadCamera = function(player, camera) + getNOHandler().call("loadCameraFromApi", { + player = player, + camera = camera + }) end - -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - internal.spawnTokensFromUses = function(card, extraUses) - local uses = internal.getUses(card) - if uses == nil then return end + return NavigationOverlayApi +end +end) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } - -- go through tokens to spawn - local tokenCount - for i, useInfo in ipairs(uses) do - tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() - if extraUses ~= nil and extraUses[useInfo.type] ~= nil then - tokenCount = tokenCount + extraUses[useInfo.type] - end - -- Shift each spawned group after the first down so they don't pile on each other - TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) - end - - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end + local TokenChecker = {} - -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - internal.spawnTokensFromDataHelper = function(card) - internal.initDataHelperData() - local playerData = internal.getPlayerCardData(card) - if playerData ~= nil then - internal.spawnPlayerCardTokensFromDataHelper(card, playerData) - end - local locationData = internal.getLocationData(card) - if locationData ~= nil then - internal.spawnLocationTokensFromDataHelper(card, locationData) - end - end - - -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) - local token = playerData.tokenType - local tokenCount = playerData.tokenCount - TokenManager.spawnTokenGroup(card, token, tokenCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - - -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnLocationTokensFromDataHelper = function(card, locationData) - local clueCount = internal.getClueCountFromData(card, locationData) - if clueCount > 0 then - TokenManager.spawnTokenGroup(card, "clue", clueCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - end - - internal.getPlayerCardData = function(card) - return playerCardData[card.getName() .. ':' .. card.getDescription()] - or playerCardData[card.getName()] - end - - internal.getLocationData = function(card) - return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] - end - - internal.getClueCountFromData = function(card, locationData) - -- Return the number of clues to spawn on this location - if locationData == nil then - error('attempted to get clue for unexpected object: ' .. card.getName()) - return 0 - end - - if ((card.is_face_down and locationData.clueSide == 'back') - or (not card.is_face_down and locationData.clueSide == 'front')) then - if locationData.type == 'fixed' then - return locationData.value - elseif locationData.type == 'perPlayer' then - return locationData.value * playAreaApi.getInvestigatorCount() - end - error('unexpected location type: ' .. locationData.type) - end - return 0 - end - - -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from - internal.getUses = function(card) - local metadata = JSON.decode(card.getGMNotes()) or { } - if metadata.type == "Location" then - if card.is_face_down and metadata.locationBack ~= nil then - return metadata.locationBack.uses - elseif not card.is_face_down and metadata.locationFront ~= nil then - return metadata.locationFront.uses - end - elseif not card.is_face_down then - return metadata.uses - end - - return nil - end - - -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at - internal.buildClueOffsets = function(card, count) - local pos = card.getPosition() - local cluePositions = { } - for i = 1, count do - local column = math.floor((i - 1) / 4) - local row = (i - 1) % 4 - table.insert(cluePositions, Vector(pos.x - 1 + 0.55 * row, pos.y, pos.z - 1.4 - 0.55 * column)) - end - return cluePositions - end - - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - internal.replenishTokens = function(card, uses, mat) - local cardPos = card.getPosition() - - -- don't continue for cards on the deck (Norman) or in the discard pile - if mat.positionToLocal(cardPos).x < -1 then return end - - -- get current amount of resource tokens on the card - local clickableResourceCounter = nil - local foundTokens = 0 - - for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do - local memo = obj.getMemo() - - if (stateTable[memo] or 0) > 0 then - foundTokens = foundTokens + math.abs(obj.getQuantity()) - obj.destruct() - elseif memo == "resourceCounter" then - foundTokens = obj.getVar("val") - clickableResourceCounter = obj - break - end - end - - -- this is the theoretical new amount of uses (to be checked below) - local newCount = foundTokens + uses[1].replenish - - -- if there are already more uses than the replenish amount, keep them - if foundTokens > uses[1].count then - newCount = foundTokens - -- only replenish up until the replenish amount - elseif newCount > uses[1].count then - newCount = uses[1].count - end - - -- update the clickable counter or spawn a group of tokens - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", newCount) + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true else - TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) + return false end end - return TokenManager + return TokenChecker end end) __bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1746,9 +1873,9 @@ do local searchLib = require("util/SearchLib") -- places a card/deck at a position or merges into an existing deck - ---@param obj TTSObject Object to move - ---@param pos Table New position for the object - ---@param rot Table New rotation for the object (optional) + ---@param obj tts__Object Object to move + ---@param pos table New position for the object + ---@param rot table New rotation for the object (optional) DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) if obj == nil or pos == nil then return end @@ -1789,246 +1916,124 @@ do return DeckLib end end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenSpawnTracker = {} + local PlayAreaApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") end - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") end - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") end - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) end - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end - return TokenSpawnTracker + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true - } - - local TokenChecker = {} - - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true - else - return false - end - end - - return TokenChecker -end +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playermat/Playmat") end) return __bundle_require("__root") diff --git a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua index b7333778e..fb156f6f6 100644 --- a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua +++ b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua @@ -41,42 +41,325 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true - } + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") - local TokenChecker = {} - - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true - else - return false - end + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") end - return TokenChecker + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenSpawnTracker = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getSpawnTracker() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + end + + TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) + return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + end + + TokenSpawnTracker.markTokensSpawned = function(cardGuid) + return getSpawnTracker().call("markTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetTokensSpawned = function(cardGuid) + return getSpawnTracker().call("resetTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetAllAssetAndEvents = function() + return getSpawnTracker().call("resetAllAssetAndEvents") + end + + TokenSpawnTracker.resetAllLocations = function() + return getSpawnTracker().call("resetAllLocations") + end + + TokenSpawnTracker.resetAll = function() + return getSpawnTracker().call("resetAll") + end + + return TokenSpawnTracker +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playermat/Playmat") +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local MythosAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getMythosArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + end + + ---@return any: Table of chaos token metadata (if provided through scenario reference card) + MythosAreaApi.returnTokenData = function() + return getMythosArea().call("returnTokenData") + end + + ---@return any: Object reference to the encounter deck + MythosAreaApi.getEncounterDeck = function() + return getMythosArea().call("getEncounterDeck") + end + + -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) + end + + return MythosAreaApi +end +end) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local DeckLib = {} + local searchLib = require("util/SearchLib") + + -- places a card/deck at a position or merges into an existing deck + ---@param obj tts__Object Object to move + ---@param pos table New position for the object + ---@param rot table New rotation for the object (optional) + DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) + if obj == nil or pos == nil then return end + + -- search the new position for existing card/deck + local searchResult = searchLib.atPosition(pos, "isCardOrDeck") + + -- get new position + local newPos + local offset = 0.5 + if #searchResult == 1 then + local bounds = searchResult[1].getBounds() + newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) + else + newPos = Vector(pos) + Vector(0, offset, 0) + end + + -- allow moving the objects smoothly out of the hand + obj.use_hands = false + + if rot then + obj.setRotationSmooth(rot, false, true) + end + obj.setPositionSmooth(newPos, false, true) + + -- continue if the card stops smooth moving + Wait.condition( + function() + obj.use_hands = true + -- this avoids a TTS bug that merges unrelated cards that are not resting + if #searchResult == 1 and searchResult[1] ~= obj then + -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) + pcall(function() searchResult[1].putObject(obj) end) + end + end, + function() return not obj.isSmoothMoving() end, 3) + end + + return DeckLib end end) __bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -195,12 +478,13 @@ do -- stateIDs for the multi-stated resource tokens local stateTable = { ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 } -- Table of data extracted from the token source bag, keyed by the Memo on each token which @@ -217,8 +501,8 @@ do -- the work once a card has hit an area where it might spawn tokens. It will check to see if -- the card has already spawned, find appropriate data from either the uses metadata or the Data -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 TokenManager.spawnForCard = function(card, extraUses) if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then @@ -233,13 +517,12 @@ do end -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) local optionPanel = optionPanelApi.getOptions() @@ -256,10 +539,10 @@ do -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to + ---@param tokenValue number Value to set the damage/horror to TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) if tokenValue < 1 or tokenValue > 50 then return end @@ -277,11 +560,11 @@ do end -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) -- not checking the max at this point since clue offsets are calculated dynamically if tokenCount < 1 then return end @@ -335,12 +618,12 @@ do end -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned + ---@param callback? function A callback function triggered after the new token is spawned TokenManager.spawnToken = function(position, tokenType, rotation, callback) internal.initTokenTemplates() local loadTokenType = tokenType @@ -374,9 +657,9 @@ do end -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) TokenManager.maybeReplenishCard = function(card, uses, mat) -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) if uses[1].count and uses[1].replenish then @@ -386,13 +669,13 @@ do -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some -- callers. - ---@param card Object Card object to reset the tokens for + ---@param card tts__Object Card object to reset the tokens for TokenManager.resetTokensSpawned = function(card) tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) end -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addPlayerCardData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -401,7 +684,7 @@ do end -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addLocationData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -410,8 +693,8 @@ do end -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise TokenManager.hasLocationData = function(card) internal.initDataHelperData() return internal.getLocationData(card) ~= nil @@ -441,8 +724,8 @@ do -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 internal.spawnTokensFromUses = function(card, extraUses) local uses = internal.getUses(card) @@ -464,7 +747,7 @@ do -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for + ---@param card tts__Object Card to maybe spawn tokens for internal.spawnTokensFromDataHelper = function(card) internal.initDataHelperData() local playerData = internal.getPlayerCardData(card) @@ -478,8 +761,8 @@ do end -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) local token = playerData.tokenType @@ -489,8 +772,8 @@ do end -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnLocationTokensFromDataHelper = function(card, locationData) local clueCount = internal.getClueCountFromData(card, locationData) @@ -529,7 +812,7 @@ do end -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from + ---@param card tts__Object Card to pull the uses from internal.getUses = function(card) local metadata = JSON.decode(card.getGMNotes()) or { } if metadata.type == "Location" then @@ -546,9 +829,9 @@ do end -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at internal.buildClueOffsets = function(card, count) local pos = card.getPosition() local cluePositions = { } @@ -560,9 +843,9 @@ do return cluePositions end - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) internal.replenishTokens = function(card, uses, mat) local cardPos = card.getPosition() @@ -608,55 +891,6 @@ do return TokenManager end end) -__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local DeckLib = {} - local searchLib = require("util/SearchLib") - - -- places a card/deck at a position or merges into an existing deck - ---@param obj TTSObject Object to move - ---@param pos Table New position for the object - ---@param rot Table New rotation for the object (optional) - DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) - if obj == nil or pos == nil then return end - - -- search the new position for existing card/deck - local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - - -- get new position - local newPos - local offset = 0.5 - if #searchResult == 1 then - local bounds = searchResult[1].getBounds() - newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) - else - newPos = Vector(pos) + Vector(0, offset, 0) - end - - -- allow moving the objects smoothly out of the hand - obj.use_hands = false - - if rot then - obj.setRotationSmooth(rot, false, true) - end - obj.setPositionSmooth(newPos, false, true) - - -- continue if the card stops smooth moving - Wait.condition( - function() - obj.use_hands = true - -- this avoids a TTS bug that merges unrelated cards that are not resting - if #searchResult == 1 and searchResult[1] ~= obj then - -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) - pcall(function() searchResult[1].putObject(obj) end) - end - end, - function() return not obj.isSmoothMoving() end, 3) - end - - return DeckLib -end -end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -670,14 +904,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -690,7 +927,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -725,8 +962,23 @@ do return SearchLib end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/Playmat") +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end end) __bundle_register("playermat/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") @@ -875,8 +1127,8 @@ function onLoad(saveState) end showDrawButton(isDrawButtonVisible) - collisionEnabled = true math.randomseed(os.time()) + Wait.time(function() collisionEnabled = true end, 0.1) end --------------------------------------------------------- @@ -921,8 +1173,8 @@ function doNotReady(card) end -- rounds a number to the specified amount of decimal places ----@param num Number Initial value ----@param numDecimalPlaces Number Amount of decimal places +---@param num number Initial value +---@param numDecimalPlaces number Amount of decimal places function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult @@ -933,7 +1185,7 @@ end --------------------------------------------------------- -- handles discarding for a list of objects ----@param objList Table List of objects to discard +---@param objList table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do if obj.type == "Card" or obj.type == "Deck" then @@ -1031,14 +1283,12 @@ function doUpkeep(_, clickedByColor, isRightClick) -- flip investigator mini-card and summoned servitor mini-card -- (all characters allowed to account for custom IDs - e.g. 'Z0000' for TTS Zoop generated IDs) - if activeInvestigatorId ~= nil then - local miniId = string.match(activeInvestigatorId, ".....") .. "-m" - for _, obj in ipairs(getObjects()) do - if obj.type == "Card" and obj.is_face_down then - local notes = JSON.decode(obj.getGMNotes()) - if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then - obj.flip() - end + local miniId = string.match(activeInvestigatorId, ".....") .. "-m" + for _, obj in ipairs(getObjects()) do + if obj.type == "Card" and obj.is_face_down then + local notes = JSON.decode(obj.getGMNotes()) + if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then + obj.flip() end end end @@ -1178,7 +1428,6 @@ function flipTopCardFromDeck() Wait.time(function() local deckAreaObjects = getDeckAreaObjects() if deckAreaObjects.topCard then - return elseif deckAreaObjects.draw then if deckAreaObjects.draw.type == "Card" then deckAreaObjects.draw.flip() @@ -1218,7 +1467,9 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) - broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") + + local playerName = Player[playerColor].steam_name or playerColor + broadcastToAll(playerName .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1487,7 +1738,7 @@ end --------------------------------------------------------- -- updates the specific owned counter ----@param param Table Contains the information to update: +---@param param table Contains the information to update: --- type: String Counter to target --- newValue: Number Value to set the counter to --- modifier: Number If newValue is not provided, the existing value will be adjusted by this modifier @@ -1501,7 +1752,7 @@ function updateCounter(param) end -- returns the resource counter amount ----@param type String Counter to target +---@param type string Counter to target function getCounterValue(type) return ownedObjects[type].getVar("val") end @@ -1533,7 +1784,7 @@ function returnGlobalDiscardPosition() end -- Sets this playermat's draw 1 button to visible ----@param visible Boolean. Whether the draw 1 button should be visible +---@param visible boolean Whether the draw 1 button should be visible function showDrawButton(visible) isDrawButtonVisible = visible @@ -1562,7 +1813,7 @@ function showDrawButton(visible) end -- shows / hides a clickable clue counter for this playmat and sets the correct amount of clues ----@param showCounter Boolean Whether the clickable clue counter should be visible +---@param showCounter boolean Whether the clickable clue counter should be visible function clickableClues(showCounter) local clickerPos = ownedObjects.ClickableClueCounter.getPosition() local clueCount = 0 @@ -1600,7 +1851,7 @@ function removeClues() end -- reports the clue count ----@param useClickableCounters Boolean Controls which type of counter is getting checked +---@param useClickableCounters boolean Controls which type of counter is getting checked function getClueCount(useClickableCounters) if useClickableCounters then return ownedObjects.ClickableClueCounter.getVar("val") @@ -1609,11 +1860,10 @@ function getClueCount(useClickableCounters) end end --- Sets this playermat's snap points to limit snapping to matching card types or not. If matchTypes +-- Sets this playermat's snap points to limit snapping to matching card types or not. If 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 matchTypes Boolean. Whether snap points should only snap for the matching card types. +-- will only snap Investigators. If matchTypes is false, snap points will be reset to snap all cards. +---@param matchTypes boolean Whether snap points should only snap for the matching card types. function setLimitSnapsByType(matchTypes) local snaps = self.getSnapPoints() for i, snap in ipairs(snaps) do @@ -1647,10 +1897,10 @@ function setLimitSnapsByType(matchTypes) end -- Simple method to check if the given point is in a specified area. Local use only, ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample -- bounds definition. ----@return Boolean True if the point is in the area defined by bounds +---@return boolean: True if the point is in the area defined by bounds function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -1666,162 +1916,6 @@ function updatePlayerCards(args) tokenManager.addPlayerCardData(playerCardData) end end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local NavigationOverlayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getNOHandler() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") - end - - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player - NavigationOverlayApi.copyVisibility = function(startColor, targetColor) - getNOHandler().call("copyVisibility", { - startColor = startColor, - targetColor = targetColor - }) - end - - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for - NavigationOverlayApi.cycleVisibility = function(playerColor) - getNOHandler().call("cycleVisibility", playerColor) - end - - -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to - NavigationOverlayApi.loadCamera = function(player, camera) - getNOHandler().call("loadCameraFromApi", { - player = player, - camera = camera - }) - end - - return NavigationOverlayApi -end -end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenSpawnTracker = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") - end - - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) - end - - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") - end - - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") - end - - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") - end - - return TokenSpawnTracker -end -end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -1830,29 +1924,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -1864,171 +1960,80 @@ do return GUIDReferenceApi end end) -__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local MythosAreaApi = {} + local NavigationOverlayApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getMythosArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + local function getNOHandler() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") end - -- returns the chaos token metadata (if provided through scenario reference card) - MythosAreaApi.returnTokenData = function() - return getMythosArea().call("returnTokenData") - end - - -- returns an object reference to the encounter deck - MythosAreaApi.getEncounterDeck = function() - return getMythosArea().call("getEncounterDeck") + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player + NavigationOverlayApi.copyVisibility = function(startColor, targetColor) + getNOHandler().call("copyVisibility", { + startColor = startColor, + targetColor = targetColor + }) end - -- draw an encounter card for the requesting mat - MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for + NavigationOverlayApi.cycleVisibility = function(playerColor) + getNOHandler().call("cycleVisibility", playerColor) end - return MythosAreaApi + -- loads the specified camera for a player + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to + NavigationOverlayApi.loadCamera = function(player, camera) + getNOHandler().call("loadCameraFromApi", { + player = player, + camera = camera + }) + end + + return NavigationOverlayApi end end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) do - local OptionPanelApi = {} + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) + local TokenChecker = {} + + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true + else + return false + end end - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") - end - - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") - end - - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") - end - - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) - end - - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) - end - - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi + return TokenChecker end end) return __bundle_require("__root") diff --git a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua index ee3ec5198..06da4f03b 100644 --- a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua +++ b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua @@ -41,48 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) __bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local NavigationOverlayApi = {} @@ -92,25 +50,25 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") end - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player NavigationOverlayApi.copyVisibility = function(startColor, targetColor) getNOHandler().call("copyVisibility", { startColor = startColor, targetColor = targetColor }) - end + end - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for NavigationOverlayApi.cycleVisibility = function(playerColor) getNOHandler().call("cycleVisibility", playerColor) end -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to NavigationOverlayApi.loadCamera = function(player, camera) getNOHandler().call("loadCameraFromApi", { player = player, @@ -121,55 +79,6 @@ do return NavigationOverlayApi end end) -__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local DeckLib = {} - local searchLib = require("util/SearchLib") - - -- places a card/deck at a position or merges into an existing deck - ---@param obj TTSObject Object to move - ---@param pos Table New position for the object - ---@param rot Table New rotation for the object (optional) - DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) - if obj == nil or pos == nil then return end - - -- search the new position for existing card/deck - local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - - -- get new position - local newPos - local offset = 0.5 - if #searchResult == 1 then - local bounds = searchResult[1].getBounds() - newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) - else - newPos = Vector(pos) + Vector(0, offset, 0) - end - - -- allow moving the objects smoothly out of the hand - obj.use_hands = false - - if rot then - obj.setRotationSmooth(rot, false, true) - end - obj.setPositionSmooth(newPos, false, true) - - -- continue if the card stops smooth moving - Wait.condition( - function() - obj.use_hands = true - -- this avoids a TTS bug that merges unrelated cards that are not resting - if #searchResult == 1 and searchResult[1] ~= obj then - -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) - pcall(function() searchResult[1].putObject(obj) end) - end - end, - function() return not obj.isSmoothMoving() end, 3) - end - - return DeckLib -end -end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -184,60 +93,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -254,13 +158,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -280,7 +184,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -328,6 +232,9 @@ do return TokenSpawnTracker end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playermat/Playmat") +end) __bundle_register("playermat/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") local deckLib = require("util/DeckLib") @@ -475,8 +382,8 @@ function onLoad(saveState) end showDrawButton(isDrawButtonVisible) - collisionEnabled = true math.randomseed(os.time()) + Wait.time(function() collisionEnabled = true end, 0.1) end --------------------------------------------------------- @@ -521,8 +428,8 @@ function doNotReady(card) end -- rounds a number to the specified amount of decimal places ----@param num Number Initial value ----@param numDecimalPlaces Number Amount of decimal places +---@param num number Initial value +---@param numDecimalPlaces number Amount of decimal places function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult @@ -533,7 +440,7 @@ end --------------------------------------------------------- -- handles discarding for a list of objects ----@param objList Table List of objects to discard +---@param objList table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do if obj.type == "Card" or obj.type == "Deck" then @@ -631,14 +538,12 @@ function doUpkeep(_, clickedByColor, isRightClick) -- flip investigator mini-card and summoned servitor mini-card -- (all characters allowed to account for custom IDs - e.g. 'Z0000' for TTS Zoop generated IDs) - if activeInvestigatorId ~= nil then - local miniId = string.match(activeInvestigatorId, ".....") .. "-m" - for _, obj in ipairs(getObjects()) do - if obj.type == "Card" and obj.is_face_down then - local notes = JSON.decode(obj.getGMNotes()) - if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then - obj.flip() - end + local miniId = string.match(activeInvestigatorId, ".....") .. "-m" + for _, obj in ipairs(getObjects()) do + if obj.type == "Card" and obj.is_face_down then + local notes = JSON.decode(obj.getGMNotes()) + if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then + obj.flip() end end end @@ -778,7 +683,6 @@ function flipTopCardFromDeck() Wait.time(function() local deckAreaObjects = getDeckAreaObjects() if deckAreaObjects.topCard then - return elseif deckAreaObjects.draw then if deckAreaObjects.draw.type == "Card" then deckAreaObjects.draw.flip() @@ -818,7 +722,9 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) - broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") + + local playerName = Player[playerColor].steam_name or playerColor + broadcastToAll(playerName .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1087,7 +993,7 @@ end --------------------------------------------------------- -- updates the specific owned counter ----@param param Table Contains the information to update: +---@param param table Contains the information to update: --- type: String Counter to target --- newValue: Number Value to set the counter to --- modifier: Number If newValue is not provided, the existing value will be adjusted by this modifier @@ -1101,7 +1007,7 @@ function updateCounter(param) end -- returns the resource counter amount ----@param type String Counter to target +---@param type string Counter to target function getCounterValue(type) return ownedObjects[type].getVar("val") end @@ -1133,7 +1039,7 @@ function returnGlobalDiscardPosition() end -- Sets this playermat's draw 1 button to visible ----@param visible Boolean. Whether the draw 1 button should be visible +---@param visible boolean Whether the draw 1 button should be visible function showDrawButton(visible) isDrawButtonVisible = visible @@ -1162,7 +1068,7 @@ function showDrawButton(visible) end -- shows / hides a clickable clue counter for this playmat and sets the correct amount of clues ----@param showCounter Boolean Whether the clickable clue counter should be visible +---@param showCounter boolean Whether the clickable clue counter should be visible function clickableClues(showCounter) local clickerPos = ownedObjects.ClickableClueCounter.getPosition() local clueCount = 0 @@ -1200,7 +1106,7 @@ function removeClues() end -- reports the clue count ----@param useClickableCounters Boolean Controls which type of counter is getting checked +---@param useClickableCounters boolean Controls which type of counter is getting checked function getClueCount(useClickableCounters) if useClickableCounters then return ownedObjects.ClickableClueCounter.getVar("val") @@ -1209,11 +1115,10 @@ function getClueCount(useClickableCounters) end end --- Sets this playermat's snap points to limit snapping to matching card types or not. If matchTypes +-- Sets this playermat's snap points to limit snapping to matching card types or not. If 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 matchTypes Boolean. Whether snap points should only snap for the matching card types. +-- will only snap Investigators. If matchTypes is false, snap points will be reset to snap all cards. +---@param matchTypes boolean Whether snap points should only snap for the matching card types. function setLimitSnapsByType(matchTypes) local snaps = self.getSnapPoints() for i, snap in ipairs(snaps) do @@ -1247,10 +1152,10 @@ function setLimitSnapsByType(matchTypes) end -- Simple method to check if the given point is in a specified area. Local use only, ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample -- bounds definition. ----@return Boolean True if the point is in the area defined by bounds +---@return boolean: True if the point is in the area defined by bounds function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -1271,7 +1176,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -1298,29 +1203,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -1329,14 +1235,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -1348,6 +1258,168 @@ do return ChaosBagApi end end) +__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local MythosAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getMythosArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + end + + ---@return any: Table of chaos token metadata (if provided through scenario reference card) + MythosAreaApi.returnTokenData = function() + return getMythosArea().call("returnTokenData") + end + + ---@return any: Object reference to the encounter deck + MythosAreaApi.getEncounterDeck = function() + return getMythosArea().call("getEncounterDeck") + end + + -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) + end + + return MythosAreaApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) __bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) do local CHAOS_TOKEN_NAMES = { @@ -1376,7 +1448,7 @@ do -- returns true if the passed object is a chaos token (by name) TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then return true else return false @@ -1502,12 +1574,13 @@ do -- stateIDs for the multi-stated resource tokens local stateTable = { ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 } -- Table of data extracted from the token source bag, keyed by the Memo on each token which @@ -1524,8 +1597,8 @@ do -- the work once a card has hit an area where it might spawn tokens. It will check to see if -- the card has already spawned, find appropriate data from either the uses metadata or the Data -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 TokenManager.spawnForCard = function(card, extraUses) if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then @@ -1540,13 +1613,12 @@ do end -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) local optionPanel = optionPanelApi.getOptions() @@ -1563,10 +1635,10 @@ do -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to + ---@param tokenValue number Value to set the damage/horror to TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) if tokenValue < 1 or tokenValue > 50 then return end @@ -1584,11 +1656,11 @@ do end -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) -- not checking the max at this point since clue offsets are calculated dynamically if tokenCount < 1 then return end @@ -1642,12 +1714,12 @@ do end -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned + ---@param callback? function A callback function triggered after the new token is spawned TokenManager.spawnToken = function(position, tokenType, rotation, callback) internal.initTokenTemplates() local loadTokenType = tokenType @@ -1681,9 +1753,9 @@ do end -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) TokenManager.maybeReplenishCard = function(card, uses, mat) -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) if uses[1].count and uses[1].replenish then @@ -1693,13 +1765,13 @@ do -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some -- callers. - ---@param card Object Card object to reset the tokens for + ---@param card tts__Object Card object to reset the tokens for TokenManager.resetTokensSpawned = function(card) tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) end -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addPlayerCardData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -1708,7 +1780,7 @@ do end -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addLocationData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -1717,8 +1789,8 @@ do end -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise TokenManager.hasLocationData = function(card) internal.initDataHelperData() return internal.getLocationData(card) ~= nil @@ -1748,8 +1820,8 @@ do -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 internal.spawnTokensFromUses = function(card, extraUses) local uses = internal.getUses(card) @@ -1771,7 +1843,7 @@ do -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for + ---@param card tts__Object Card to maybe spawn tokens for internal.spawnTokensFromDataHelper = function(card) internal.initDataHelperData() local playerData = internal.getPlayerCardData(card) @@ -1785,8 +1857,8 @@ do end -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) local token = playerData.tokenType @@ -1796,8 +1868,8 @@ do end -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnLocationTokensFromDataHelper = function(card, locationData) local clueCount = internal.getClueCountFromData(card, locationData) @@ -1836,7 +1908,7 @@ do end -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from + ---@param card tts__Object Card to pull the uses from internal.getUses = function(card) local metadata = JSON.decode(card.getGMNotes()) or { } if metadata.type == "Location" then @@ -1853,9 +1925,9 @@ do end -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at internal.buildClueOffsets = function(card, count) local pos = card.getPosition() local cluePositions = { } @@ -1867,9 +1939,9 @@ do return cluePositions end - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) internal.replenishTokens = function(card, uses, mat) local cardPos = card.getPosition() @@ -1915,120 +1987,53 @@ do return TokenManager end end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } + local DeckLib = {} + local searchLib = require("util/SearchLib") - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) + -- places a card/deck at a position or merges into an existing deck + ---@param obj tts__Object Object to move + ---@param pos table New position for the object + ---@param rot table New rotation for the object (optional) + DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) + if obj == nil or pos == nil then return end - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end + -- search the new position for existing card/deck + local searchResult = searchLib.atPosition(pos, "isCardOrDeck") + + -- get new position + local newPos + local offset = 0.5 + if #searchResult == 1 then + local bounds = searchResult[1].getBounds() + newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) + else + newPos = Vector(pos) + Vector(0, offset, 0) end - return objList + + -- allow moving the objects smoothly out of the hand + obj.use_hands = false + + if rot then + obj.setRotationSmooth(rot, false, true) + end + obj.setPositionSmooth(newPos, false, true) + + -- continue if the card stops smooth moving + Wait.condition( + function() + obj.use_hands = true + -- this avoids a TTS bug that merges unrelated cards that are not resting + if #searchResult == 1 and searchResult[1] ~= obj then + -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) + pcall(function() searchResult[1].putObject(obj) end) + end + end, + function() return not obj.isSmoothMoving() end, 3) end - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/Playmat") -end) -__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local MythosAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getMythosArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") - end - - -- returns the chaos token metadata (if provided through scenario reference card) - MythosAreaApi.returnTokenData = function() - return getMythosArea().call("returnTokenData") - end - - -- returns an object reference to the encounter deck - MythosAreaApi.getEncounterDeck = function() - return getMythosArea().call("getEncounterDeck") - end - - -- draw an encounter card for the requesting mat - MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) - end - - return MythosAreaApi + return DeckLib end end) return __bundle_require("__root") diff --git a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua index 40b885350..d0d54e14e 100644 --- a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua +++ b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua @@ -41,560 +41,91 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) do - local MythosAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } - local function getMythosArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + local TokenChecker = {} + + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true + else + return false + end end - -- returns the chaos token metadata (if provided through scenario reference card) - MythosAreaApi.returnTokenData = function() - return getMythosArea().call("returnTokenData") - end - - -- returns an object reference to the encounter deck - MythosAreaApi.getEncounterDeck = function() - return getMythosArea().call("getEncounterDeck") - end - - -- draw an encounter card for the requesting mat - MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) - end - - return MythosAreaApi + return TokenChecker end end) -__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local guidReferenceApi = require("core/GUIDReferenceApi") - local optionPanelApi = require("core/OptionPanelApi") - local playAreaApi = require("core/PlayAreaApi") + local DeckLib = {} local searchLib = require("util/SearchLib") - local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") - local PLAYER_CARD_TOKEN_OFFSETS = { - [1] = { - Vector(0, 3, -0.2) - }, - [2] = { - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [3] = { - Vector(0, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [4] = { - Vector(0.4, 3, -0.9), - Vector(-0.4, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [5] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.4, 3, -0.2), - Vector(-0.4, 3, -0.2) - }, - [6] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2) - }, - [7] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0, 3, 0.5) - }, - [8] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(-0.35, 3, 0.5), - Vector(0.35, 3, 0.5) - }, - [9] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5) - }, - [10] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0, 3, 1.2) - }, - [11] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(-0.35, 3, 1.2), - Vector(0.35, 3, 1.2) - }, - [12] = { - Vector(0.7, 3, -0.9), - Vector(0, 3, -0.9), - Vector(-0.7, 3, -0.9), - Vector(0.7, 3, -0.2), - Vector(0, 3, -0.2), - Vector(-0.7, 3, -0.2), - Vector(0.7, 3, 0.5), - Vector(0, 3, 0.5), - Vector(-0.7, 3, 0.5), - Vector(0.7, 3, 1.2), - Vector(0, 3, 1.2), - Vector(-0.7, 3, 1.2) - } - } + -- places a card/deck at a position or merges into an existing deck + ---@param obj tts__Object Object to move + ---@param pos table New position for the object + ---@param rot table New rotation for the object (optional) + DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) + if obj == nil or pos == nil then return end - -- stateIDs for the multi-stated resource tokens - local stateTable = { - ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, - ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 - } + -- search the new position for existing card/deck + local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - -- Table of data extracted from the token source bag, keyed by the Memo on each token which - -- should match the token type keys ("resource", "clue", etc) - local tokenTemplates - - local playerCardData - local locationData - - local TokenManager = { } - local internal = { } - - -- Spawns tokens for the card. This function is built to just throw a card at it and let it do - -- the work once a card has hit an area where it might spawn tokens. It will check to see if - -- the card has already spawned, find appropriate data from either the uses metadata or the Data - -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - TokenManager.spawnForCard = function(card, extraUses) - if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then - return - end - local metadata = JSON.decode(card.getGMNotes()) - if metadata ~= nil then - internal.spawnTokensFromUses(card, extraUses) + -- get new position + local newPos + local offset = 0.5 + if #searchResult == 1 then + local bounds = searchResult[1].getBounds() + newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) else - internal.spawnTokensFromDataHelper(card) + newPos = Vector(pos) + Vector(0, offset, 0) end - end - -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the - -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) - local optionPanel = optionPanelApi.getOptions() + -- allow moving the objects smoothly out of the hand + obj.use_hands = false - if tokenType == "damage" or tokenType == "horror" then - TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then - TokenManager.spawnResourceCounterToken(card, tokenCount) - elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then - TokenManager.spawnResourceCounterToken(card, tokenCount) - else - TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) + if rot then + obj.setRotationSmooth(rot, false, true) end - end + obj.setPositionSmooth(newPos, false, true) - -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror - -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other - -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to - TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) - if tokenValue < 1 or tokenValue > 50 then return end - - local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) end) - end - - TokenManager.spawnResourceCounterToken = function(card, tokenCount) - local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) - local rot = card.getRotation() - TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) - spawned.call("updateVal", tokenCount) - end) - end - - -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". - -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens - TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) - -- not checking the max at this point since clue offsets are calculated dynamically - if tokenCount < 1 then return end - - local offsets = {} - if tokenType == "clue" then - offsets = internal.buildClueOffsets(card, tokenCount) - else - -- only up to 12 offset tables defined - if tokenCount > 12 then return end - for i = 1, tokenCount do - offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) - -- Fix the y-position for the spawn, since positionToWorld considers rotation which can - -- have bad results for face up/down differences - offsets[i].y = card.getPosition().y + 0.15 + -- continue if the card stops smooth moving + Wait.condition( + function() + obj.use_hands = true + -- this avoids a TTS bug that merges unrelated cards that are not resting + if #searchResult == 1 and searchResult[1] ~= obj then + -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) + pcall(function() searchResult[1].putObject(obj) end) end - end - - if shiftDown ~= nil then - -- Copy the offsets to make sure we don't change the static values - local baseOffsets = offsets - offsets = { } - - -- get a vector for the shifting (downwards local to the card) - local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) - for i, baseOffset in ipairs(baseOffsets) do - offsets[i] = baseOffset + shiftDownVector - end - end - - if offsets == nil then - error("couldn't find offsets for " .. tokenCount .. ' tokens') - return - end - - -- handling for not provided subtype (for example when spawning from custom data helpers) - if subType == nil then - subType = "" - end - - -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") - local callback = nil - local stateID = stateTable[string.lower(subType)] - if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then - callback = function(spawned) spawned.setState(stateID) end - end - - for i = 1, tokenCount do - TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) - end + end, + function() return not obj.isSmoothMoving() end, 3) end - -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, - -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned - TokenManager.spawnToken = function(position, tokenType, rotation, callback) - internal.initTokenTemplates() - local loadTokenType = tokenType - if tokenType == "clue" or tokenType == "doom" then - loadTokenType = "clueDoom" - end - if tokenTemplates[loadTokenType] == nil then - error("Unknown token type '" .. tokenType .. "'") - return - end - local tokenTemplate = tokenTemplates[loadTokenType] - - -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag - local rot = Vector(tokenTemplate.Transform.rotX, - 270, - tokenTemplate.Transform.rotZ) - if rotation ~= nil then - rot.y = rotation.y - end - if tokenType == "doom" then - rot.z = 180 - end - - tokenTemplate.Nickname = "" - return spawnObjectData({ - data = tokenTemplate, - position = position, - rotation = rot, - callback_function = callback - }) - end - - -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - TokenManager.maybeReplenishCard = function(card, uses, mat) - -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) - if uses[1].count and uses[1].replenish then - internal.replenishTokens(card, uses, mat) - end - end - - -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some - -- callers. - ---@param card Object Card object to reset the tokens for - TokenManager.resetTokensSpawned = function(card) - tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) - end - - -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addPlayerCardData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - playerCardData[k] = v - end - end - - -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style - TokenManager.addLocationData = function(dataTable) - internal.initDataHelperData() - for k, v in pairs(dataTable) do - locationData[k] = v - end - end - - -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise - TokenManager.hasLocationData = function(card) - internal.initDataHelperData() - return internal.getLocationData(card) ~= nil - end - - internal.initTokenTemplates = function() - if tokenTemplates ~= nil then - return - end - tokenTemplates = {} - local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") - for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do - local tokenName = tokenTemplate.Memo - tokenTemplates[tokenName] = tokenTemplate - end - end - - -- Copies the data from the DataHelper. Will only happen once. - internal.initDataHelperData = function() - if playerCardData ~= nil then - return - end - local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') - locationData = dataHelper.getTable('LOCATIONS_DATA') - end - - -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens - --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 - internal.spawnTokensFromUses = function(card, extraUses) - local uses = internal.getUses(card) - if uses == nil then return end - - -- go through tokens to spawn - local tokenCount - for i, useInfo in ipairs(uses) do - tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() - if extraUses ~= nil and extraUses[useInfo.type] ~= nil then - tokenCount = tokenCount + extraUses[useInfo.type] - end - -- Shift each spawned group after the first down so they don't pile on each other - TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) - end - - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - - -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state - -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - internal.spawnTokensFromDataHelper = function(card) - internal.initDataHelperData() - local playerData = internal.getPlayerCardData(card) - if playerData ~= nil then - internal.spawnPlayerCardTokensFromDataHelper(card, playerData) - end - local locationData = internal.getLocationData(card) - if locationData ~= nil then - internal.spawnLocationTokensFromDataHelper(card, locationData) - end - end - - -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) - local token = playerData.tokenType - local tokenCount = playerData.tokenCount - TokenManager.spawnTokenGroup(card, token, tokenCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - - -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be - -- the right data for this card. - internal.spawnLocationTokensFromDataHelper = function(card, locationData) - local clueCount = internal.getClueCountFromData(card, locationData) - if clueCount > 0 then - TokenManager.spawnTokenGroup(card, "clue", clueCount) - tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) - end - end - - internal.getPlayerCardData = function(card) - return playerCardData[card.getName() .. ':' .. card.getDescription()] - or playerCardData[card.getName()] - end - - internal.getLocationData = function(card) - return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] - end - - internal.getClueCountFromData = function(card, locationData) - -- Return the number of clues to spawn on this location - if locationData == nil then - error('attempted to get clue for unexpected object: ' .. card.getName()) - return 0 - end - - if ((card.is_face_down and locationData.clueSide == 'back') - or (not card.is_face_down and locationData.clueSide == 'front')) then - if locationData.type == 'fixed' then - return locationData.value - elseif locationData.type == 'perPlayer' then - return locationData.value * playAreaApi.getInvestigatorCount() - end - error('unexpected location type: ' .. locationData.type) - end - return 0 - end - - -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from - internal.getUses = function(card) - local metadata = JSON.decode(card.getGMNotes()) or { } - if metadata.type == "Location" then - if card.is_face_down and metadata.locationBack ~= nil then - return metadata.locationBack.uses - elseif not card.is_face_down and metadata.locationFront ~= nil then - return metadata.locationFront.uses - end - elseif not card.is_face_down then - return metadata.uses - end - - return nil - end - - -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at - internal.buildClueOffsets = function(card, count) - local pos = card.getPosition() - local cluePositions = { } - for i = 1, count do - local column = math.floor((i - 1) / 4) - local row = (i - 1) % 4 - table.insert(cluePositions, Vector(pos.x - 1 + 0.55 * row, pos.y, pos.z - 1.4 - 0.55 * column)) - end - return cluePositions - end - - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) - internal.replenishTokens = function(card, uses, mat) - local cardPos = card.getPosition() - - -- don't continue for cards on the deck (Norman) or in the discard pile - if mat.positionToLocal(cardPos).x < -1 then return end - - -- get current amount of resource tokens on the card - local clickableResourceCounter = nil - local foundTokens = 0 - - for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do - local memo = obj.getMemo() - - if (stateTable[memo] or 0) > 0 then - foundTokens = foundTokens + math.abs(obj.getQuantity()) - obj.destruct() - elseif memo == "resourceCounter" then - foundTokens = obj.getVar("val") - clickableResourceCounter = obj - break - end - end - - -- this is the theoretical new amount of uses (to be checked below) - local newCount = foundTokens + uses[1].replenish - - -- if there are already more uses than the replenish amount, keep them - if foundTokens > uses[1].count then - newCount = foundTokens - -- only replenish up until the replenish amount - elseif newCount > uses[1].count then - newCount = uses[1].count - end - - -- update the clickable counter or spawn a group of tokens - if clickableResourceCounter then - clickableResourceCounter.call("updateVal", newCount) - else - TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) - end - end - - return TokenManager + return DeckLib end end) __bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -602,12 +133,12 @@ do local OptionPanelApi = {} -- loads saved options - ---@param options Table New options table + ---@param options table Set a new state for the option table OptionPanelApi.loadSettings = function(options) return Global.call("loadSettings", options) end - -- returns option panel table + ---@return any: Table of option panel state OptionPanelApi.getOptions = function() return Global.getTable("optionPanel") end @@ -615,6 +146,9 @@ do return OptionPanelApi end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playermat/Playmat") +end) __bundle_register("playermat/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") local deckLib = require("util/DeckLib") @@ -762,8 +296,8 @@ function onLoad(saveState) end showDrawButton(isDrawButtonVisible) - collisionEnabled = true math.randomseed(os.time()) + Wait.time(function() collisionEnabled = true end, 0.1) end --------------------------------------------------------- @@ -808,8 +342,8 @@ function doNotReady(card) end -- rounds a number to the specified amount of decimal places ----@param num Number Initial value ----@param numDecimalPlaces Number Amount of decimal places +---@param num number Initial value +---@param numDecimalPlaces number Amount of decimal places function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult @@ -820,7 +354,7 @@ end --------------------------------------------------------- -- handles discarding for a list of objects ----@param objList Table List of objects to discard +---@param objList table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do if obj.type == "Card" or obj.type == "Deck" then @@ -918,14 +452,12 @@ function doUpkeep(_, clickedByColor, isRightClick) -- flip investigator mini-card and summoned servitor mini-card -- (all characters allowed to account for custom IDs - e.g. 'Z0000' for TTS Zoop generated IDs) - if activeInvestigatorId ~= nil then - local miniId = string.match(activeInvestigatorId, ".....") .. "-m" - for _, obj in ipairs(getObjects()) do - if obj.type == "Card" and obj.is_face_down then - local notes = JSON.decode(obj.getGMNotes()) - if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then - obj.flip() - end + local miniId = string.match(activeInvestigatorId, ".....") .. "-m" + for _, obj in ipairs(getObjects()) do + if obj.type == "Card" and obj.is_face_down then + local notes = JSON.decode(obj.getGMNotes()) + if notes ~= nil and notes.type == "Minicard" and (notes.id == miniId or notes.id == "09080-m") then + obj.flip() end end end @@ -1065,7 +597,6 @@ function flipTopCardFromDeck() Wait.time(function() local deckAreaObjects = getDeckAreaObjects() if deckAreaObjects.topCard then - return elseif deckAreaObjects.draw then if deckAreaObjects.draw.type == "Card" then deckAreaObjects.draw.flip() @@ -1105,7 +636,9 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) - broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") + + local playerName = Player[playerColor].steam_name or playerColor + broadcastToAll(playerName .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1374,7 +907,7 @@ end --------------------------------------------------------- -- updates the specific owned counter ----@param param Table Contains the information to update: +---@param param table Contains the information to update: --- type: String Counter to target --- newValue: Number Value to set the counter to --- modifier: Number If newValue is not provided, the existing value will be adjusted by this modifier @@ -1388,7 +921,7 @@ function updateCounter(param) end -- returns the resource counter amount ----@param type String Counter to target +---@param type string Counter to target function getCounterValue(type) return ownedObjects[type].getVar("val") end @@ -1420,7 +953,7 @@ function returnGlobalDiscardPosition() end -- Sets this playermat's draw 1 button to visible ----@param visible Boolean. Whether the draw 1 button should be visible +---@param visible boolean Whether the draw 1 button should be visible function showDrawButton(visible) isDrawButtonVisible = visible @@ -1449,7 +982,7 @@ function showDrawButton(visible) end -- shows / hides a clickable clue counter for this playmat and sets the correct amount of clues ----@param showCounter Boolean Whether the clickable clue counter should be visible +---@param showCounter boolean Whether the clickable clue counter should be visible function clickableClues(showCounter) local clickerPos = ownedObjects.ClickableClueCounter.getPosition() local clueCount = 0 @@ -1487,7 +1020,7 @@ function removeClues() end -- reports the clue count ----@param useClickableCounters Boolean Controls which type of counter is getting checked +---@param useClickableCounters boolean Controls which type of counter is getting checked function getClueCount(useClickableCounters) if useClickableCounters then return ownedObjects.ClickableClueCounter.getVar("val") @@ -1496,11 +1029,10 @@ function getClueCount(useClickableCounters) end end --- Sets this playermat's snap points to limit snapping to matching card types or not. If matchTypes +-- Sets this playermat's snap points to limit snapping to matching card types or not. If 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 matchTypes Boolean. Whether snap points should only snap for the matching card types. +-- will only snap Investigators. If matchTypes is false, snap points will be reset to snap all cards. +---@param matchTypes boolean Whether snap points should only snap for the matching card types. function setLimitSnapsByType(matchTypes) local snaps = self.getSnapPoints() for i, snap in ipairs(snaps) do @@ -1534,10 +1066,10 @@ function setLimitSnapsByType(matchTypes) end -- Simple method to check if the given point is in a specified area. Local use only, ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within. See MAIN_PLAY_AREA for sample -- bounds definition. ----@return Boolean True if the point is in the area defined by bounds +---@return boolean: True if the point is in the area defined by bounds function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -1558,7 +1090,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -1585,29 +1117,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -1616,14 +1149,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -1635,6 +1172,79 @@ do return ChaosBagApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local MythosAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getMythosArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") + end + + ---@return any: Table of chaos token metadata (if provided through scenario reference card) + MythosAreaApi.returnTokenData = function() + return getMythosArea().call("returnTokenData") + end + + ---@return any: Object reference to the encounter deck + MythosAreaApi.getEncounterDeck = function() + return getMythosArea().call("getEncounterDeck") + end + + -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) + end + + return MythosAreaApi +end +end) __bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local NavigationOverlayApi = {} @@ -1644,25 +1254,25 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") end - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player NavigationOverlayApi.copyVisibility = function(startColor, targetColor) getNOHandler().call("copyVisibility", { startColor = startColor, targetColor = targetColor }) - end + end - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for NavigationOverlayApi.cycleVisibility = function(playerColor) getNOHandler().call("cycleVisibility", playerColor) end -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to NavigationOverlayApi.loadCamera = function(player, camera) getNOHandler().call("loadCameraFromApi", { player = player, @@ -1673,91 +1283,533 @@ do return NavigationOverlayApi end end) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/token/TokenManager", function(require, _LOADED, __bundle_register, __bundle_modules) do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true + local guidReferenceApi = require("core/GUIDReferenceApi") + local optionPanelApi = require("core/OptionPanelApi") + local playAreaApi = require("core/PlayAreaApi") + local searchLib = require("util/SearchLib") + local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") + + local PLAYER_CARD_TOKEN_OFFSETS = { + [1] = { + Vector(0, 3, -0.2) + }, + [2] = { + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [3] = { + Vector(0, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [4] = { + Vector(0.4, 3, -0.9), + Vector(-0.4, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [5] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.4, 3, -0.2), + Vector(-0.4, 3, -0.2) + }, + [6] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2) + }, + [7] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0, 3, 0.5) + }, + [8] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(-0.35, 3, 0.5), + Vector(0.35, 3, 0.5) + }, + [9] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5) + }, + [10] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0, 3, 1.2) + }, + [11] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(-0.35, 3, 1.2), + Vector(0.35, 3, 1.2) + }, + [12] = { + Vector(0.7, 3, -0.9), + Vector(0, 3, -0.9), + Vector(-0.7, 3, -0.9), + Vector(0.7, 3, -0.2), + Vector(0, 3, -0.2), + Vector(-0.7, 3, -0.2), + Vector(0.7, 3, 0.5), + Vector(0, 3, 0.5), + Vector(-0.7, 3, 0.5), + Vector(0.7, 3, 1.2), + Vector(0, 3, 1.2), + Vector(-0.7, 3, 1.2) + } } - local TokenChecker = {} + -- stateIDs for the multi-stated resource tokens + local stateTable = { + ["resource"] = 1, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, + ["evidence"] = 5, + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 + } - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true + -- Table of data extracted from the token source bag, keyed by the Memo on each token which + -- should match the token type keys ("resource", "clue", etc) + local tokenTemplates + + local playerCardData + local locationData + + local TokenManager = { } + local internal = { } + + -- Spawns tokens for the card. This function is built to just throw a card at it and let it do + -- the work once a card has hit an area where it might spawn tokens. It will check to see if + -- the card has already spawned, find appropriate data from either the uses metadata or the Data + -- Helper, and spawn the tokens. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + TokenManager.spawnForCard = function(card, extraUses) + if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then + return + end + local metadata = JSON.decode(card.getGMNotes()) + if metadata ~= nil then + internal.spawnTokensFromUses(card, extraUses) else - return false + internal.spawnTokensFromDataHelper(card) end end - return TokenChecker -end -end) -__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local DeckLib = {} - local searchLib = require("util/SearchLib") + -- Spawns a set of tokens on the given card. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the + -- spawned state object rather than spawning multiple tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) + local optionPanel = optionPanelApi.getOptions() - -- places a card/deck at a position or merges into an existing deck - ---@param obj TTSObject Object to move - ---@param pos Table New position for the object - ---@param rot Table New rotation for the object (optional) - DeckLib.placeOrMergeIntoDeck = function(obj, pos, rot) - if obj == nil or pos == nil then return end - - -- search the new position for existing card/deck - local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - - -- get new position - local newPos - local offset = 0.5 - if #searchResult == 1 then - local bounds = searchResult[1].getBounds() - newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) + if tokenType == "damage" or tokenType == "horror" then + TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "enabled" then + TokenManager.spawnResourceCounterToken(card, tokenCount) + elseif tokenType == "resource" and optionPanel["useResourceCounters"] == "custom" and tokenCount == 0 then + TokenManager.spawnResourceCounterToken(card, tokenCount) else - newPos = Vector(pos) + Vector(0, offset, 0) + TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown, subType) end + end - -- allow moving the objects smoothly out of the hand - obj.use_hands = false + -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror + -- tokens. + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other + -- types should use spawnMultipleTokens() + ---@param tokenValue number Value to set the damage/horror to + TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) + if tokenValue < 1 or tokenValue > 50 then return end - if rot then - obj.setRotationSmooth(rot, false, true) - end - obj.setPositionSmooth(newPos, false, true) + local pos = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[1][1] + Vector(0, 0, shiftDown)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, tokenType, rot, function(spawned) spawned.setState(tokenValue) end) + end - -- continue if the card stops smooth moving - Wait.condition( - function() - obj.use_hands = true - -- this avoids a TTS bug that merges unrelated cards that are not resting - if #searchResult == 1 and searchResult[1] ~= obj then - -- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put) - pcall(function() searchResult[1].putObject(obj) end) + TokenManager.spawnResourceCounterToken = function(card, tokenCount) + local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5)) + local rot = card.getRotation() + TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned) + spawned.call("updateVal", tokenCount) + end) + end + + -- Spawns a number of tokens. + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". + -- Other types should use spawnCounterToken() + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens + TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) + -- not checking the max at this point since clue offsets are calculated dynamically + if tokenCount < 1 then return end + + local offsets = {} + if tokenType == "clue" then + offsets = internal.buildClueOffsets(card, tokenCount) + else + -- only up to 12 offset tables defined + if tokenCount > 12 then return end + for i = 1, tokenCount do + offsets[i] = card.positionToWorld(PLAYER_CARD_TOKEN_OFFSETS[tokenCount][i]) + -- Fix the y-position for the spawn, since positionToWorld considers rotation which can + -- have bad results for face up/down differences + offsets[i].y = card.getPosition().y + 0.15 end - end, - function() return not obj.isSmoothMoving() end, 3) + end + + if shiftDown ~= nil then + -- Copy the offsets to make sure we don't change the static values + local baseOffsets = offsets + offsets = { } + + -- get a vector for the shifting (downwards local to the card) + local shiftDownVector = Vector(0, 0, shiftDown):rotateOver("y", card.getRotation().y) + for i, baseOffset in ipairs(baseOffsets) do + offsets[i] = baseOffset + shiftDownVector + end + end + + if offsets == nil then + error("couldn't find offsets for " .. tokenCount .. ' tokens') + return + end + + -- handling for not provided subtype (for example when spawning from custom data helpers) + if subType == nil then + subType = "" + end + + -- this is used to load the correct state for additional resource tokens (e.g. "Ammo") + local callback = nil + local stateID = stateTable[string.lower(subType)] + if tokenType == "resource" and stateID ~= nil and stateID ~= 1 then + callback = function(spawned) spawned.setState(stateID) end + end + + for i = 1, tokenCount do + TokenManager.spawnToken(offsets[i], tokenType, card.getRotation(), callback) + end end - return DeckLib + -- Spawns a single token at the given global position by copying it from the template bag. + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", + -- "resource", "doom", or "clue" + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, + -- x and z will use the default rotation from the source bag + ---@param callback? function A callback function triggered after the new token is spawned + TokenManager.spawnToken = function(position, tokenType, rotation, callback) + internal.initTokenTemplates() + local loadTokenType = tokenType + if tokenType == "clue" or tokenType == "doom" then + loadTokenType = "clueDoom" + end + if tokenTemplates[loadTokenType] == nil then + error("Unknown token type '" .. tokenType .. "'") + return + end + local tokenTemplate = tokenTemplates[loadTokenType] + + -- Take ONLY the Y-value for rotation, so we don't flip the token coming out of the bag + local rot = Vector(tokenTemplate.Transform.rotX, + 270, + tokenTemplate.Transform.rotZ) + if rotation ~= nil then + rot.y = rotation.y + end + if tokenType == "doom" then + rot.z = 180 + end + + tokenTemplate.Nickname = "" + return spawnObjectData({ + data = tokenTemplate, + position = position, + rotation = rot, + callback_function = callback + }) + end + + -- Checks a card for metadata to maybe replenish it + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + TokenManager.maybeReplenishCard = function(card, uses, mat) + -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) + if uses[1].count and uses[1].replenish then + internal.replenishTokens(card, uses, mat) + end + end + + -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some + -- callers. + ---@param card tts__Object Card object to reset the tokens for + TokenManager.resetTokensSpawned = function(card) + tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) + end + + -- Pushes new player card data into the local copy of the Data Helper player data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addPlayerCardData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + playerCardData[k] = v + end + end + + -- Pushes new location data into the local copy of the Data Helper location data. + ---@param dataTable table Key/Value pairs following the DataHelper style + TokenManager.addLocationData = function(dataTable) + internal.initDataHelperData() + for k, v in pairs(dataTable) do + locationData[k] = v + end + end + + -- Checks to see if the given card has location data in the DataHelper + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise + TokenManager.hasLocationData = function(card) + internal.initDataHelperData() + return internal.getLocationData(card) ~= nil + end + + internal.initTokenTemplates = function() + if tokenTemplates ~= nil then + return + end + tokenTemplates = {} + local tokenSource = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSource") + for _, tokenTemplate in ipairs(tokenSource.getData().ContainedObjects) do + local tokenName = tokenTemplate.Memo + tokenTemplates[tokenName] = tokenTemplate + end + end + + -- Copies the data from the DataHelper. Will only happen once. + internal.initDataHelperData = function() + if playerCardData ~= nil then + return + end + local dataHelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") + playerCardData = dataHelper.getTable('PLAYER_CARD_DATA') + locationData = dataHelper.getTable('LOCATIONS_DATA') + end + + -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens + --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 + internal.spawnTokensFromUses = function(card, extraUses) + local uses = internal.getUses(card) + if uses == nil then return end + + -- go through tokens to spawn + local tokenCount + for i, useInfo in ipairs(uses) do + tokenCount = (useInfo.count or 0) + (useInfo.countPerInvestigator or 0) * playAreaApi.getInvestigatorCount() + if extraUses ~= nil and extraUses[useInfo.type] ~= nil then + tokenCount = tokenCount + extraUses[useInfo.type] + end + -- Shift each spawned group after the first down so they don't pile on each other + TokenManager.spawnTokenGroup(card, useInfo.token, tokenCount, (i - 1) * 0.8, useInfo.type) + end + + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state + -- of the card for both locations and standard cards. + ---@param card tts__Object Card to maybe spawn tokens for + internal.spawnTokensFromDataHelper = function(card) + internal.initDataHelperData() + local playerData = internal.getPlayerCardData(card) + if playerData ~= nil then + internal.spawnPlayerCardTokensFromDataHelper(card, playerData) + end + local locationData = internal.getLocationData(card) + if locationData ~= nil then + internal.spawnLocationTokensFromDataHelper(card, locationData) + end + end + + -- Spawn tokens for a player card using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) + local token = playerData.tokenType + local tokenCount = playerData.tokenCount + TokenManager.spawnTokenGroup(card, token, tokenCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + + -- Spawn tokens for a location using data retrieved from the Data Helper. + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be + -- the right data for this card. + internal.spawnLocationTokensFromDataHelper = function(card, locationData) + local clueCount = internal.getClueCountFromData(card, locationData) + if clueCount > 0 then + TokenManager.spawnTokenGroup(card, "clue", clueCount) + tokenSpawnTrackerApi.markTokensSpawned(card.getGUID()) + end + end + + internal.getPlayerCardData = function(card) + return playerCardData[card.getName() .. ':' .. card.getDescription()] + or playerCardData[card.getName()] + end + + internal.getLocationData = function(card) + return locationData[card.getName() .. '_' .. card.getGUID()] or locationData[card.getName()] + end + + internal.getClueCountFromData = function(card, locationData) + -- Return the number of clues to spawn on this location + if locationData == nil then + error('attempted to get clue for unexpected object: ' .. card.getName()) + return 0 + end + + if ((card.is_face_down and locationData.clueSide == 'back') + or (not card.is_face_down and locationData.clueSide == 'front')) then + if locationData.type == 'fixed' then + return locationData.value + elseif locationData.type == 'perPlayer' then + return locationData.value * playAreaApi.getInvestigatorCount() + end + error('unexpected location type: ' .. locationData.type) + end + return 0 + end + + -- Gets the right uses structure for this card, based on metadata and face up/down state + ---@param card tts__Object Card to pull the uses from + internal.getUses = function(card) + local metadata = JSON.decode(card.getGMNotes()) or { } + if metadata.type == "Location" then + if card.is_face_down and metadata.locationBack ~= nil then + return metadata.locationBack.uses + elseif not card.is_face_down and metadata.locationFront ~= nil then + return metadata.locationFront.uses + end + elseif not card.is_face_down then + return metadata.uses + end + + return nil + end + + -- Dynamically create positions for clues on a card. + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at + internal.buildClueOffsets = function(card, count) + local pos = card.getPosition() + local cluePositions = { } + for i = 1, count do + local row = math.floor(1 + (i - 1) / 4) + local column = (i - 1) % 4 + table.insert(cluePositions, Vector(pos.x + 1.5 - 0.55 * row, pos.y + 0.15, pos.z - 0.825 + 0.55 * column)) + end + return cluePositions + end + + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) + internal.replenishTokens = function(card, uses, mat) + local cardPos = card.getPosition() + + -- don't continue for cards on the deck (Norman) or in the discard pile + if mat.positionToLocal(cardPos).x < -1 then return end + + -- get current amount of resource tokens on the card + local clickableResourceCounter = nil + local foundTokens = 0 + + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do + local memo = obj.getMemo() + + if (stateTable[memo] or 0) > 0 then + foundTokens = foundTokens + math.abs(obj.getQuantity()) + obj.destruct() + elseif memo == "resourceCounter" then + foundTokens = obj.getVar("val") + clickableResourceCounter = obj + break + end + end + + -- this is the theoretical new amount of uses (to be checked below) + local newCount = foundTokens + uses[1].replenish + + -- if there are already more uses than the replenish amount, keep them + if foundTokens > uses[1].count then + newCount = foundTokens + -- only replenish up until the replenish amount + elseif newCount > uses[1].count then + newCount = uses[1].count + end + + -- update the clickable counter or spawn a group of tokens + if clickableResourceCounter then + clickableResourceCounter.call("updateVal", newCount) + else + TokenManager.spawnTokenGroup(card, uses[1].token, newCount, _, uses[1].type) + end + end + + return TokenManager end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1773,14 +1825,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -1793,7 +1848,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -1842,60 +1897,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -1912,13 +1962,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -1938,7 +1988,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -1986,49 +2036,4 @@ do return TokenSpawnTracker end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/Playmat") -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") diff --git a/unpacked/Custom_Token Search-A-Card 24051a.ttslua b/unpacked/Custom_Tile Search-A-Card 24051a.ttslua similarity index 68% rename from unpacked/Custom_Token Search-A-Card 24051a.ttslua rename to unpacked/Custom_Tile Search-A-Card 24051a.ttslua index d5a5c118d..3d47877ad 100644 --- a/unpacked/Custom_Token Search-A-Card 24051a.ttslua +++ b/unpacked/Custom_Tile Search-A-Card 24051a.ttslua @@ -47,121 +47,124 @@ end) __bundle_register("playercards/CardSearch", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/PlayerCardSpawner") -local allCardsBagApi = require("playercards/AllCardsBagApi") +local allCardsBagApi = require("playercards/AllCardsBagApi") -local buttonParameters = {} -buttonParameters.function_owner = self -buttonParameters.height = 200 -buttonParameters.width = 1200 -buttonParameters.font_size = 75 +local BUTTON_LABELS = {} +BUTTON_LABELS["spawn"] = {} +BUTTON_LABELS["spawn"][true] = "All matching cards" +BUTTON_LABELS["spawn"][false] = "First matching card" +BUTTON_LABELS["search"] = {} +BUTTON_LABELS["search"][true] = "Name equals search term" +BUTTON_LABELS["search"][false] = "Name contains search term" -local BUTTON_LABELS = {} +local inputParameters = {} +inputParameters.label = "Click to enter card name" +inputParameters.input_function = "input_func" +inputParameters.function_owner = self +inputParameters.alignment = 2 +inputParameters.position = { x = 0, y = 0.1, z = -0.62 } +inputParameters.width = 3750 +inputParameters.height = 380 +inputParameters.font_size = 350 +inputParameters.scale = { 0.1, 1, 0.1 } +inputParameters.color = { 0.9, 0.7, 0.5 } +inputParameters.font_color = { 0, 0, 0 } -BUTTON_LABELS["spawn"] = {} -BUTTON_LABELS["spawn"][true] = "Mode: Spawn all matching cards " -BUTTON_LABELS["spawn"][false] = "Mode: Spawn first matching card" - -BUTTON_LABELS["search"] = {} -BUTTON_LABELS["search"][true] = "Mode: Name matches search term" -BUTTON_LABELS["search"][false] = "Mode: Name contains search term" - -local inputParameters = {} -inputParameters.label = "Click to enter card name" -inputParameters.input_function = "input_func" -inputParameters.function_owner = self -inputParameters.alignment = 2 -inputParameters.position = { 0, 0.05, -1.6 } -inputParameters.width = 1200 -inputParameters.height = 130 -inputParameters.font_size = 107 - --- main code -function onSave() - return JSON.encode({ spawnAll, searchExact, inputParameters.value }) -end +function onSave() return JSON.encode({ spawnAll, searchExact, inputParameters.value }) end function onLoad(savedData) - local loadedData = JSON.decode(savedData) - spawnAll = loadedData[1] or false - searchExact = loadedData[2] or false - inputParameters.value = loadedData[3] or "" + local loadedData = JSON.decode(savedData) + spawnAll = loadedData[1] or false + searchExact = loadedData[2] or false + inputParameters.value = loadedData[3] or "" + self.createInput(inputParameters) - -- index 0: button for spawn mode - buttonParameters.click_function = "search" - buttonParameters.label = "Spawn matching card(s)!" - buttonParameters.position = { 0, 0.06, 1.15 } - self.createButton(buttonParameters) + -- shared parameters + local buttonParameters = {} + buttonParameters.function_owner = self + buttonParameters.font_size = 180 + buttonParameters.scale = { 0.1, 1, 0.1 } + buttonParameters.hover_color = { 0.4, 0.6, 0.8 } + buttonParameters.color = { 0.9, 0.7, 0.5 } - -- index 1: button for spawn mode - buttonParameters.click_function = "spawnMode" - buttonParameters.label = BUTTON_LABELS["spawn"][spawnAll] - buttonParameters.position[3] = buttonParameters.position[3] + 0.4 - self.createButton(buttonParameters) + -- index 0: button for spawn mode + buttonParameters.click_function = "toggleSpawnMode" + buttonParameters.label = BUTTON_LABELS["spawn"][spawnAll] + buttonParameters.position = { x = 0.16, y = 0.1, z = 0.565 } + buttonParameters.height = 375 + buttonParameters.width = 2300 + self.createButton(buttonParameters) - -- index 2: button for search mode - buttonParameters.click_function = "searchMode" - buttonParameters.label = BUTTON_LABELS["search"][searchExact] - buttonParameters.position[3] = buttonParameters.position[3] + 0.4 - self.createButton(buttonParameters) + -- index 1: button for search mode + buttonParameters.click_function = "toggleSearchMode" + buttonParameters.label = BUTTON_LABELS["search"][searchExact] + buttonParameters.position = { x = 0.16, y = 0.1, z = 0.652 } + self.createButton(buttonParameters) - self.createInput(inputParameters) + -- index 2: start search + buttonParameters.click_function = "startSearch" + buttonParameters.label = "" + buttonParameters.position = { x = 0, y = 0, z = 0.806 } + buttonParameters.height = 600 + buttonParameters.width = 2800 + self.createButton(buttonParameters) end -function spawnMode() - spawnAll = not spawnAll - self.editButton({ index = 1, label = BUTTON_LABELS["spawn"][spawnAll] }) +function toggleSpawnMode() + spawnAll = not spawnAll + self.editButton({ index = 0, label = BUTTON_LABELS["spawn"][spawnAll] }) end -function searchMode() - searchExact = not searchExact - self.editButton({ index = 2, label = BUTTON_LABELS["search"][searchExact] }) +function toggleSearchMode() + searchExact = not searchExact + self.editButton({ index = 1, label = BUTTON_LABELS["search"][searchExact] }) end -- if "Enter press" (\n) is found, start search and recreate input function input_func(_, _, input, stillEditing) - if not stillEditing then - inputParameters.value = input - elseif string.find(input, "%\n") ~= nil then - inputParameters.value = input.gsub(input, "%\n", "") - search() - self.removeInput(0) - self.createInput(inputParameters) - end + if not stillEditing then + inputParameters.value = input + elseif string.find(input, "%\n") ~= nil then + inputParameters.value = input.gsub(input, "%\n", "") + startSearch() + self.removeInput(0) + self.createInput(inputParameters) + end end -function search() - if inputParameters.value == nil or string.len(inputParameters.value) == 0 then - printToAll("Please enter a search string.", "Yellow") - return - end +function startSearch() + if inputParameters.value == nil or string.len(inputParameters.value) == 0 then + printToAll("Please enter a search string.", "Yellow") + return + end - if string.len(inputParameters.value) < 3 then - printToAll("Please enter a longer search string.", "Yellow") - return - end - - if not allCardsBagApi.isBagPresent() then - printToAll("Player card bag couldn't be found.", "Red") - return - end + if string.len(inputParameters.value) < 3 then + printToAll("Please enter a longer search string.", "Yellow") + return + end - -- search all objects in bag - local cardList = allCardsBagApi.getCardsByName(inputParameters.value, searchExact) - if cardList == nil or #cardList == 0 then - printToAll("No match found.", "Red") - return - end - if (#cardList > 100) then - printToAll("Matched more than 100 cards, please try a more specific search.", "Yellow") - return - end + if not allCardsBagApi.isBagPresent() then + printToAll("Player card bag couldn't be found.", "Red") + return + end - -- sort table by name (reverse for multiple results, because bottom card spawns first) - table.sort(cardList, function(k1, k2) return spawnAll == (k1.data.Nickname > k2.data.Nickname) end) + -- search all objects in bag + local cardList = allCardsBagApi.getCardsByName(inputParameters.value, searchExact) + if cardList == nil or #cardList == 0 then + printToAll("No match found.", "Red") + return + end + if (#cardList > 100) then + printToAll("Matched more than 100 cards, please try a more specific search.", "Yellow") + return + end - local rot = self.getRotation() - local pos = self.positionToWorld(Vector(0, 2, -0.225)) - Spawner.spawnCards(cardList, pos, rot, true) + -- sort table by name (reverse for multiple results, because bottom card spawns first) + table.sort(cardList, function(k1, k2) return spawnAll == (k1.data.Nickname > k2.data.Nickname) end) + + local rot = self.getRotation() + local pos = self.positionToWorld(Vector(0, 2, -0.08)) + Spawner.spawnCards(cardList, pos, rot, true) end end) __bundle_register("playercards/AllCardsBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -188,7 +191,7 @@ do -- it will be removed from the list and cannot be selected again until a reload -- occurs or the indexes are rebuilt, which will refresh the list to include all -- weaknesses. - ---@return id String ID of the selected weakness. + ---@return string: ID of the selected weakness. AllCardsBagApi.getRandomWeaknessId = function() return getAllCardsBag().call("getRandomWeaknessId") end @@ -208,8 +211,8 @@ do -- Searches the bag for cards which match the given name and returns a list. Note that this is -- an O(n) search without index support. It may be slow. - ---@param name String or string fragment to search for names - ---@param exact Boolean Whether the name match should be exact + ---@param name string or string fragment to search for names + ---@param exact boolean Whether the name match should be exact AllCardsBagApi.getCardsByName = function(name, exact) return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) end @@ -219,9 +222,9 @@ do end -- Returns a list of cards from the bag matching a class and level (0 or upgraded) - ---@param class String class to retrieve ("Guardian", "Seeker", etc) - ---@param upgraded Boolean true for upgraded cards (Level 1-5), false for Level 0 - ---@return: If the indexes are still being constructed, returns an empty table. + ---@param class string class to retrieve ("Guardian", "Seeker", etc) + ---@param upgraded boolean true for upgraded cards (Level 1-5), false for Level 0 + ---@return table: If the indexes are still being constructed, returns an empty table. -- Otherwise, a list of tables, each with the following fields -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata @@ -253,11 +256,11 @@ Spawner = { } -- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If -- there are different types, the provided callback will be called once for each type as it spawns -- either a card or deck. --- @param cardList: A list of Player Card data structures (data/metadata) --- @param pos Position table where the cards should be spawned (global) --- @param rot Rotation table for the orientation of the spawned cards (global) --- @param sort Boolean, true if this list of cards should be sorted before spawning --- @param callback Function, callback to be called after the card/deck spawns. +---@param cardList table A list of Player Card data structures (data/metadata) +---@param pos tts__Vector table where the cards should be spawned (global) +---@param rot tts__Vector table for the orientation of the spawned cards (global) +---@param sort boolean True if this list of cards should be sorted before spawning +---@param callback? function Callback to be called after the card/deck spawns. Spawner.spawnCards = function(cardList, pos, rot, sort, callback) if (sort) then table.sort(cardList, Spawner.cardComparator) @@ -279,7 +282,7 @@ Spawner.spawnCards = function(cardList, pos, rot, sort, callback) -- Spawn each of the three types individually. Each Y position shift accounts for the thickness -- of the spawned deck local position = { x = pos.x, y = pos.y, z = pos.z } - Spawner.spawn(investigatorCards, position, { rot.x, rot.y - 90, rot.z }, callback) + Spawner.spawn(investigatorCards, position, rot, callback) position.y = position.y + (#investigatorCards + #standardCards) * 0.07 Spawner.spawn(standardCards, position, rot, callback) @@ -320,48 +323,57 @@ end -- Spawn a specific list of cards. This method is for internal use and should not be called -- directly, use spawnCards instead. ----@param cardList: A list of Player Card data structures (data/metadata) +---@param cardList table A list of Player Card data structures (data/metadata) ---@param pos table Position where the cards should be spawned (global) ---@param rot table Rotation for the orientation of the spawned cards (global) ----@param callback function callback to be called after the card/deck spawns. +---@param callback? function callback to be called after the card/deck spawns. Spawner.spawn = function(cardList, pos, rot, callback) - if (#cardList == 0) then - return - end + if #cardList == 0 then return end + -- Spawn a single card directly - if (#cardList == 1) then + if #cardList == 1 then + -- handle sideways card + if cardList[1].data.SidewaysCard then + rot = { rot.x, rot.y - 90, rot.z } + end spawnObjectData({ data = cardList[1].data, position = pos, rotation = rot, - callback_function = callback, + callback_function = callback }) return end + -- For multiple cards, construct a deck and spawn that local deck = Spawner.buildDeckDataTemplate() + -- Decks won't inherently scale to the cards in them. The card list being spawned should be all -- the same type/size by this point, so use the first card to set the size deck.Transform = { scaleX = cardList[1].data.Transform.scaleX, scaleY = 1, - scaleZ = cardList[1].data.Transform.scaleZ, + scaleZ = cardList[1].data.Transform.scaleZ } + local sidewaysDeck = true for _, spawnCard in ipairs(cardList) do Spawner.addCardToDeck(deck, spawnCard.data) -- set sidewaysDeck to false if any card is not a sideways card sidewaysDeck = (sidewaysDeck and spawnCard.data.SidewaysCard) end - -- set the alt view angle for sideway decks + + -- set the alt view angle for sideways decks if sidewaysDeck then deck.AltLookAngle = { x = 0, y = 180, z = 90 } + rot = { rot.x, rot.y - 90, rot.z } end + spawnObjectData({ data = deck, position = pos, rotation = rot, - callback_function = callback, + callback_function = callback }) end @@ -373,8 +385,8 @@ end -- 3. Extract the card's CustomDeck table and add it to the deck. The deck's -- "CustomDeck" field is a list of all CustomDecks used by cards within the -- deck, keyed by the DeckID and referencing the custom deck table ----@param deck: TTS deck data structure to add to ----@param cardData: Data for the card to be inserted +---@param deck table TTS deck data structure to add to +---@param cardData table Data for the card to be inserted Spawner.addCardToDeck = function(deck, cardData) for customDeckId, customDeckData in pairs(cardData.CustomDeck) do if (deck.CustomDeck[customDeckId] == nil) then @@ -409,7 +421,7 @@ end -- Create an empty deck data table which can have cards added to it. This -- creates a new table on each call without using metatables or previous -- definitions because we can't be sure that TTS doesn't modify the structure ----@return: Table containing the minimal TTS deck data structure +---@return table deck Table containing the minimal TTS deck data structure Spawner.buildDeckDataTemplate = function() local deck = {} deck.Name = "Deck" @@ -430,20 +442,19 @@ Spawner.buildDeckDataTemplate = function() end -- Returns the first ID which does not exist in the given table, starting at startId and increasing --- @param objectTable Table keyed by strings which are numbers --- @param startId First possible ID. --- @return String ID >= startId +---@param objectTable table keyed by strings which are numbers +---@param startId string possible ID. +---@return string id >= startId Spawner.findNextAvailableId = function(objectTable, startId) local id = startId while (objectTable[id] ~= nil) do id = tostring(tonumber(id) + 1) end - return id end -- Get the PBCN (Permanent/Bonded/Customizable/Normal) value from the given metadata. ----@return: 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are +---@return number PBCN 1 for Permanent, 2 for Bonded or 4 for Normal. The actual values are -- irrelevant as they provide only grouping and the order between them doesn't matter. Spawner.getpbcn = function(metadata) if metadata.permanent then @@ -491,29 +502,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, diff --git a/unpacked/Custom_Token Search-A-Card 24051a.yaml b/unpacked/Custom_Tile Search-A-Card 24051a.yaml similarity index 70% rename from unpacked/Custom_Token Search-A-Card 24051a.yaml rename to unpacked/Custom_Tile Search-A-Card 24051a.yaml index 5d852592c..cb92e8916 100644 --- a/unpacked/Custom_Token Search-A-Card 24051a.yaml +++ b/unpacked/Custom_Tile Search-A-Card 24051a.yaml @@ -8,14 +8,14 @@ ColorDiffuse: g: 1 r: 1 CustomImage: - CustomToken: - MergeDistancePixels: 15 + CustomTile: Stackable: false - StandUp: false + Stretch: true Thickness: 0.1 + Type: 3 ImageScalar: 1 ImageSecondaryURL: '' - ImageURL: http://cloud-3.steamusercontent.com/ugc/1857193769888710611/7DFDDFD0F0AFB7A31F29843D196BE9E36D89A60F/ + ImageURL: http://cloud-3.steamusercontent.com/ugc/2342503777976621188/4C119690DEF2B128E6EC309A880984E55D80350C/ WidthScale: 0 Description: 'Allows searching for card(s) by name. Use the buttons to toggle the spawn / search mode. @@ -32,23 +32,23 @@ HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true -LuaScript: !include 'Custom_Token Search-A-Card 24051a.ttslua' +LuaScript: !include 'Custom_Tile Search-A-Card 24051a.ttslua' LuaScriptState: '[true,false,""]' MeasureMovement: false -Name: Custom_Token +Name: Custom_Tile Nickname: Search-A-Card Snap: true Sticky: true Tooltip: true Transform: posX: 60 - posY: 1.53 + posY: 1.48 posZ: 56 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 1.25 + scaleX: 4 scaleY: 1 - scaleZ: 1.35 + scaleZ: 4 Value: 0 XmlUI: '' diff --git a/unpacked/Custom_Tile Token Remover 0a5a29.ttslua b/unpacked/Custom_Tile Token Remover 0a5a29.ttslua index efdf8101c..b670f04eb 100644 --- a/unpacked/Custom_Tile Token Remover 0a5a29.ttslua +++ b/unpacked/Custom_Tile Token Remover 0a5a29.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/TokenRemover") +end) __bundle_register("util/TokenRemover", function(require, _LOADED, __bundle_register, __bundle_modules) local zone = nil @@ -88,7 +91,4 @@ function onPickUp() disable() end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/TokenRemover") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua b/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua index d4e9a6a4d..879f21ba2 100644 --- a/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua +++ b/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua @@ -41,6 +41,171 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenArrangerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + -- local function to call the token arranger, if it is on the table + ---@param functionName string Name of the function to cal + ---@param argument? table Parameter to pass + local function callIfExistent(functionName, argument) + local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") + if tokenArranger ~= nil then + tokenArranger.call(functionName, argument) + end + end + + -- updates the token modifiers with the provided data + ---@param fullData table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(fullData) + callIfExistent("onTokenDataChanged", fullData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + Wait.time(function() callIfExistent("layout") end, 0.1) + end + + return TokenArrangerApi +end +end) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local ChaosBagApi = {} + + -- respawns the chaos bag with a new state of tokens + ---@param tokenList table List of chaos token ids + ChaosBagApi.setChaosBagState = function(tokenList) + return Global.call("setChaosBagState", tokenList) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getChaosBagState = function() + local chaosBagContentsCatcher = Global.call("getChaosBagState") + local chaosBagContents = {} + for _, v in ipairs(chaosBagContentsCatcher) do + table.insert(chaosBagContents, v) + end + return chaosBagContents + end + + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") + end + + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") + end + + -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) + end + + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") + end + + -- removes the specified chaos token from the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.removeChaosToken = function(id) + return Global.call("removeChaosToken", id) + end + + -- returns a chaos token to the bag and calls all relevant functions + ---@param token tts__Object Chaos token to return + ChaosBagApi.returnChaosTokenToBag = function(token) + return Global.call("returnChaosTokenToBag", token) + end + + -- spawns the specified chaos token and puts it into the chaos bag + ---@param id string ID of the chaos token + ChaosBagApi.spawnChaosToken = function(id) + return Global.call("spawnChaosToken", id) + end + + -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens + -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the + -- contents of the bag should check this method before doing so. + -- This method will broadcast a message to all players if the bag is being searched. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. + ChaosBagApi.canTouchChaosTokens = function() + return Global.call("canTouchChaosTokens") + end + + -- called by playermats (by the "Draw chaos token" button) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) + end + + -- returns a Table List of chaos token ids in the current chaos bag + -- requires copying the data into a new table because TTS is weird about handling table return values in Global + ChaosBagApi.getIdUrlMap = function() + return Global.getTable("ID_URL_MAP") + end + + return ChaosBagApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("chaosbag/BlessCurseManager") end) @@ -110,7 +275,6 @@ function initializeState() -- count tokens in the bag local chaosBag = chaosBagApi.findChaosBag() - local tokens = {} for _, v in ipairs(chaosBag.getObjects()) do if v.name == "Bless" then numInPlay.Bless = numInPlay.Bless + 1 @@ -122,7 +286,7 @@ function initializeState() -- find tokens in the play area for _, obj in ipairs(getObjects()) do local pos = obj.getPosition() - if pos.x > -65 and pos.x < 10 and pos.z > -35 and pos.z < 35 then + if pos.x > -65 and pos.x < 10 and pos.z > -35 and pos.z < 35 and obj.type == "Tile" then if obj.getName() == "Bless" then table.insert(tokensTaken.Bless, obj.getGUID()) numInPlay.Bless = numInPlay.Bless + 1 @@ -254,9 +418,10 @@ end --------------------------------------------------------- -- returns a formatted string with information about the provided token type (bless / curse) +---@param type string Type of chaos token ("Bless" or "Curse") +---@param omitBrackets? boolean Controls whether the brackets should be omitted from the return +---@return string tokenCount function formatTokenCount(type, omitBrackets) - if type == nil then type = mode end - if omitBrackets then return (numInPlay[type] - #tokensTaken[type]) .. " + " .. #tokensTaken[type] else @@ -265,7 +430,7 @@ function formatTokenCount(type, omitBrackets) end -- seals a token on a card (called by cards that seal bless/curse tokens) ----@param param Table This contains the type and guid of the sealed token +---@param param table This contains the type and guid of the sealed token function sealedToken(param) table.insert(tokensTaken[param.type], param.guid) broadcastCount(param.type) @@ -273,7 +438,7 @@ function sealedToken(param) end -- returns a token to the bag (called by cards that seal bless/curse tokens) ----@param param Table This contains the type and guid of the released token +---@param param table This contains the type and guid of the released token function releasedToken(param) for i, v in ipairs(tokensTaken[param.type]) do if v == param.guid then @@ -285,7 +450,7 @@ function releasedToken(param) end -- removes a token (called by cards that seal bless/curse tokens) ----@param param Table This contains the type and guid of the released token +---@param param table This contains the type and guid of the released token function returnedToken(param) for i, v in ipairs(tokensTaken[param.type]) do if v == param.guid then @@ -449,162 +614,4 @@ end function none() end end) -__bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenArrangerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- local function to call the token arranger, if it is on the table - ---@param functionName String Name of the function to cal - ---@param argument Variant Parameter to pass - local function callIfExistent(functionName, argument) - local tokenArranger = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenArranger") - if tokenArranger ~= nil then - tokenArranger.call(functionName, argument) - end - end - - -- updates the token modifiers with the provided data - ---@param fullData Table Contains the chaos token metadata - TokenArrangerApi.onTokenDataChanged = function(fullData) - callIfExistent("onTokenDataChanged", fullData) - end - - -- deletes already laid out tokens - TokenArrangerApi.deleteCopiedTokens = function() - callIfExistent("deleteCopiedTokens") - end - - -- updates the laid out tokens - TokenArrangerApi.layout = function() - Wait.time(function() callIfExistent("layout") end, 0.1) - end - - return TokenArrangerApi -end -end) -__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local ChaosBagApi = {} - - -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids - ChaosBagApi.setChaosBagState = function(tokenList) - return Global.call("setChaosBagState", tokenList) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getChaosBagState = function() - local chaosBagContentsCatcher = Global.call("getChaosBagState") - local chaosBagContents = {} - for _, v in ipairs(chaosBagContentsCatcher) do - table.insert(chaosBagContents, v) - end - return chaosBagContents - end - - -- checks scripting zone for chaos bag (also called by a lot of objects!) - ChaosBagApi.findChaosBag = function() - return Global.call("findChaosBag") - end - - -- returns a table of object references to the tokens in play (does not include sealed tokens!) - ChaosBagApi.getTokensInPlay = function() - return Global.call("getChaosTokensinPlay") - end - - -- returns all sealed tokens on cards to the chaos bag - ChaosBagApi.releaseAllSealedTokens = function(playerColor) - return Global.call("releaseAllSealedTokens", playerColor) - end - - -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) - end - - -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.removeChaosToken = function(id) - return Global.call("removeChaosToken", id) - end - - -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return - ChaosBagApi.returnChaosTokenToBag = function(token) - return Global.call("returnChaosTokenToBag", token) - end - - -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token - ChaosBagApi.spawnChaosToken = function(id) - return Global.call("spawnChaosToken", id) - end - - -- Checks to see if the chaos bag can be manipulated. If a player is searching the bag when tokens - -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the - -- contents of the bag should check this method before doing so. - -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. - ChaosBagApi.canTouchChaosTokens = function() - return Global.call("canTouchChaosTokens") - end - - -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) - end - - -- returns a Table List of chaos token ids in the current chaos bag - -- requires copying the data into a new table because TTS is weird about handling table return values in Global - ChaosBagApi.getIdUrlMap = function() - return Global.getTable("ID_URL_MAP") - end - - return ChaosBagApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Clues 3f22e5.ttslua b/unpacked/Custom_Token Clues 3f22e5.ttslua index 85608f361..3e8cdcc2f 100644 --- a/unpacked/Custom_Token Clues 3f22e5.ttslua +++ b/unpacked/Custom_Token Clues 3f22e5.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/GenericCounter") +end) __bundle_register("core/GenericCounter", function(require, _LOADED, __bundle_register, __bundle_modules) MIN_VALUE = 0 MAX_VALUE = 99 @@ -97,7 +100,4 @@ function addOrSubtract(_, _, isRightClick) self.editButton({ index = 0, label = tostring(val) }) end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/GenericCounter") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Damage e64eec.ttslua b/unpacked/Custom_Token Damage e64eec.ttslua index 3e8cdcc2f..85608f361 100644 --- a/unpacked/Custom_Token Damage e64eec.ttslua +++ b/unpacked/Custom_Token Damage e64eec.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/GenericCounter") -end) __bundle_register("core/GenericCounter", function(require, _LOADED, __bundle_register, __bundle_modules) MIN_VALUE = 0 MAX_VALUE = 99 @@ -100,4 +97,7 @@ function addOrSubtract(_, _, isRightClick) self.editButton({ index = 0, label = tostring(val) }) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/GenericCounter") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Doom Counter 85c4c6.ttslua b/unpacked/Custom_Token Doom Counter 85c4c6.ttslua index ec51c7394..7cc4740bd 100644 --- a/unpacked/Custom_Token Doom Counter 85c4c6.ttslua +++ b/unpacked/Custom_Token Doom Counter 85c4c6.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/DoomCounter") -end) __bundle_register("core/DoomCounter", function(require, _LOADED, __bundle_register, __bundle_modules) local guidReferenceApi = require("core/GUIDReferenceApi") local playAreaApi = require("core/PlayAreaApi") @@ -190,29 +187,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -238,60 +237,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -308,13 +302,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -334,7 +328,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -359,14 +353,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -379,7 +376,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -414,4 +411,7 @@ do return SearchLib end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/DoomCounter") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Drawing Tool 280086.ttslua b/unpacked/Custom_Token Drawing Tool 280086.ttslua index e1b91b9f2..98d669a85 100644 --- a/unpacked/Custom_Token Drawing Tool 280086.ttslua +++ b/unpacked/Custom_Token Drawing Tool 280086.ttslua @@ -41,9 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("util/ConnectionDrawingTool") -end) __bundle_register("util/ConnectionDrawingTool", function(require, _LOADED, __bundle_register, __bundle_modules) local lines = {} @@ -131,4 +128,7 @@ function process_lines() Global.setVectorLines(drawing) end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("util/ConnectionDrawingTool") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Instruction Generator 240522.ttslua b/unpacked/Custom_Token Instruction Generator 240522.ttslua index 85898b6dc..abca529d6 100644 --- a/unpacked/Custom_Token Instruction Generator 240522.ttslua +++ b/unpacked/Custom_Token Instruction Generator 240522.ttslua @@ -41,88 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("arkhamdb/InstructionGenerator") -end) -__bundle_register("arkhamdb/InstructionGenerator", function(require, _LOADED, __bundle_register, __bundle_modules) -local searchLib = require("util/SearchLib") - -function onLoad() - local buttonParameters = {} - buttonParameters.function_owner = self - buttonParameters.height = 200 - buttonParameters.width = 1200 - buttonParameters.font_size = 75 - buttonParameters.click_function = "generate" - buttonParameters.label = "Generate instructions!" - buttonParameters.position = { 0, 0.06, 1.55 } - self.createButton(buttonParameters) - - local inputParameters = {} - inputParameters.label = "Click button above" - inputParameters.input_function = "none" - inputParameters.function_owner = self - inputParameters.position = { 0, 0.05, 1.95 } - inputParameters.width = 1200 - inputParameters.height = 130 - inputParameters.font_size = 107 - self.createInput(inputParameters) -end - -function generate(_, playerColor) - local idList = {} - for _, obj in ipairs(searchLib.onObject(self, "isCardOrDeck")) do - if obj.type == "Card" then - local cardMetadata = JSON.decode(obj.getGMNotes()) - - if cardMetadata then - local id = getIdFromData(cardMetadata) - if id then - table.insert(idList, id) - end - end - elseif obj.type == "Deck" then - for _, deepObj in ipairs(obj.getData().ContainedObjects) do - local cardMetadata = JSON.decode(deepObj.GMNotes) - if cardMetadata then - local id = getIdFromData(cardMetadata) - if id then - table.insert(idList, id) - end - end - end - end - end - - if #idList == 0 then - broadcastToColor("Didn't find any valid cards.", playerColor, "Red") - return - else - broadcastToColor("Created deck instruction for " .. #idList .. " card(s). Copy it from the input field.", playerColor, "Green") - end - - -- construct the string - local description = "++SCED import instructions++\n- add: " - for _, id in ipairs(idList) do - description = description .. id .. ", " - end - - -- remove last delimiter (last two characters) - description = description:sub(1, -3) - self.editInput({index = 0, value = description}) -end - --- use the ZoopGuid as fallback if no id present -function getIdFromData(metadata) - if metadata.id then - return metadata.id - elseif metadata.TtsZoopGuid then - return metadata.TtsZoopGuid - end -end - -function none() end -end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -136,14 +54,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -156,7 +77,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -191,4 +112,99 @@ do return SearchLib end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("arkhamdb/InstructionGenerator") +end) +__bundle_register("arkhamdb/InstructionGenerator", function(require, _LOADED, __bundle_register, __bundle_modules) +local searchLib = require("util/SearchLib") + +local idList = {} + +function onLoad() + -- "generate" button + local buttonParameters = {} + buttonParameters.function_owner = self + buttonParameters.height = 200 + buttonParameters.width = 1200 + buttonParameters.font_size = 75 + buttonParameters.click_function = "generate" + buttonParameters.label = "Generate instructions!" + buttonParameters.position = { 0, 0.06, 1.55 } + self.createButton(buttonParameters) + + -- "output" text field + local inputParameters = {} + inputParameters.label = "Click button above" + inputParameters.input_function = "none" + inputParameters.function_owner = self + inputParameters.position = { 0, 0.05, 1.95 } + inputParameters.width = 1200 + inputParameters.height = 130 + inputParameters.font_size = 107 + self.createInput(inputParameters) +end + +-- generates a string for the ArkhamDB deck notes that will instruct the deck import to add the specified cards +function generate(_, playerColor) + idList = {} + for _, obj in ipairs(searchLib.onObject(self, "isCardOrDeck")) do + if obj.type == "Card" then + processCard(obj.getGMNotes(), obj.getName(), playerColor) + elseif obj.type == "Deck" then + for _, deepObj in ipairs(obj.getData().ContainedObjects) do + processCard(deepObj.GMNotes, deepObj.Nickname, playerColor) + end + end + end + + if #idList == 0 then + broadcastToColor("Didn't find any valid cards.", playerColor, "Red") + return + else + broadcastToColor("Created deck instruction for " .. #idList .. " card(s). Copy it from the input field.", playerColor, "Green") + end + + -- sort the idList + table.sort(idList, sortById) + + -- construct the string (new line for each instruction) + local description = "++SCED import instructions++" + for _, entry in ipairs(idList) do + description = description .. "\n- add: " .. entry.id .. " (**" .. entry.name .. "**)" + end + + self.editInput({index = 0, value = description}) +end + +-- use the ZoopGuid as fallback if no id present +function getIdFromData(metadata) + if metadata.id then + return metadata.id + elseif metadata.TtsZoopGuid then + return metadata.TtsZoopGuid + end +end + +function processCard(notes, name, playerColor) + local id = getIdFromData(JSON.decode(notes) or {}) + if id then + table.insert(idList, {id = id, name = name}) + else + broadcastToColor("Couldn't get ID for " .. name .. ".", playerColor, "Red") + end +end + +function sortById(a, b) + local numA = tonumber(a.id) + local numB = tonumber(b.id) + + if numA and numB then + return numA < numB + else + return a.name < b.name + end +end + +function none() end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua b/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua index 189ba4d54..e32fa63da 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua @@ -91,7 +91,7 @@ function updateButtonLabel(index) end -- update the stats to the provided values ----@param newStats Table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} +---@param newStats table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} function updateStats(newStats) if newStats and #newStats == 4 then stats = newStats diff --git a/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua b/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua index 6f379d44c..e32fa63da 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua @@ -41,6 +41,9 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("playermat/InvestigatorSkillTracker") +end) __bundle_register("playermat/InvestigatorSkillTracker", function(require, _LOADED, __bundle_register, __bundle_modules) local buttonParameters = {} buttonParameters.function_owner = self @@ -88,7 +91,7 @@ function updateButtonLabel(index) end -- update the stats to the provided values ----@param newStats Table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} +---@param newStats table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} function updateStats(newStats) if newStats and #newStats == 4 then stats = newStats @@ -99,7 +102,4 @@ function updateStats(newStats) end end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/InvestigatorSkillTracker") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua b/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua index 189ba4d54..e32fa63da 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua @@ -91,7 +91,7 @@ function updateButtonLabel(index) end -- update the stats to the provided values ----@param newStats Table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} +---@param newStats table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} function updateStats(newStats) if newStats and #newStats == 4 then stats = newStats diff --git a/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua b/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua index 189ba4d54..e32fa63da 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua @@ -91,7 +91,7 @@ function updateButtonLabel(index) end -- update the stats to the provided values ----@param newStats Table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} +---@param newStats table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility} function updateStats(newStats) if newStats and #newStats == 4 then stats = newStats diff --git a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua index 8d10410bf..02d7ef9c4 100644 --- a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua +++ b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua @@ -41,6 +41,327 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} @@ -54,14 +375,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -74,7 +398,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -154,323 +478,4 @@ function sumClues() self.editButton({ index = 0, label = tostring(count) }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua b/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua index 6980b0478..bd7135dd3 100644 --- a/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua +++ b/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua @@ -41,6 +41,398 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlaymatApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + local searchLib = require("util/SearchLib") + + -- Convenience function to look up a mat's object by color, or get all mats. + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested + local function getMatForColor(matColor) + if matColor == "All" then + return guidReferenceApi.getObjectsByType("Playermat") + else + return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } + end + end + + -- Returns the color of the closest playmat + ---@param startPos table Starting position to get the closest mat from + PlaymatApi.getMatColorByPosition = function(startPos) + 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 + end + + -- Returns the color of the player's hand that is seated next to the playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getPlayerColor = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("playerColor") + end + end + + -- Returns the color of the playmat that owns the playercolor's hand + ---@param handColor string Color of the playmat + PlaymatApi.getMatColor = function(handColor) + for matColor, mat in pairs(getMatForColor("All")) do + local playerColor = mat.getVar("playerColor") + if playerColor == handColor then + return matColor + end + end + end + + -- 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") + PlaymatApi.isDES = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("isDES") + end + end + + -- Performs a search of the deck area of the requested playmat and returns the result as table + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDeckAreaObjects = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getDeckAreaObjects") + end + end + + -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.flipTopCardFromDeck = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("flipTopCardFromDeck") + end + end + + -- Returns the position of the discard pile of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.getDiscardPosition = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("returnGlobalDiscardPosition") + end + end + + -- Transforms a local position into a global position + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.transformLocalPosition = function(localPos, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.positionToWorld(localPos) + end + end + + -- Returns the rotation of the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnRotation = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getRotation() + end + end + + -- Returns a table with spawn data (position and rotation) for a helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object + PlaymatApi.getHelperSpawnData = function(matColor, helperName) + 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 + end + + + -- Triggers the Upkeep for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) + PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doUpkeepFromHotkey", playerColor) + end + end + + -- Handles discarding for the requested playmat for the provided list of objects + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard + PlaymatApi.discardListOfObjects = function(matColor, objList) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("discardListOfObjects", objList) + end + end + + -- Returns the active investigator id + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + PlaymatApi.returnInvestigatorId = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.getVar("activeInvestigatorId") + end + end + + -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If + -- 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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("setLimitSnapsByType", matchCardTypes) + end + end + + -- Sets the requested playmat's draw 1 button to visible + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("showDrawButton", isDrawButtonVisible) + end + end + + -- Shows or hides the clickable clue counter for the requested playmat + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.clickableClues = function(showCounter, matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("clickableClues", showCounter) + end + end + + -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.removeClues = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("removeClues") + end + end + + -- Reports the clue count for the requested playmat + ---@param useClickableCounters boolean Controls which type of counter is getting checked + PlaymatApi.getClueCount = function(useClickableCounters, matColor) + local count = 0 + for _, mat in pairs(getMatForColor(matColor)) do + count = count + mat.call("getClueCount", useClickableCounters) + end + return count + end + + -- updates the specified owned counter + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 + PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) + end + end + + -- triggers the draw function for the specified playmat + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw + PlaymatApi.drawCardsWithReshuffle = function(matColor, number) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("drawCardsWithReshuffle", number) + end + end + + -- returns the resource counter amount + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target + PlaymatApi.getCounterValue = function(matColor, type) + for _, mat in pairs(getMatForColor(matColor)) do + return mat.call("getCounterValue", type) + end + end + + -- returns a list of mat colors that have an investigator placed + PlaymatApi.getUsedMatColors = function() + local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } + 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) + end + end + return usedColors + end + + -- resets the specified skill tracker to "1, 1, 1, 1" + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.resetSkillTracker = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("resetSkillTracker") + end + end + + -- finds all objects on the playmat and associated set aside zone and returns a table + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) + PlaymatApi.searchAroundPlaymat = function(matColor, filter) + 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 + + -- Discard a non-hidden card from the corresponding player's hand + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + PlaymatApi.doDiscardOne = function(matColor) + for _, mat in pairs(getMatForColor(matColor)) do + mat.call("doDiscardOne") + end + end + + -- Triggers the metadata sync for all playmats + PlaymatApi.syncAllCustomizableCards = function() + for _, mat in pairs(getMatForColor("All")) do + mat.call("syncAllCustomizableCards") + end + end + + return PlaymatApi +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("core/DoomInPlayCounter") end) @@ -48,7 +440,7 @@ __bundle_register("core/DoomInPlayCounter", function(require, _LOADED, __bundle_ local guidReferenceApi = require("core/GUIDReferenceApi") local playmatApi = require("playermat/PlaymatApi") -local ZONE, TRASH, loopID +local ZONE, TRASH local doomURL = "https://i.imgur.com/EoL7yaZ.png" local IGNORE_TAG = "DoomCounter_ignore" local TOTAL_PLAY_AREA = { @@ -79,7 +471,7 @@ function onLoad() TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") ZONE = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone") - loopID = Wait.time(updateCounter, 2, -1) + Wait.time(updateCounter, 2, -1) end -- main function @@ -148,391 +540,4 @@ function inArea(point, bounds) and point.z < bounds.lowerRight.z) end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - local searchLib = require("util/SearchLib") - - -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested - local function getMatForColor(matColor) - if matColor == "All" then - return guidReferenceApi.getObjectsByType("Playermat") - else - return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } - end - end - - -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from - PlaymatApi.getMatColorByPosition = function(startPos) - 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 - end - - -- Returns the color of the player's hand that is seated next to the playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getPlayerColor = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("playerColor") - end - end - - -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat - PlaymatApi.getMatColor = function(handColor) - for matColor, mat in pairs(getMatForColor("All")) do - local playerColor = mat.getVar("playerColor") - if playerColor == handColor then - return matColor - end - end - end - - -- 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") - PlaymatApi.isDES = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("isDES") - end - end - - -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDeckAreaObjects = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getDeckAreaObjects") - end - end - - -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.flipTopCardFromDeck = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("flipTopCardFromDeck") - end - end - - -- Returns the position of the discard pile of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.getDiscardPosition = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("returnGlobalDiscardPosition") - end - end - - -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.transformLocalPosition = function(localPos, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.positionToWorld(localPos) - end - end - - -- Returns the rotation of the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnRotation = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getRotation() - end - end - - -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object - PlaymatApi.getHelperSpawnData = function(matColor, helperName) - 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 - end - - - -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) - PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doUpkeepFromHotkey", playerColor) - end - end - - -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard - PlaymatApi.discardListOfObjects = function(matColor, objList) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("discardListOfObjects", objList) - end - end - - -- Returns the active investigator id - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - PlaymatApi.returnInvestigatorId = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.getVar("activeInvestigatorId") - end - end - - -- Sets the requested playmat's snap points to limit snapping to matching card types or not. If - -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("setLimitSnapsByType", matchCardTypes) - end - end - - -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("showDrawButton", isDrawButtonVisible) - end - end - - -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.clickableClues = function(showCounter, matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("clickableClues", showCounter) - end - end - - -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.removeClues = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("removeClues") - end - end - - -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked - PlaymatApi.getClueCount = function(useClickableCounters, matColor) - local count = 0 - for _, mat in pairs(getMatForColor(matColor)) do - count = count + mat.call("getClueCount", useClickableCounters) - end - return count - end - - -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 - PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) - end - end - - -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw - PlaymatApi.drawCardsWithReshuffle = function(matColor, number) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("drawCardsWithReshuffle", number) - end - end - - -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target - PlaymatApi.getCounterValue = function(matColor, type) - for _, mat in pairs(getMatForColor(matColor)) do - return mat.call("getCounterValue", type) - end - end - - -- returns a list of mat colors that have an investigator placed - PlaymatApi.getUsedMatColors = function() - local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } - 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) - end - end - return usedColors - end - - -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.resetSkillTracker = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("resetSkillTracker") - end - end - - -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) - 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 - - -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - PlaymatApi.doDiscardOne = function(matColor) - for _, mat in pairs(getMatForColor(matColor)) do - mat.call("doDiscardOne") - end - end - - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - end - end - - return PlaymatApi -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) return __bundle_require("__root") diff --git a/unpacked/Custom_Token Play Area 721ba2.ttslua b/unpacked/Custom_Token Play Area 721ba2.ttslua index d54201a5e..7d25fdd3c 100644 --- a/unpacked/Custom_Token Play Area 721ba2.ttslua +++ b/unpacked/Custom_Token Play Area 721ba2.ttslua @@ -41,928 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") - end - - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") - end - - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") - end - - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) - end - - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) - end - - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local TokenSpawnTracker = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") - end - - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) - end - - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) - end - - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") - end - - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") - end - - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") - end - - return TokenSpawnTracker -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/PlayArea") -end) -__bundle_register("core/PlayArea", function(require, _LOADED, __bundle_register, __bundle_modules) -local guidReferenceApi = require("core/GUIDReferenceApi") -local searchLib = require("util/SearchLib") -local tokenManager = require("core/token/TokenManager") - --- Location connection directional options -local BIDIRECTIONAL = 0 -local ONE_WAY = 1 -local INCOMING_ONE_WAY = 2 - --- Connector draw parameters -local CONNECTION_THICKNESS = 0.015 -local DRAGGING_CONNECTION_THICKNESS = 0.15 -local DRAGGING_CONNECTION_COLOR = { 0.8, 0.8, 0.8, 1 } -local DIRECTIONAL_ARROW_DISTANCE = 3.5 -local ARROW_ARM_LENGTH = 0.9 -local ARROW_ANGLE = 25 - --- Height to draw the connector lines, places them just above the table and always below cards -local CONNECTION_LINE_Y = 1.529 - --- used for recreating the link to a custom data helper after image change -customDataHelper = nil - -local DEFAULT_URL = "http://cloud-3.steamusercontent.com/ugc/998015670465071049/FFAE162920D67CF38045EFBD3B85AD0F916147B2/" - -local SHIFT_OFFSETS = { - left = { x = 0.00, y = 0, z = 7.67 }, - right = { x = 0.00, y = 0, z = -7.67 }, - up = { x = 6.54, y = 0, z = 0.00 }, - down = { x = -6.54, y = 0, z = 0.00 } -} -local SHIFT_EXCLUSION = { - ["b7b45b"] = true, - ["f182ee"] = true, - ["721ba2"] = true -} -local LOC_LINK_EXCLUDE_SCENARIOS = { - ["The Witching Hour"] = true, - ["The Heart of Madness"] = true -} - -local clueData = {} -local spawnedLocationGUIDs = {} -local locations = {} -local locationConnections = {} -local draggingGuids = {} -local missingData = {} -local locationData, currentScenario, connectionsEnabled - ---------------------------------------------------------- --- general code ---------------------------------------------------------- - -function onSave() - return JSON.encode({ - trackedLocations = locations, - currentScenario = currentScenario, - connectionColor = connectionColor, - connectionsEnabled = connectionsEnabled - }) -end - -function onLoad(savedData) - self.interactable = false -- this needs to be here since the playarea will be reloaded when the image changes - local loadedData = JSON.decode(savedData) or {} - locations = loadedData.trackedLocations or {} - currentScenario = loadedData.currentScenario - connectionColor = loadedData.connectionColor or { 0.4, 0.4, 0.4, 1 } - connectionsEnabled = loadedData.connectionsEnabled or true -end - --- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the --- data to the local token manager instance. ----@param args Table Single-value array holding the GUID of the Custom Data Helper making the call -function updateLocations(args) - customDataHelper = getObjectFromGUID(args[1]) - if customDataHelper ~= nil then - tokenManager.addLocationData(customDataHelper.getTable("LOCATIONS_DATA")) - end -end - --- sets the image of the playarea -function updateSurface(newURL) - local customInfo = self.getCustomObject() - - if newURL ~= "" and newURL ~= nil and newURL ~= DEFAULT_URL then - customInfo.image = newURL - broadcastToAll("New Playarea Image Applied", { 0.2, 0.9, 0.2 }) - else - customInfo.image = DEFAULT_URL - broadcastToAll("Default Playarea Image Applied", { 0.2, 0.9, 0.2 }) - end - - self.setCustomObject(customInfo) - - local guid = nil - - if customDataHelper then guid = customDataHelper.getGUID() end - self.reload() - - if guid ~= nil then - Wait.time(function() updateLocations({ guid }) end, 1) - end -end - --- TTS event, called for each object that is placed on the playarea -function onCollisionEnter(collisionInfo) - local obj = collisionInfo.collision_object - local objType = obj.name - - -- only continue for cards - if objType ~= "Card" and objType ~= "CardCustom" then - if objType == "Deck" then - table.insert(missingData, obj) - end - return - end - - -- check if we should spawn clues here and do so according to playercount - local card = collisionInfo.collision_object - if shouldSpawnTokens(card) then - tokenManager.spawnForCard(card) - end - - -- If this card was being dragged, clear the dragging connections. A multi-drag/drop may send - -- the dropped card immediately into a deck, so this has to be done here - if draggingGuids[card.getGUID()] ~= nil then - card.setVectorLines(nil) - draggingGuids[card.getGUID()] = nil - end - - maybeTrackLocation(card) -end - -function shouldSpawnTokens(card) - local metadata = JSON.decode(card.getGMNotes()) - if metadata == nil then - return tokenManager.hasLocationData(card) - end - return metadata.type == "Location" - or metadata.type == "Enemy" - or metadata.type == "Treachery" - or metadata.weakness - -- hardcoded IDs for "Makeshift Trap" and "Shrine of the Moirai" - -- these cards are events with uses, that attach to encounter cards and thus will enter play in the playarea - -- TODO: probably turn this into a metadata field if we get more cards like that - or metadata.id == "07310" - or metadata.id == "09100" -end - -function onCollisionExit(collisionInfo) - maybeUntrackLocation(collisionInfo.collision_object) -end - --- Destroyed objects don't trigger onCollisionExit(), so check on destruction to untrack as well -function onObjectDestroy(object) - maybeUntrackLocation(object) -end - -function onObjectPickUp(player, object) - -- only continue for cards - local objType = object.name - if objType ~= "Card" and objType ~= "CardCustom" then return end - - -- onCollisionExit USUALLY fires first, so we have to check the card to see if it's a location we - -- should be tracking - if showLocationLinks() and isInPlayArea(object) and object.getGMNotes() ~= nil and object.getGMNotes() ~= "" then - local pickedUpGuid = object.getGUID() - local metadata = JSON.decode(object.getGMNotes()) or {} - if metadata.type == "Location" then - -- onCollisionExit sometimes comes 1 frame after onObjectPickUp (rather than before it or in - -- the same frame). This causes a mismatch in the data between dragging the on-table, and - -- that one frame draws connectors on the card which then show up as shadows for snap points. - -- Waiting ensures we always do thing in the expected Exit->PickUp order - Wait.frames(function() - if object.is_face_down then - draggingGuids[pickedUpGuid] = metadata.locationBack - else - draggingGuids[pickedUpGuid] = metadata.locationFront - end - rebuildConnectionList() - end, 2) - end - end -end - -function onUpdate() - -- Due to the frequence of onUpdate calls, ensure that we only process any changes to the - -- connection list once, and only redraw once - local needsConnectionRebuild = false - local needsConnectionDraw = false - for guid, _ in pairs(draggingGuids) do - local obj = getObjectFromGUID(guid) - if obj == nil or not isInPlayArea(obj) then - draggingGuids[guid] = nil - needsConnectionRebuild = true - -- If object still exists then it's been dragged outside the area and needs to clear the - -- lines attached to it - if obj ~= nil then - obj.setVectorLines(nil) - end - end - -- Even if the last location left the play area, need one last draw to clear the lines - needsConnectionDraw = true - end - if needsConnectionRebuild then - rebuildConnectionList() - end - if needsConnectionDraw then - drawDraggingConnections() - end -end - --- Checks the given card and adds it to the list of locations tracked for connection purposes. --- A card will be added to the tracking if it is a location in the play area (based on centerpoint). ----@param card Object A card object, possibly a location. -function maybeTrackLocation(card) - -- Collision checks for any part of the card overlap, but our other tracking is centerpoint - -- Ignore any collision where the centerpoint isn't in the area - if isInPlayArea(card) then - local metadata = JSON.decode(card.getGMNotes()) - if metadata == nil then - table.insert(missingData, card) - else - if metadata.type == "Location" then - if card.is_face_down then - locations[card.getGUID()] = metadata.locationBack - else - locations[card.getGUID()] = metadata.locationFront - end - - -- only draw connection lines for not-excluded scenarios - if showLocationLinks() then - rebuildConnectionList() - drawBaseConnections() - end - end - end - end -end - --- Stop tracking a location for connection drawing. This should be called for both collision exit --- and destruction, as a destroyed object does not trigger collision exit. An object can also be --- deleted mid-drag, but the ordering for drag events means we can't clear those here and those will --- be cleared in the next onUpdate() cycle. ----@param card Object Card to (maybe) stop tracking -function maybeUntrackLocation(card) - -- Locked objects no longer collide (hence triggering an exit event) but are still in the play - -- area. If the object is now locked, don't remove it. - if locations[card.getGUID()] ~= nil and not card.locked then - locations[card.getGUID()] = nil - rebuildConnectionList() - drawBaseConnections() - end -end - --- Global event handler, delegated from Global. Clears any connection lines from dragged cards --- before they are destroyed by entering a deck. Removal of the card from the dragging list will --- be handled during the next onUpdate() call. -function tryObjectEnterContainer(params) - for draggedGuid, _ in pairs(draggingGuids) do - local draggedObj = getObjectFromGUID(draggedGuid) - if draggedObj ~= nil then - draggedObj.setVectorLines(nil) - end - end -end - --- Builds a list of GUID to GUID connection information based on the currently tracked locations. --- This will update the connection information and store it in the locationConnections data member, --- but does not draw those connections. This should often be followed by a call to --- drawBaseConnections() -function rebuildConnectionList() - if not showLocationLinks() then - locationConnections = {} - return - end - - local iconCardList = {} - - -- Build a list of cards with each icon as their location ID - for cardId, metadata in pairs(draggingGuids) do - buildLocListByIcon(cardId, iconCardList, metadata) - end - for cardId, metadata in pairs(locations) do - buildLocListByIcon(cardId, iconCardList, metadata) - end - - -- Pair up all the icons - locationConnections = {} - for cardId, metadata in pairs(draggingGuids) do - buildConnection(cardId, iconCardList, metadata) - end - for cardId, metadata in pairs(locations) do - if draggingGuids[cardId] == nil then - buildConnection(cardId, iconCardList, metadata) - end - end -end - --- Extracts the card's icon string into a list of individual location icons ----@param cardId String GUID of the card to pull the icon data from ----@param iconCardList Table A table of icon->GUID list. Mutable, will be updated by this method ----@param locData Table A table containing the metadata for the card (for the correct side) -function buildLocListByIcon(cardId, iconCardList, locData) - if locData ~= nil and locData.icons ~= nil then - for icon in string.gmatch(locData.icons, "%a+") do - if iconCardList[icon] == nil then - iconCardList[icon] = {} - end - table.insert(iconCardList[icon], cardId) - end - end -end - --- Builds the connections for the given cardID by finding matching icons and adding them to the --- Playarea's locationConnections table. ----@param cardId String GUID of the card to build the connections for ----@param iconCardList Table A table of icon->GUID List. Used to find matching icons for connections. ----@param locData Table A table containing the metadata for the card (for the correct side) -function buildConnection(cardId, iconCardList, locData) - if locData ~= nil and locData.connections ~= nil then - locationConnections[cardId] = {} - for icon in string.gmatch(locData.connections, "%a+") do - if iconCardList[icon] ~= nil then - for _, connectedGuid in ipairs(iconCardList[icon]) do - -- If the reciprocal exists, convert it to BiDi, otherwise add as a one-way - if locationConnections[connectedGuid] ~= nil - and (locationConnections[connectedGuid][cardId] == ONE_WAY - or locationConnections[connectedGuid][cardId] == BIDIRECTIONAL) then - locationConnections[connectedGuid][cardId] = BIDIRECTIONAL - locationConnections[cardId][connectedGuid] = nil - else - if locationConnections[connectedGuid] == nil then - locationConnections[connectedGuid] = {} - end - locationConnections[cardId][connectedGuid] = ONE_WAY - locationConnections[connectedGuid][cardId] = INCOMING_ONE_WAY - end - end - end - end - end -end - --- Draws the lines for connections currently in locationConnections but not in draggingGuids. --- Constructed vectors will be set to the playmat -function drawBaseConnections() - if not showLocationLinks() then - locationConnections = {} - self.setVectorLines({}) - return - end - local cardConnectionLines = {} - - for originGuid, targetGuids in pairs(locationConnections) do - -- Objects should reliably exist at this point, but since this can be called during onUpdate the - -- object checks are conservative just to make sure. - local origin = getObjectFromGUID(originGuid) - if draggingGuids[originGuid] == nil and origin ~= nil then - for targetGuid, direction in pairs(targetGuids) do - local target = getObjectFromGUID(targetGuid) - if draggingGuids[targetGuid] == nil and target ~= nil then - -- Since we process the full list, we're guaranteed to hit any ONE_WAY connections later - -- so we can ignore INCOMING_ONE_WAY - if direction == BIDIRECTIONAL then - addBidirectionalVector(origin, target, self, cardConnectionLines) - elseif direction == ONE_WAY then - addOneWayVector(origin, target, self, cardConnectionLines) - end - end - end - end - end - self.setVectorLines(cardConnectionLines) -end - --- Draws the lines for cards which are currently being dragged. -function drawDraggingConnections() - if not showLocationLinks() then - return - end - local cardConnectionLines = {} - local ownedVectors = {} - - for originGuid, _ in pairs(draggingGuids) do - targetGuids = locationConnections[originGuid] - -- Objects should reliably exist at this point, but since this can be called during onUpdate the - -- object checks are conservative just to make sure. - local origin = getObjectFromGUID(originGuid) - if draggingGuids[originGuid] and origin ~= nil and targetGuids ~= nil then - ownedVectors[originGuid] = {} - for targetGuid, direction in pairs(targetGuids) do - local target = getObjectFromGUID(targetGuid) - if target ~= nil then - if direction == BIDIRECTIONAL then - addBidirectionalVector(origin, target, origin, ownedVectors[originGuid]) - elseif direction == ONE_WAY then - addOneWayVector(origin, target, origin, ownedVectors[originGuid]) - elseif direction == INCOMING_ONE_WAY and not draggingGuids[targetGuid] then - addOneWayVector(target, origin, origin, ownedVectors[originGuid]) - end - end - end - end - end - for ownerGuid, vectors in pairs(ownedVectors) do - local card = getObjectFromGUID(ownerGuid) - card.setVectorLines(vectors) - end -end - --- Draws a bidirectional location connection between the two cards, adding the lines to do so to the --- given lines list. ----@param card1 Object One of the card objects to connect ----@param card2 Object The other card object to connect ----@param vectorOwner Object The object which these lines will be set to. Used for relative ---- positioning and scaling, as well as highlighting connections during a drag operation ----@param lines Table List of vector line elements. Mutable, will be updated to add this connector -function addBidirectionalVector(card1, card2, vectorOwner, lines) - local cardPos1 = card1.getPosition() - local cardPos2 = card2.getPosition() - cardPos1.y = CONNECTION_LINE_Y - cardPos2.y = CONNECTION_LINE_Y - - local pos1 = vectorOwner.positionToLocal(cardPos1) - local pos2 = vectorOwner.positionToLocal(cardPos2) - - table.insert(lines, { - points = { pos1, pos2 }, - color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, - thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, - }) -end - --- Draws a one-way location connection between the two cards, adding the lines to do so to the --- given lines list. Arrows will point towards the target card. ----@param origin Object Origin card in the connection ----@param target Object Target card object to connect ----@param vectorOwner Object The object which these lines will be set to. Used for relative ---- positioning and scaling, as well as highlighting connections during a drag operation ----@param lines Table List of vector line elements. Mutable, will be updated to add this connector -function addOneWayVector(origin, target, vectorOwner, lines) - -- Start with the BiDi then add the arrow lines to it - addBidirectionalVector(origin, target, vectorOwner, lines) - local originPos = origin.getPosition() - local targetPos = target.getPosition() - originPos.y = CONNECTION_LINE_Y - targetPos.y = CONNECTION_LINE_Y - - -- Calculate card distance to be closer for horizontal positions than vertical, since cards are - -- taller than they are wide - local heading = Vector(originPos):sub(targetPos):heading("y") - local distanceFromCard = DIRECTIONAL_ARROW_DISTANCE * 0.7 + - DIRECTIONAL_ARROW_DISTANCE * 0.3 * math.abs(math.sin(math.rad(heading))) - - -- Calculate the three possible arrow positions. These are offset by half the arrow length to - -- make them visually balanced by keeping the arrows centered, not tracking the point - local midpoint = Vector(originPos):add(targetPos):scale(Vector(0.5, 0.5, 0.5)):moveTowards(targetPos, - ARROW_ARM_LENGTH / 2) - local closeToOrigin = Vector(originPos):moveTowards(targetPos, distanceFromCard + ARROW_ARM_LENGTH / 2) - local closeToTarget = Vector(targetPos):moveTowards(originPos, distanceFromCard - ARROW_ARM_LENGTH / 2) - - if (originPos:distance(closeToOrigin) > originPos:distance(closeToTarget)) then - addArrowLines(midpoint, originPos, vectorOwner, lines) - else - addArrowLines(closeToOrigin, originPos, vectorOwner, lines) - addArrowLines(closeToTarget, originPos, vectorOwner, lines) - end -end - --- Draws an arrowhead at the given position. ----@param arrowheadPos Table Centerpoint of the arrowhead to draw (NOT the tip of the arrow) ----@param originPos Table Origin point of the connection, used to position the arrow arms ----@param vectorOwner Object The object which these lines will be set to. Used for relative ---- positioning and scaling, as well as highlighting connections during a drag operation ----@param lines Table List of vector line elements. Mutable, will be updated to add this arrow -function addArrowLines(arrowheadPos, originPos, vectorOwner, lines) - local arrowArm1 = Vector(arrowheadPos):moveTowards(originPos, ARROW_ARM_LENGTH):sub(arrowheadPos):rotateOver("y", - -1 * ARROW_ANGLE):add(arrowheadPos) - local arrowArm2 = Vector(arrowheadPos):moveTowards(originPos, ARROW_ARM_LENGTH):sub(arrowheadPos):rotateOver("y", - ARROW_ANGLE):add(arrowheadPos) - - local head = vectorOwner.positionToLocal(arrowheadPos) - local arm1 = vectorOwner.positionToLocal(arrowArm1) - local arm2 = vectorOwner.positionToLocal(arrowArm2) - table.insert(lines, { - points = { arm1, head, arm2 }, - color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, - thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, - }) -end - --- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain --- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' ----@param playerColor String Color of the player requesting the shift. Used solely to send an error ---- message in the unlikely case that the scripting zone has been deleted -function shiftContentsUp(playerColor) - shiftContents(playerColor, "up") -end - -function shiftContentsDown(playerColor) - shiftContents(playerColor, "down") -end - -function shiftContentsLeft(playerColor) - shiftContents(playerColor, "left") -end - -function shiftContentsRight(playerColor) - shiftContents(playerColor, "right") -end - -function shiftContents(playerColor, direction) - local zone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone") - if not zone then - broadcastToColor("Scripting zone couldn't be found.", playerColor, "Red") - return - end - - for _, object in ipairs(zone.getObjects()) do - if not (SHIFT_EXCLUSION[object.getGUID()] or object.hasTag("displacement_excluded")) then - object.translate(SHIFT_OFFSETS[direction]) - end - end - Wait.time(drawBaseConnections, 0.1) -end - --- Check to see if the given object is within the bounds of the play area, based solely on the X and --- Z coordinates, ignoring height ----@param object Object Object to check ----@return. True if the object is inside the play area -function isInPlayArea(object) - local bounds = self.getBounds() - local position = object.getPosition() - -- Corners are arbitrary since it's all global - c1 goes down both axes, c2 goes up - local c1 = { x = bounds.center.x - bounds.size.x / 2, z = bounds.center.z - bounds.size.z / 2 } - local c2 = { x = bounds.center.x + bounds.size.x / 2, z = bounds.center.z + bounds.size.z / 2 } - - return position.x > c1.x and position.x < c2.x and position.z > c1.z and position.z < c2.z -end - --- Reset the play area's tracking of which cards have had tokens spawned. -function resetSpawnedCards() - spawnedLocationGUIDs = {} -end - -function onScenarioChanged(scenarioName) - currentScenario = scenarioName - if not showLocationLinks() then - broadcastToAll("Automatic location connections not available for this scenario") - end -end - -function showLocationLinks() - return not LOC_LINK_EXCLUDE_SCENARIOS[currentScenario] and connectionsEnabled -end - --- Sets this playmat's snap points to limit snapping to locations or not. --- If matchTypes is false, snap points will be reset to snap all cards. ----@param matchTypes Boolean Whether snap points should only snap for the matching card types. -function setLimitSnapsByType(matchTypes) - local snaps = self.getSnapPoints() - for i, snap in ipairs(snaps) do - local snapTags = snaps[i].tags - if matchTypes then - if snapTags == nil then - snaps[i].tags = { "Location" } - else - table.insert(snaps[i].tags, "Location") - end - else - snaps[i].tags = nil - end - end - self.setSnapPoints(snaps) -end - --- called by the option panel to enabled / disable location connections -function setConnectionDrawState(state) - connectionsEnabled = state - rebuildConnectionList() - drawBaseConnections() -end - --- called by the option panel to edit the location connection color -function setConnectionColor(color) - connectionColor = color - rebuildConnectionList() - drawBaseConnections() -end - --- count victory points on locations in play area ----@param highlightOff Boolean True if highlighting should be enabled ----@return. Returns the total amount of VP found in the play area -function countVP(highlightOff) - local totalVP = 0 - - for cardId, metadata in pairs(locations) do - local card = getObjectFromGUID(cardId) - if metadata ~= nil and card ~= nil then - if highlightOff == true then - card.highlightOff("Green") - end - - local cardVP = tonumber(metadata.victory) or 0 - if cardVP ~= 0 and not cardHasClues(card) then - totalVP = totalVP + cardVP - if highlightOff == false then - card.highlightOn("Green") - end - end - end - end - - return totalVP -end - --- checks if a card has clues on it, returns true if clues are on it ----@param card TTSObject Card to check for clues -function cardHasClues(card) - local searchResult = searchLib.onObject(card, "isClue") - return #searchResult > 0 -end - --- highlights all locations in the play area without metadata ----@param state Boolean True if highlighting should be enabled -function highlightMissingData(state) - for i, obj in pairs(missingData) do - if obj ~= nil then - if state then - obj.highlightOff("Red") - else - obj.highlightOn("Red") - end - else - missingData[i] = nil - end - end -end - --- rebuilds local snap points (could be useful in the future again) -function buildSnaps() - local upperleft = { x = 1.53, z = -1.09 } - local lowerright = { x = -1.53, z = 1.55 } - local snaps = {} - - -- creates 81 snap points, for uneven rows + columns it makes a rotation snap point - for i = 1, 9 do - for j = 1, 9 do - local snap = {} - snap.position = {} - snap.position.x = round(upperleft.x - (upperleft.x - lowerright.x) * (i - 1) / 8, 3) - snap.position.y = 0.1 - snap.position.z = round(upperleft.z - (upperleft.z - lowerright.z) * (j - 1) / 8, 3) - - -- enable rotation snaps for uneven rows / columns - if (i % 2 ~= 0) and (j % 2 ~= 0) then - snap.rotation = { 0, 0, 0 } - snap.rotation_snap = true - end - - table.insert(snaps, snap) - end - end - self.setSnapPoints(snaps) -end - --- utility function -function round(num, numDecimalPlaces) - local mult = 10 ^ (numDecimalPlaces or 0) - return math.floor(num * mult + 0.5) / mult -end -end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -971,29 +49,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -1121,12 +201,13 @@ do -- stateIDs for the multi-stated resource tokens local stateTable = { ["resource"] = 1, - ["ammo"] = 2, - ["bounty"] = 3, - ["charge"] = 4, + ["ammo"] = 2, + ["bounty"] = 3, + ["charge"] = 4, ["evidence"] = 5, - ["secret"] = 6, - ["supply"] = 7 + ["secret"] = 6, + ["supply"] = 7, + ["offering"] = 8 } -- Table of data extracted from the token source bag, keyed by the Memo on each token which @@ -1143,8 +224,8 @@ do -- the work once a card has hit an area where it might spawn tokens. It will check to see if -- the card has already spawned, find appropriate data from either the uses metadata or the Data -- Helper, and spawn the tokens. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 TokenManager.spawnForCard = function(card, extraUses) if tokenSpawnTrackerApi.hasSpawnedTokens(card.getGUID()) then @@ -1159,13 +240,12 @@ do end -- Spawns a set of tokens on the given card. - ---@param card Object Card to spawn tokens on - ---@param tokenType String Type of token to spawn, valid values are "damage", "horror", - -- "resource", "doom", or "clue" - ---@param tokenCount Number How many tokens to spawn. For damage or horror this value will be set to the + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string Type of token to spawn, for example "damage", "horror" or "resource" + ---@param tokenCount number How many tokens to spawn. For damage or horror this value will be set to the -- spawned state object rather than spawning multiple tokens - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown, subType) local optionPanel = optionPanelApi.getOptions() @@ -1182,10 +262,10 @@ do -- Spawns a single counter token and sets the value to tokenValue. Used for damage and horror -- tokens. - ---@param card Object Card to spawn tokens on - ---@param tokenType String type of token to spawn, valid values are "damage" and "horror". Other + ---@param card tts__Object Card to spawn tokens on + ---@param tokenType string type of token to spawn, valid values are "damage" and "horror". Other -- types should use spawnMultipleTokens() - ---@param tokenValue Number Value to set the damage/horror to + ---@param tokenValue number Value to set the damage/horror to TokenManager.spawnCounterToken = function(card, tokenType, tokenValue, shiftDown) if tokenValue < 1 or tokenValue > 50 then return end @@ -1203,11 +283,11 @@ do end -- Spawns a number of tokens. - ---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue". + ---@param tokenType string type of token to spawn, valid values are resource", "doom", or "clue". -- Other types should use spawnCounterToken() - ---@param tokenCount Number How many tokens to spawn - ---@param shiftDown Number An offset for the z-value of this group of tokens - ---@param subType String Subtype of token to spawn. This will only differ from the tokenName for resource tokens + ---@param tokenCount number How many tokens to spawn + ---@param shiftDown? number An offset for the z-value of this group of tokens + ---@param subType? string Subtype of token to spawn. This will only differ from the tokenName for resource tokens TokenManager.spawnMultipleTokens = function(card, tokenType, tokenCount, shiftDown, subType) -- not checking the max at this point since clue offsets are calculated dynamically if tokenCount < 1 then return end @@ -1261,12 +341,12 @@ do end -- Spawns a single token at the given global position by copying it from the template bag. - ---@param position Global position to spawn the token - ---@param tokenType String type of token to spawn, valid values are "damage", "horror", + ---@param position tts__Vector Global position to spawn the token + ---@param tokenType string type of token to spawn, valid values are "damage", "horror", -- "resource", "doom", or "clue" - ---@param rotation Vector Rotation to be used for the new token. Only the y-value will be used, + ---@param rotation tts__Vector Rotation to be used for the new token. Only the y-value will be used, -- x and z will use the default rotation from the source bag - ---@param callback function A callback function triggered after the new token is spawned + ---@param callback? function A callback function triggered after the new token is spawned TokenManager.spawnToken = function(position, tokenType, rotation, callback) internal.initTokenTemplates() local loadTokenType = tokenType @@ -1300,9 +380,9 @@ do end -- Checks a card for metadata to maybe replenish it - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) TokenManager.maybeReplenishCard = function(card, uses, mat) -- TODO: support for cards with multiple uses AND replenish (as of yet, no official card needs that) if uses[1].count and uses[1].replenish then @@ -1312,13 +392,13 @@ do -- Delegate function to the token spawn tracker. Exists to avoid circular dependencies in some -- callers. - ---@param card Object Card object to reset the tokens for + ---@param card tts__Object Card object to reset the tokens for TokenManager.resetTokensSpawned = function(card) tokenSpawnTrackerApi.resetTokensSpawned(card.getGUID()) end -- Pushes new player card data into the local copy of the Data Helper player data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addPlayerCardData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -1327,7 +407,7 @@ do end -- Pushes new location data into the local copy of the Data Helper location data. - ---@param dataTable Table Key/Value pairs following the DataHelper style + ---@param dataTable table Key/Value pairs following the DataHelper style TokenManager.addLocationData = function(dataTable) internal.initDataHelperData() for k, v in pairs(dataTable) do @@ -1336,8 +416,8 @@ do end -- Checks to see if the given card has location data in the DataHelper - ---@param card Object Card to check for data - ---@return Boolean True if this card has data in the helper, false otherwise + ---@param card tts__Object Card to check for data + ---@return boolean: True if this card has data in the helper, false otherwise TokenManager.hasLocationData = function(card) internal.initDataHelperData() return internal.getLocationData(card) ~= nil @@ -1367,8 +447,8 @@ do -- Spawn tokens for a card based on the uses metadata. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for - ---@param extraUses Table A table of = which will modify the number of tokens + ---@param card tts__Object Card to maybe spawn tokens for + ---@param extraUses table A table of = which will modify the number of tokens --- spawned for that type. e.g. Akachi's playmat should pass "Charge"=1 internal.spawnTokensFromUses = function(card, extraUses) local uses = internal.getUses(card) @@ -1390,7 +470,7 @@ do -- Spawn tokens for a card based on the data helper data. This will consider the face up/down state -- of the card for both locations and standard cards. - ---@param card Object Card to maybe spawn tokens for + ---@param card tts__Object Card to maybe spawn tokens for internal.spawnTokensFromDataHelper = function(card) internal.initDataHelperData() local playerData = internal.getPlayerCardData(card) @@ -1404,8 +484,8 @@ do end -- Spawn tokens for a player card using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Player card data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param playerData table Player card data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnPlayerCardTokensFromDataHelper = function(card, playerData) local token = playerData.tokenType @@ -1415,8 +495,8 @@ do end -- Spawn tokens for a location using data retrieved from the Data Helper. - ---@param card Object Card to maybe spawn tokens for - ---@param locationData Table Location data structure retrieved from the DataHelper. Should be + ---@param card tts__Object Card to maybe spawn tokens for + ---@param locationData table Location data structure retrieved from the DataHelper. Should be -- the right data for this card. internal.spawnLocationTokensFromDataHelper = function(card, locationData) local clueCount = internal.getClueCountFromData(card, locationData) @@ -1455,7 +535,7 @@ do end -- Gets the right uses structure for this card, based on metadata and face up/down state - ---@param card Object Card to pull the uses from + ---@param card tts__Object Card to pull the uses from internal.getUses = function(card) local metadata = JSON.decode(card.getGMNotes()) or { } if metadata.type == "Location" then @@ -1472,9 +552,9 @@ do end -- Dynamically create positions for clues on a card. - ---@param card Object Card the clues will be placed on - ---@param count Integer How many clues? - ---@return Table Array of global positions to spawn the clues at + ---@param card tts__Object Card the clues will be placed on + ---@param count number How many clues? + ---@return table: Array of global positions to spawn the clues at internal.buildClueOffsets = function(card, count) local pos = card.getPosition() local cluePositions = { } @@ -1486,9 +566,9 @@ do return cluePositions end - ---@param card Object Card object to be replenished - ---@param uses Table The already decoded metadata.uses (to avoid decoding again) - ---@param mat Object The playmat the card is placed on (for rotation and casting) + ---@param card tts__Object Card object to be replenished + ---@param uses table The already decoded metadata.uses (to avoid decoding again) + ---@param mat tts__Object The playmat the card is placed on (for rotation and casting) internal.replenishTokens = function(card, uses, mat) local cardPos = card.getPosition() @@ -1534,4 +614,915 @@ do return TokenManager end end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + end + + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local TokenSpawnTracker = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getSpawnTracker() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + end + + TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) + return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + end + + TokenSpawnTracker.markTokensSpawned = function(cardGuid) + return getSpawnTracker().call("markTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetTokensSpawned = function(cardGuid) + return getSpawnTracker().call("resetTokensSpawned", cardGuid) + end + + TokenSpawnTracker.resetAllAssetAndEvents = function() + return getSpawnTracker().call("resetAllAssetAndEvents") + end + + TokenSpawnTracker.resetAllLocations = function() + return getSpawnTracker().call("resetAllLocations") + end + + TokenSpawnTracker.resetAll = function() + return getSpawnTracker().call("resetAll") + end + + return TokenSpawnTracker +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/PlayArea") +end) +__bundle_register("core/PlayArea", function(require, _LOADED, __bundle_register, __bundle_modules) +local guidReferenceApi = require("core/GUIDReferenceApi") +local searchLib = require("util/SearchLib") +local tokenManager = require("core/token/TokenManager") + +-- Location connection directional options +local BIDIRECTIONAL = 0 +local ONE_WAY = 1 +local INCOMING_ONE_WAY = 2 + +-- Connector draw parameters +local CONNECTION_THICKNESS = 0.015 +local DRAGGING_CONNECTION_THICKNESS = 0.15 +local DRAGGING_CONNECTION_COLOR = { 0.8, 0.8, 0.8, 1 } +local DIRECTIONAL_ARROW_DISTANCE = 3.5 +local ARROW_ARM_LENGTH = 0.9 +local ARROW_ANGLE = 25 + +-- Height to draw the connector lines, places them just above the table and always below cards +local CONNECTION_LINE_Y = 1.529 + +-- used for recreating the link to a custom data helper after image change +customDataHelper = nil + +local DEFAULT_URL = "http://cloud-3.steamusercontent.com/ugc/998015670465071049/FFAE162920D67CF38045EFBD3B85AD0F916147B2/" + +local SHIFT_OFFSETS = { + left = { x = 0.00, y = 0, z = 7.67 }, + right = { x = 0.00, y = 0, z = -7.67 }, + up = { x = 6.54, y = 0, z = 0.00 }, + down = { x = -6.54, y = 0, z = 0.00 } +} +local SHIFT_EXCLUSION = { + ["b7b45b"] = true, + ["f182ee"] = true, + ["721ba2"] = true +} +local LOC_LINK_EXCLUDE_SCENARIOS = { + ["The Witching Hour"] = true, + ["The Heart of Madness"] = true +} + +local locations = {} +local locationConnections = {} +local draggingGuids = {} +local missingData = {} +local collisionEnabled = false +local currentScenario, connectionsEnabled + +--------------------------------------------------------- +-- general code +--------------------------------------------------------- + +function onSave() + return JSON.encode({ + trackedLocations = locations, + currentScenario = currentScenario, + connectionColor = connectionColor, + connectionsEnabled = connectionsEnabled + }) +end + +function onLoad(savedData) + self.interactable = false -- this needs to be here since the playarea will be reloaded when the image changes + local loadedData = JSON.decode(savedData) or {} + locations = loadedData.trackedLocations or {} + currentScenario = loadedData.currentScenario + connectionColor = loadedData.connectionColor or { 0.4, 0.4, 0.4, 1 } + connectionsEnabled = loadedData.connectionsEnabled or true + + Wait.time(function() collisionEnabled = true end, 0.1) +end + +-- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the +-- data to the local token manager instance. +---@param args table Single-value array holding the GUID of the Custom Data Helper making the call +function updateLocations(args) + customDataHelper = getObjectFromGUID(args[1]) + if customDataHelper ~= nil then + tokenManager.addLocationData(customDataHelper.getTable("LOCATIONS_DATA")) + end +end + +-- sets the image of the playarea +function updateSurface(newURL) + local customInfo = self.getCustomObject() + + if newURL ~= "" and newURL ~= nil and newURL ~= DEFAULT_URL then + customInfo.image = newURL + broadcastToAll("New Playarea Image Applied", { 0.2, 0.9, 0.2 }) + else + customInfo.image = DEFAULT_URL + broadcastToAll("Default Playarea Image Applied", { 0.2, 0.9, 0.2 }) + end + + self.setCustomObject(customInfo) + + local guid = nil + + if customDataHelper then guid = customDataHelper.getGUID() end + self.reload() + + if guid ~= nil then + Wait.time(function() updateLocations({ guid }) end, 1) + end +end + +-- TTS event, called for each object that is placed on the playarea +function onCollisionEnter(collisionInfo) + if not collisionEnabled then return end + + local object = collisionInfo.collision_object + + if object.type == "Deck" then + table.insert(missingData, object) + end + + -- only continue for cards + if object.type ~= "Card" then return end + + -- check if we should spawn clues here and do so according to playercount + if shouldSpawnTokens(object) then + tokenManager.spawnForCard(object) + end + + -- If this card was being dragged, clear the dragging connections. A multi-drag/drop may send + -- the dropped card immediately into a deck, so this has to be done here + if draggingGuids[object.getGUID()] ~= nil then + object.setVectorLines({}) + draggingGuids[object.getGUID()] = nil + end + + maybeTrackLocation(object) +end + +function shouldSpawnTokens(card) + local metadata = JSON.decode(card.getGMNotes()) + if metadata == nil then + return tokenManager.hasLocationData(card) + end + return metadata.type == "Location" + or metadata.type == "Enemy" + or metadata.type == "Treachery" + or metadata.weakness + -- hardcoded IDs for "Makeshift Trap" and "Shrine of the Moirai" + -- these cards are events with uses, that attach to encounter cards and thus will enter play in the playarea + -- TODO: probably turn this into a metadata field if we get more cards like that + or metadata.id == "07310" + or metadata.id == "09100" +end + +function onCollisionExit(collisionInfo) + maybeUntrackLocation(collisionInfo.collision_object) +end + +-- Destroyed objects don't trigger onCollisionExit(), so check on destruction to untrack as well +function onObjectDestroy(object) + maybeUntrackLocation(object) +end + +function onObjectPickUp(player, object) + -- only continue for cards + local objType = object.name + if objType ~= "Card" and objType ~= "CardCustom" then return end + + -- onCollisionExit USUALLY fires first, so we have to check the card to see if it's a location we + -- should be tracking + if showLocationLinks() and isInPlayArea(object) and object.getGMNotes() ~= nil and object.getGMNotes() ~= "" then + local pickedUpGuid = object.getGUID() + local metadata = JSON.decode(object.getGMNotes()) or {} + if metadata.type == "Location" then + -- onCollisionExit sometimes comes 1 frame after onObjectPickUp (rather than before it or in + -- the same frame). This causes a mismatch in the data between dragging the on-table, and + -- that one frame draws connectors on the card which then show up as shadows for snap points. + -- Waiting ensures we always do thing in the expected Exit->PickUp order + Wait.frames(function() + if object.is_face_down then + draggingGuids[pickedUpGuid] = metadata.locationBack + else + draggingGuids[pickedUpGuid] = metadata.locationFront + end + rebuildConnectionList() + end, 2) + end + end +end + +function onUpdate() + -- Due to the frequence of onUpdate calls, ensure that we only process any changes to the + -- connection list once, and only redraw once + local needsConnectionRebuild = false + local needsConnectionDraw = false + for guid, _ in pairs(draggingGuids) do + local obj = getObjectFromGUID(guid) + if obj == nil or not isInPlayArea(obj) then + draggingGuids[guid] = nil + needsConnectionRebuild = true + -- If object still exists then it's been dragged outside the area and needs to clear the + -- lines attached to it + if obj ~= nil then + obj.setVectorLines({}) + end + end + -- Even if the last location left the play area, need one last draw to clear the lines + needsConnectionDraw = true + end + if needsConnectionRebuild then + rebuildConnectionList() + end + if needsConnectionDraw then + drawDraggingConnections() + end +end + +-- Checks the given card and adds it to the list of locations tracked for connection purposes. +-- A card will be added to the tracking if it is a location in the play area (based on centerpoint). +---@param card tts__Object A card object, possibly a location. +function maybeTrackLocation(card) + -- Collision checks for any part of the card overlap, but our other tracking is centerpoint + -- Ignore any collision where the centerpoint isn't in the area + if isInPlayArea(card) then + local metadata = JSON.decode(card.getGMNotes()) + if metadata == nil then + table.insert(missingData, card) + else + if metadata.type == "Location" then + if card.is_face_down then + locations[card.getGUID()] = metadata.locationBack + else + locations[card.getGUID()] = metadata.locationFront + end + + -- only draw connection lines for not-excluded scenarios + if showLocationLinks() then + rebuildConnectionList() + drawBaseConnections() + end + end + end + end +end + +-- Stop tracking a location for connection drawing. This should be called for both collision exit +-- and destruction, as a destroyed object does not trigger collision exit. An object can also be +-- deleted mid-drag, but the ordering for drag events means we can't clear those here and those will +-- be cleared in the next onUpdate() cycle. +---@param card tts__Object Card to (maybe) stop tracking +function maybeUntrackLocation(card) + -- Locked objects no longer collide (hence triggering an exit event) but are still in the play + -- area. If the object is now locked, don't remove it. + if locations[card.getGUID()] ~= nil and not card.locked then + locations[card.getGUID()] = nil + rebuildConnectionList() + drawBaseConnections() + end +end + +-- Global event handler, delegated from Global. Clears any connection lines from dragged cards +-- before they are destroyed by entering a deck. Removal of the card from the dragging list will +-- be handled during the next onUpdate() call. +function tryObjectEnterContainer() + for draggedGuid, _ in pairs(draggingGuids) do + local draggedObj = getObjectFromGUID(draggedGuid) + if draggedObj ~= nil then + draggedObj.setVectorLines({}) + end + end +end + +-- Builds a list of GUID to GUID connection information based on the currently tracked locations. +-- This will update the connection information and store it in the locationConnections data member, +-- but does not draw those connections. This should often be followed by a call to +-- drawBaseConnections() +function rebuildConnectionList() + if not showLocationLinks() then + locationConnections = {} + return + end + + local iconCardList = {} + + -- Build a list of cards with each icon as their location ID + for cardId, metadata in pairs(draggingGuids) do + buildLocListByIcon(cardId, iconCardList, metadata) + end + for cardId, metadata in pairs(locations) do + buildLocListByIcon(cardId, iconCardList, metadata) + end + + -- Pair up all the icons + locationConnections = {} + for cardId, metadata in pairs(draggingGuids) do + buildConnection(cardId, iconCardList, metadata) + end + for cardId, metadata in pairs(locations) do + if draggingGuids[cardId] == nil then + buildConnection(cardId, iconCardList, metadata) + end + end +end + +-- Extracts the card's icon string into a list of individual location icons +---@param cardId string GUID of the card to pull the icon data from +---@param iconCardList table A table of icon->GUID list. Mutable, will be updated by this method +---@param locData table A table containing the metadata for the card (for the correct side) +function buildLocListByIcon(cardId, iconCardList, locData) + if locData ~= nil and locData.icons ~= nil then + for icon in string.gmatch(locData.icons, "%a+") do + if iconCardList[icon] == nil then + iconCardList[icon] = {} + end + table.insert(iconCardList[icon], cardId) + end + end +end + +-- Builds the connections for the given cardID by finding matching icons and adding them to the +-- Playarea's locationConnections table. +---@param cardId string GUID of the card to build the connections for +---@param iconCardList table A table of icon->GUID List. Used to find matching icons for connections. +---@param locData table A table containing the metadata for the card (for the correct side) +function buildConnection(cardId, iconCardList, locData) + if locData ~= nil and locData.connections ~= nil then + locationConnections[cardId] = {} + for icon in string.gmatch(locData.connections, "%a+") do + if iconCardList[icon] ~= nil then + for _, connectedGuid in ipairs(iconCardList[icon]) do + -- If the reciprocal exists, convert it to BiDi, otherwise add as a one-way + if locationConnections[connectedGuid] ~= nil + and (locationConnections[connectedGuid][cardId] == ONE_WAY + or locationConnections[connectedGuid][cardId] == BIDIRECTIONAL) then + locationConnections[connectedGuid][cardId] = BIDIRECTIONAL + locationConnections[cardId][connectedGuid] = nil + else + if locationConnections[connectedGuid] == nil then + locationConnections[connectedGuid] = {} + end + locationConnections[cardId][connectedGuid] = ONE_WAY + locationConnections[connectedGuid][cardId] = INCOMING_ONE_WAY + end + end + end + end + end +end + +-- Draws the lines for connections currently in locationConnections but not in draggingGuids. +-- Constructed vectors will be set to the playmat +function drawBaseConnections() + if not showLocationLinks() then + locationConnections = {} + self.setVectorLines({}) + return + end + local cardConnectionLines = {} + + for originGuid, targetGuids in pairs(locationConnections) do + -- Objects should reliably exist at this point, but since this can be called during onUpdate the + -- object checks are conservative just to make sure. + local origin = getObjectFromGUID(originGuid) + if draggingGuids[originGuid] == nil and origin ~= nil then + for targetGuid, direction in pairs(targetGuids) do + local target = getObjectFromGUID(targetGuid) + if draggingGuids[targetGuid] == nil and target ~= nil then + -- Since we process the full list, we're guaranteed to hit any ONE_WAY connections later + -- so we can ignore INCOMING_ONE_WAY + if direction == BIDIRECTIONAL then + addBidirectionalVector(origin, target, self, cardConnectionLines) + elseif direction == ONE_WAY then + addOneWayVector(origin, target, self, cardConnectionLines) + end + end + end + end + end + self.setVectorLines(cardConnectionLines) +end + +-- Draws the lines for cards which are currently being dragged. +function drawDraggingConnections() + if not showLocationLinks() then + return + end + local cardConnectionLines = {} + local ownedVectors = {} + + for originGuid, _ in pairs(draggingGuids) do + targetGuids = locationConnections[originGuid] + -- Objects should reliably exist at this point, but since this can be called during onUpdate the + -- object checks are conservative just to make sure. + local origin = getObjectFromGUID(originGuid) + if draggingGuids[originGuid] and origin ~= nil and targetGuids ~= nil then + ownedVectors[originGuid] = {} + for targetGuid, direction in pairs(targetGuids) do + local target = getObjectFromGUID(targetGuid) + if target ~= nil then + if direction == BIDIRECTIONAL then + addBidirectionalVector(origin, target, origin, ownedVectors[originGuid]) + elseif direction == ONE_WAY then + addOneWayVector(origin, target, origin, ownedVectors[originGuid]) + elseif direction == INCOMING_ONE_WAY and not draggingGuids[targetGuid] then + addOneWayVector(target, origin, origin, ownedVectors[originGuid]) + end + end + end + end + end + for ownerGuid, vectors in pairs(ownedVectors) do + local card = getObjectFromGUID(ownerGuid) + card.setVectorLines(vectors) + end +end + +-- Draws a bidirectional location connection between the two cards, adding the lines to do so to the +-- given lines list. +---@param card1 tts__Object One of the card objects to connect +---@param card2 tts__Object The other card object to connect +---@param vectorOwner tts__Object The object which these lines will be set to. Used for relative +--- positioning and scaling, as well as highlighting connections during a drag operation +---@param lines table List of vector line elements. Mutable, will be updated to add this connector +function addBidirectionalVector(card1, card2, vectorOwner, lines) + local cardPos1 = card1.getPosition() + local cardPos2 = card2.getPosition() + cardPos1.y = CONNECTION_LINE_Y + cardPos2.y = CONNECTION_LINE_Y + + local pos1 = vectorOwner.positionToLocal(cardPos1) + local pos2 = vectorOwner.positionToLocal(cardPos2) + + table.insert(lines, { + points = { pos1, pos2 }, + color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, + thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, + }) +end + +-- Draws a one-way location connection between the two cards, adding the lines to do so to the +-- given lines list. Arrows will point towards the target card. +---@param origin tts__Object Origin card in the connection +---@param target tts__Object Target card object to connect +---@param vectorOwner tts__Object The object which these lines will be set to. Used for relative +--- positioning and scaling, as well as highlighting connections during a drag operation +---@param lines table List of vector line elements. Mutable, will be updated to add this connector +function addOneWayVector(origin, target, vectorOwner, lines) + -- Start with the BiDi then add the arrow lines to it + addBidirectionalVector(origin, target, vectorOwner, lines) + local originPos = origin.getPosition() + local targetPos = target.getPosition() + originPos.y = CONNECTION_LINE_Y + targetPos.y = CONNECTION_LINE_Y + + -- Calculate card distance to be closer for horizontal positions than vertical, since cards are + -- taller than they are wide + local heading = Vector(originPos):sub(targetPos):heading("y") + local distanceFromCard = DIRECTIONAL_ARROW_DISTANCE * 0.7 + DIRECTIONAL_ARROW_DISTANCE * 0.3 * math.abs(math.sin(math.rad(heading))) + + -- Calculate the three possible arrow positions. These are offset by half the arrow length to + -- make them visually balanced by keeping the arrows centered, not tracking the point + local midpoint = Vector(originPos):add(targetPos):scale(0.5):moveTowards(targetPos, ARROW_ARM_LENGTH / 2) + local closeToOrigin = Vector(originPos):moveTowards(targetPos, distanceFromCard + ARROW_ARM_LENGTH / 2) + local closeToTarget = Vector(targetPos):moveTowards(originPos, distanceFromCard - ARROW_ARM_LENGTH / 2) + + if (originPos:distance(closeToOrigin) > originPos:distance(closeToTarget)) then + addArrowLines(midpoint, originPos, vectorOwner, lines) + else + addArrowLines(closeToOrigin, originPos, vectorOwner, lines) + addArrowLines(closeToTarget, originPos, vectorOwner, lines) + end +end + +-- Draws an arrowhead at the given position. +---@param arrowheadPos tts__Vector Centerpoint of the arrowhead to draw (NOT the tip of the arrow) +---@param originPos tts__Vector Origin point of the connection, used to position the arrow arms +---@param vectorOwner tts__Object The object which these lines will be set to. Used for relative +--- positioning and scaling, as well as highlighting connections during a drag operation +---@param lines table List of vector line elements. Mutable, will be updated to add this arrow +function addArrowLines(arrowheadPos, originPos, vectorOwner, lines) + local arrowArm1 = Vector(arrowheadPos):moveTowards(originPos, ARROW_ARM_LENGTH):sub(arrowheadPos):rotateOver("y", -1 * ARROW_ANGLE):add(arrowheadPos) + local arrowArm2 = Vector(arrowheadPos):moveTowards(originPos, ARROW_ARM_LENGTH):sub(arrowheadPos):rotateOver("y", ARROW_ANGLE):add(arrowheadPos) + + local head = vectorOwner.positionToLocal(arrowheadPos) + local arm1 = vectorOwner.positionToLocal(arrowArm1) + local arm2 = vectorOwner.positionToLocal(arrowArm2) + table.insert(lines, { + points = { arm1, head, arm2 }, + color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, + thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, + }) +end + +-- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain +-- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' +---@param playerColor string Color of the player requesting the shift. Used solely to send an error +--- message in the unlikely case that the scripting zone has been deleted +function shiftContentsUp(playerColor) + shiftContents(playerColor, "up") +end + +function shiftContentsDown(playerColor) + shiftContents(playerColor, "down") +end + +function shiftContentsLeft(playerColor) + shiftContents(playerColor, "left") +end + +function shiftContentsRight(playerColor) + shiftContents(playerColor, "right") +end + +function shiftContents(playerColor, direction) + local zone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone") + if not zone then + broadcastToColor("Scripting zone couldn't be found.", playerColor, "Red") + return + end + + for _, object in ipairs(zone.getObjects()) do + if not (SHIFT_EXCLUSION[object.getGUID()] or object.hasTag("displacement_excluded")) then + object.translate(SHIFT_OFFSETS[direction]) + end + end + Wait.time(drawBaseConnections, 0.1) +end + +-- Check to see if the given object is within the bounds of the play area, based solely on the X and +-- Z coordinates, ignoring height +---@param object tts__Object Object to check +---@return boolean: True if the object is inside the play area +function isInPlayArea(object) + local bounds = self.getBounds() + local position = object.getPosition() + -- Corners are arbitrary since it's all global - c1 goes down both axes, c2 goes up + local c1 = { x = bounds.center.x - bounds.size.x / 2, z = bounds.center.z - bounds.size.z / 2 } + local c2 = { x = bounds.center.x + bounds.size.x / 2, z = bounds.center.z + bounds.size.z / 2 } + + return position.x > c1.x and position.x < c2.x and position.z > c1.z and position.z < c2.z +end + +function onScenarioChanged(scenarioName) + currentScenario = scenarioName + if not showLocationLinks() then + broadcastToAll("Automatic location connections not available for this scenario") + end +end + +function showLocationLinks() + return not LOC_LINK_EXCLUDE_SCENARIOS[currentScenario] and connectionsEnabled +end + +-- Sets this playmat's snap points to limit snapping to locations or not. +-- If matchTypes is false, snap points will be reset to snap all cards. +---@param matchTypes boolean Whether snap points should only snap for the matching card types. +function setLimitSnapsByType(matchTypes) + local snaps = self.getSnapPoints() + for i, snap in ipairs(snaps) do + local snapTags = snaps[i].tags + if matchTypes then + if snapTags == nil then + snaps[i].tags = { "Location" } + else + table.insert(snaps[i].tags, "Location") + end + else + snaps[i].tags = nil + end + end + self.setSnapPoints(snaps) +end + +-- called by the option panel to enabled / disable location connections +function setConnectionDrawState(state) + connectionsEnabled = state + rebuildConnectionList() + drawBaseConnections() +end + +-- called by the option panel to edit the location connection color +function setConnectionColor(color) + connectionColor = color + rebuildConnectionList() + drawBaseConnections() +end + +-- count victory points on locations in play area +---@param highlightOff boolean True if highlighting should be enabled +---@return. Returns the total amount of VP found in the play area +function countVP(highlightOff) + local totalVP = 0 + + for cardId, metadata in pairs(locations) do + local card = getObjectFromGUID(cardId) + if metadata ~= nil and card ~= nil then + if highlightOff == true then + card.highlightOff("Green") + end + + local cardVP = tonumber(metadata.victory) or 0 + if cardVP ~= 0 and not cardHasClues(card) then + totalVP = totalVP + cardVP + if highlightOff == false then + card.highlightOn("Green") + end + end + end + end + + return totalVP +end + +-- checks if a card has clues on it, returns true if clues are on it +---@param card tts__Object Card to check for clues +function cardHasClues(card) + local searchResult = searchLib.onObject(card, "isClue") + return #searchResult > 0 +end + +-- highlights all locations in the play area without metadata +---@param state boolean True if highlighting should be enabled +function highlightMissingData(state) + for i, obj in pairs(missingData) do + if obj ~= nil then + if state then + obj.highlightOff("Red") + else + obj.highlightOn("Red") + end + else + missingData[i] = nil + end + end +end + +-- rebuilds local snap points (could be useful in the future again) +function buildSnaps() + local upperleft = { x = 1.53, z = -1.09 } + local lowerright = { x = -1.53, z = 1.55 } + local snaps = {} + + -- creates 81 snap points, for uneven rows + columns it makes a rotation snap point + for i = 1, 9 do + for j = 1, 9 do + local snap = {} + snap.position = {} + snap.position.x = round(upperleft.x - (upperleft.x - lowerright.x) * (i - 1) / 8, 3) + snap.position.y = 0.1 + snap.position.z = round(upperleft.z - (upperleft.z - lowerright.z) * (j - 1) / 8, 3) + + -- enable rotation snaps for uneven rows / columns + if (i % 2 ~= 0) and (j % 2 ~= 0) then + snap.rotation = { 0, 0, 0 } + snap.rotation_snap = true + end + + table.insert(snaps, snap) + end + end + self.setSnapPoints(snaps) +end + +-- utility function +function round(num, numDecimalPlaces) + local mult = 10 ^ (numDecimalPlaces or 0) + return math.floor(num * mult + 0.5) / mult +end +end) return __bundle_require("__root") diff --git a/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua b/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua index bf624736c..2830b8252 100644 --- a/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua +++ b/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua @@ -41,282 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/PlayAreaSelector") -end) -__bundle_register("core/PlayAreaSelector", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/PlayAreaImageData") -- this fills the variable "PLAYAREA_IMAGE_DATA" -local optionPanelApi = require("core/OptionPanelApi") -local playAreaApi = require("core/PlayAreaApi") -local typeIndex, selectionIndex, plainNameCache - -function onSave() return JSON.encode({ typeIndex = typeIndex, selectionIndex = selectionIndex }) end - -function onLoad(savedData) - self.createButton({ - function_owner = self, - click_function = "onClick_toggleGallery", - tooltip = "Show Image Gallery", - position = {0, 0.06, 0}, - height = 1500, - width = 1500, - color = { 1, 1, 1, 0 } - }) - - local loadedData = JSON.decode(savedData) or {} - typeIndex = loadedData.typeIndex or 1 - selectionIndex = loadedData.selectionIndex or 1 - Wait.time(updatePlayAreaGallery, 0.5) - math.randomseed(os.time()) -end - --- click function for main button -function onClick_toggleGallery() - Global.call("togglePlayAreaGallery") -end - -function onClick_defaultImage() - playAreaApi.updateSurface() - Global.call("togglePlayAreaGallery") -end - -function getDataSubTableByIndex(dataTable, index) - local loopId = 1 - for i, v in pairs(dataTable) do - if index == loopId then return v end - loopId = loopId + 1 - end - return {} -end - -function updatePlayAreaGallery() - -- get subtables - local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) - local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) - - -- get global xml to insert elements - local globalXml = UI.getXmlTable() - - -- selectable items - local itemSelection = getXmlTableElementById(globalXml, 'itemSelection') - itemSelection.children = {} - - local i = 0 - for itemName, _ in pairs(dataForType) do - i = i + 1 - table.insert(itemSelection.children, - { - tag = "Panel", - attributes = { class = "itemPanel", id = "typePanel" .. i }, - children = { - tag = "Text", - value = itemName, - attributes = { class = "itemText", id = "typeListText" .. i } - } - }) - end - - -- selectable images for that item - local playareaList = getXmlTableElementById(globalXml, 'playareaList') - playareaList.children = {} - - for i, v in ipairs(dataForSelection) do - table.insert(playareaList.children, - { - tag = "VerticalLayout", - attributes = { class = "imageBox", id = "image" .. i }, - children = { - { - tag = 'Image', - attributes = { class = "playareaImage", image = v.URL } - }, - { - tag = 'Text', - value = v.Name, - attributes = { class = "imageName" } - } - } - }) - end - - playareaList.attributes.height = round(#playareaList.children / 2, 0) * 380 - UI.setXmlTable(globalXml) - Wait.time(highlightTabAndItem, 0.1) -end - -function onClick_imageTab(_, _, tabId) - typeIndex = tonumber(tabId:sub(9)) - selectionIndex = 1 - updatePlayAreaGallery() -end - -function onClick_listItem(_, _, listId) - selectionIndex = tonumber(listId:sub(10)) - updatePlayAreaGallery() -end - -function onClick_image(_, _, id) - local imageIndex = tonumber(id:sub(6)) - local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) - local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) - local newURL = dataForSelection[imageIndex].URL - playAreaApi.updateSurface(newURL) - Global.call("togglePlayAreaGallery") -end - -function highlightTabAndItem() - -- highlight active tab - for i = 1, 5 do - local color = "#888888" - if i == typeIndex then color = "#ffffff" end - UI.setAttribute("imageTab" .. i, "color", color) - end - - -- highlight item - UI.setAttribute("typePanel" .. selectionIndex, "color", "grey") - UI.setAttribute("typeListText" .. selectionIndex, "color", "black") -end - --- loops through an XML table and returns the specified object ----@param ui Table XmlTable (get this via getXmlTable) ----@param id String Id of the object to return -function getXmlTableElementById(ui, id) - for _, obj in ipairs(ui) do - if obj.attributes and obj.attributes.id and obj.attributes.id == id then return obj end - if obj.children then - local result = getXmlTableElementById(obj.children, id) - if result then return result end - end - end - return nil -end - --- utility function -function round(num, numDecimalPlaces) - local mult = 10 ^ (numDecimalPlaces or 0) - return math.floor(num * mult + 0.5) / mult -end - -function maybeUpdatePlayAreaImage(scenarioName) - -- check if option is enabled - local optionPanelState = optionPanelApi.getOptions() - if not optionPanelState["changePlayAreaImage"] then return end - - -- initialize cache if nil - if not plainNameCache then - plainNameCache = {} - for i, dataForType in pairs(PLAYAREA_IMAGE_DATA) do - for j, dataForCycle in pairs(dataForType) do - for k, data in ipairs(dataForCycle) do - local plainName = getPlainName(data.Name) - - -- override plainName for all images in the "Other Images" category (except the default image) - if i == "Other Images" and data.Name ~= "Default Image" then - plainName = "Generic" - end - - if not plainNameCache[plainName] then - plainNameCache[plainName] = {} - end - table.insert(plainNameCache[plainName], data.URL) - end - end - end - end - - -- look for matching playarea image or use generic ones instead - local listOfEligibleImages = {} - if plainNameCache[scenarioName] then - listOfEligibleImages = plainNameCache[scenarioName] - else - listOfEligibleImages = plainNameCache["Generic"] - end - - -- get a random entry from the eligible list - local newImageIndex = math.random(#listOfEligibleImages) - playAreaApi.updateSurface(listOfEligibleImages[newImageIndex]) -end - --- attempts to extract the plain scenario name from the playarea image name -function getPlainName(str) - -- remove prefix type 1 - str = str:gsub("%w+%-%w%s%-%s", "") -- matches "II-B - Thousand Shapes of Horror 1" - - -- remove prefix type 2 - str = str:gsub("%w+%-%w%s", "") -- matches "59-Z Congress of Keys 1" - - -- remove prefix type 3 - str = str:gsub("%w+%s%-%s", "") -- matches "III - The Secret Name 4" - - -- remove prefix type 4 - str = str:gsub("%?+%s%-%s", "") -- matches "??? - Fatal Mirage" - - -- remove suffix (numbering) - str = str:gsub("%s%d+", "") - - return str -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -331,60 +55,55 @@ do end -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter + ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter + ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages + ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) + getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) + getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) + getPlayArea().call("shiftContentsRight", playerColor) end - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn + ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end - -- Sets the connection color + ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- 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. + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -401,13 +120,13 @@ do end -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled + ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end @@ -427,7 +146,7 @@ do -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end @@ -1010,19 +729,19 @@ PLAYAREA_IMAGE_DATA = { URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725481929/A35EDF11BD6AF52784BA6611C363CBBB373622EE/" }, { - Name = "II - Forbidden Peaks 1", + Name = "II - To the Forbidden Peaks 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482688/B50455616DFC14FE0B9398DBE2A3A1AE25040516/" }, { - Name = "II - Forbidden Peaks 2", + Name = "II - To the Forbidden Peaks 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482839/17786225AA56E75E558491E7E710F555AF3E5799/" }, { - Name = "III - City of Elder Things 1", + Name = "III - City of the Elder Things 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483014/B74378E02A1A99F544CD98141EF62193A2A612FB/" }, { - Name = "III - City of Elder Things 2", + Name = "III - City of the Elder Things 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483208/CDFF7A2D404485DE2B4C4ED54B34E197515F0094/" }, { @@ -1072,11 +791,11 @@ PLAYAREA_IMAGE_DATA = { URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444450/FE4C335B0F72E83900A4EED0FD1A1D304D70D6B7/" }, { - Name = "59-Z Congress of Keys 1", + Name = "59-Z Congress of the Keys 1", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444576/5BB32469ED412D59BB0A46E57D226500B1D0568B/" }, { - Name = "59-Z Congress of Keys 2", + Name = "59-Z Congress of the Keys 2", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444690/B01A1FEAB57473D9B6DF11B92D62C214AA1C2C02/" } } @@ -1146,27 +865,27 @@ PLAYAREA_IMAGE_DATA = { URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491658/5446E231AEF72CF4F7B4892116671FF7175EFA0F/" } }, - ["Labyrinths of Lunacy"] = { + ["The Labyrinths of Lunacy"] = { { - Name = "Labyrinths of Lunacy 1", + Name = "The Labyrinths of Lunacy 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489685/D2D342844212C8A21E030418935A227C2E3279DB/" }, { - Name = "Labyrinths of Lunacy 2", + Name = "The Labyrinths of Lunacy 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489820/E3E18B0940C2604F62E564AD43F178FF9F13B3C9/" }, { - Name = "Labyrinths of Lunacy 3", + Name = "The Labyrinths of Lunacy 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489972/6A34CF53190EAAAF57C31FB97A3C2ACBD27FEE40/" } }, - ["Murder at Excelsior Hotel"] = { + ["Murder at the Excelsior Hotel"] = { { - Name = "Murder at Excelsior Hotel 1", + Name = "Murder at the Excelsior Hotel 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725488868/7F7FE8BB3C7E3645B4377F86366C6073CDB8F113/" }, { - Name = "Murder at Excelsior Hotel 2", + Name = "Murder at the Excelsior Hotel 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489144/53A920E2D1A9F41937B21B0A5B1A4E450ABFC460/" } }, @@ -1234,19 +953,19 @@ PLAYAREA_IMAGE_DATA = { }, ["Dark Matter"] = { { - Name = "I - Tatterdemalion 1", + Name = "I - The Tatterdemalion 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504118/AC852F478D5BDA0C8A54A499B07A66E872560EC7/" }, { - Name = "I - Tatterdemalion 2", + Name = "I - The Tatterdemalion 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504319/5B24BB2080AC76D836708AABC1BC90FD884F043D/" }, { - Name = "I - Tatterdemalion 3", + Name = "I - The Tatterdemalion 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504461/73E4632A2EAAFA918924E60A64B03838CA6DDD77/" }, { - Name = "I - Tatterdemalion 4", + Name = "I - The Tatterdemalion 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504602/6DB8F081CC907A0D6F364E5045BB7E8FADA91B5C/" }, { @@ -1273,6 +992,10 @@ PLAYAREA_IMAGE_DATA = { Name = "IIIc - Strange Moons", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506071/78597C2FBE2DE55BFC86AEC9F42FE1B20D26544C/" }, + { + Name = "IV - The Machine in Yellow", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426327/41F6192EDCFFD6AAE2EE44C2BB5708B19D7464A9/" + }, { Name = "V - Fragment of Carcosa 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506388/A299C8D58171A6D78CF55D911C2B81C63D88444F/" @@ -1296,29 +1019,45 @@ PLAYAREA_IMAGE_DATA = { }, ["The Ghosts of Onigawa"] = { { - Name = "I - The Ghosts of Onigawa", - URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-01.png?raw=true" + Name = "I - The Hidden Village", + URL = "https://i.imgur.com/btTQffc.jpeg" }, { - Name = "II - In The Shadow Of Mount Kokoro", - URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-02.png?raw=true" + Name = "II - The House on the Hill", + URL = "https://i.imgur.com/YTHt8JQ.jpeg" }, { - Name = "III - The Onigawa River", - URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-03.png?raw=true" + Name = "III - The River Delta", + URL = "https://i.imgur.com/9Zk3iLJ.png" }, { - Name = "IV - The Crimson Butterfly", - URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-04.png?raw=true" + Name = "IV - The War Eternal", + URL = "https://i.imgur.com/6UtFHhc.jpeg" }, { - Name = "V - The Koi Conspiracy", - URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-05.png?raw=true" + Name = "V - Half Light", + URL = "https://i.imgur.com/hul7lLL.png" + }, + { + Name = "VI - The End of August", + URL = "https://i.imgur.com/PKWtpG7.jpeg" + }, + { + Name = "VII - The Molten Armory", + URL = "https://i.imgur.com/kMSdBRh.jpeg" + }, + { + Name = "VIII - The Black Harvest", + URL = "https://i.imgur.com/6ySucTS.jpeg" } } }, ["Fan-Made Scenarios"] = { ["Side Scenarios (FM)"] = { + { + Name = "Code Red at Bleeding Heart", + URL = "https://i.imgur.com/nTstdlj.jpeg" + }, { Name = "Consternation on the Constellation", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725512402/37F34A14CEEA9D2F889F7B97B065C0193F268FE1/" @@ -1431,4 +1170,282 @@ PLAYAREA_IMAGE_DATA = { } } end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/PlayAreaSelector") +end) +__bundle_register("core/PlayAreaSelector", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/PlayAreaImageData") -- this fills the variable "PLAYAREA_IMAGE_DATA" +local optionPanelApi = require("core/OptionPanelApi") +local playAreaApi = require("core/PlayAreaApi") +local typeIndex, selectionIndex, plainNameCache + +function onSave() return JSON.encode({ typeIndex = typeIndex, selectionIndex = selectionIndex }) end + +function onLoad(savedData) + self.createButton({ + function_owner = self, + click_function = "onClick_toggleGallery", + tooltip = "Show Image Gallery", + position = {0, 0.06, 0}, + height = 1500, + width = 1500, + color = { 1, 1, 1, 0 } + }) + + local loadedData = JSON.decode(savedData) or {} + typeIndex = loadedData.typeIndex or 1 + selectionIndex = loadedData.selectionIndex or 1 + Wait.time(updatePlayAreaGallery, 0.5) + math.randomseed(os.time()) +end + +-- click function for main button +function onClick_toggleGallery() + Global.call("togglePlayAreaGallery") +end + +function onClick_defaultImage() + playAreaApi.updateSurface() + Global.call("togglePlayAreaGallery") +end + +function getDataSubTableByIndex(dataTable, index) + local loopId = 1 + for i, v in pairs(dataTable) do + if index == loopId then return v end + loopId = loopId + 1 + end + return {} +end + +function updatePlayAreaGallery() + -- get subtables + local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) + local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) + + -- get global xml to insert elements + local globalXml = UI.getXmlTable() + + -- selectable items + local itemSelection = getXmlTableElementById(globalXml, 'itemSelection') + itemSelection.children = {} + + local i = 0 + for itemName, _ in pairs(dataForType) do + i = i + 1 + table.insert(itemSelection.children, + { + tag = "Panel", + attributes = { class = "itemPanel", id = "typePanel" .. i }, + children = { + tag = "Text", + value = itemName, + attributes = { class = "itemText", id = "typeListText" .. i } + } + }) + end + + -- selectable images for that item + local playareaList = getXmlTableElementById(globalXml, 'playareaList') + playareaList.children = {} + + for i, v in ipairs(dataForSelection) do + table.insert(playareaList.children, + { + tag = "VerticalLayout", + attributes = { class = "imageBox", id = "image" .. i }, + children = { + { + tag = 'Image', + attributes = { class = "playareaImage", image = v.URL } + }, + { + tag = 'Text', + value = v.Name, + attributes = { class = "imageName" } + } + } + }) + end + + playareaList.attributes.height = round(#playareaList.children / 2, 0) * 380 + UI.setXmlTable(globalXml) + Wait.time(highlightTabAndItem, 0.1) +end + +function onClick_imageTab(_, _, tabId) + typeIndex = tonumber(tabId:sub(9)) + selectionIndex = 1 + updatePlayAreaGallery() +end + +function onClick_listItem(_, _, listId) + selectionIndex = tonumber(listId:sub(10)) + updatePlayAreaGallery() +end + +function onClick_image(_, _, id) + local imageIndex = tonumber(id:sub(6)) + local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) + local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) + local newURL = dataForSelection[imageIndex].URL + playAreaApi.updateSurface(newURL) + Global.call("togglePlayAreaGallery") +end + +function highlightTabAndItem() + -- highlight active tab + for i = 1, 5 do + local color = "#888888" + if i == typeIndex then color = "#ffffff" end + UI.setAttribute("imageTab" .. i, "color", color) + end + + -- highlight item + UI.setAttribute("typePanel" .. selectionIndex, "color", "grey") + UI.setAttribute("typeListText" .. selectionIndex, "color", "black") +end + +-- loops through an XML table and returns the specified object +---@param ui table XmlTable (get this via getXmlTable) +---@param id string Id of the object to return +function getXmlTableElementById(ui, id) + for _, obj in ipairs(ui) do + if obj.attributes and obj.attributes.id and obj.attributes.id == id then return obj end + if obj.children then + local result = getXmlTableElementById(obj.children, id) + if result then return result end + end + end + return nil +end + +-- utility function +function round(num, numDecimalPlaces) + local mult = 10 ^ (numDecimalPlaces or 0) + return math.floor(num * mult + 0.5) / mult +end + +function maybeUpdatePlayAreaImage(scenarioName) + -- check if option is enabled + local optionPanelState = optionPanelApi.getOptions() + if not optionPanelState["changePlayAreaImage"] then return end + + -- initialize cache if nil + if not plainNameCache then + plainNameCache = {} + for i, dataForType in pairs(PLAYAREA_IMAGE_DATA) do + for j, dataForCycle in pairs(dataForType) do + for k, data in ipairs(dataForCycle) do + local plainName = getPlainName(data.Name) + + -- override plainName for all images in the "Other Images" category (except the default image) + if i == "Other Images" and data.Name ~= "Default Image" then + plainName = "Generic" + end + + if not plainNameCache[plainName] then + plainNameCache[plainName] = {} + end + table.insert(plainNameCache[plainName], data.URL) + end + end + end + end + + -- look for matching playarea image or use generic ones instead + local listOfEligibleImages = {} + if plainNameCache[scenarioName] then + listOfEligibleImages = plainNameCache[scenarioName] + else + listOfEligibleImages = plainNameCache["Generic"] + end + + -- get a random entry from the eligible list + local newImageIndex = math.random(#listOfEligibleImages) + playAreaApi.updateSurface(listOfEligibleImages[newImageIndex]) +end + +-- attempts to extract the plain scenario name from the playarea image name +function getPlainName(str) + -- remove prefix type 1 + str = str:gsub("%w+%-%w%s%-%s", "") -- matches "II-B - Thousand Shapes of Horror 1" + + -- remove prefix type 2 + str = str:gsub("%w+%-%w%s", "") -- matches "59-Z Congress of Keys 1" + + -- remove prefix type 3 + str = str:gsub("%w+%s%-%s", "") -- matches "III - The Secret Name 4" + + -- remove prefix type 4 + str = str:gsub("%?+%s%-%s", "") -- matches "??? - Fatal Mirage" + + -- remove suffix (numbering) + str = str:gsub("%s%d+", "") + + return str +end +end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Token Arranger 022907.ttslua b/unpacked/Custom_Token Token Arranger 022907.ttslua index f81acc3ea..fbab9a6cb 100644 --- a/unpacked/Custom_Token Token Arranger 022907.ttslua +++ b/unpacked/Custom_Token Token Arranger 022907.ttslua @@ -453,7 +453,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -480,29 +480,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -511,14 +512,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -539,17 +544,19 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "MythosArea") end - -- returns the chaos token metadata (if provided through scenario reference card) + ---@return any: Table of chaos token metadata (if provided through scenario reference card) MythosAreaApi.returnTokenData = function() return getMythosArea().call("returnTokenData") end - -- returns an object reference to the encounter deck + ---@return any: Object reference to the encounter deck MythosAreaApi.getEncounterDeck = function() return getMythosArea().call("getEncounterDeck") end -- draw an encounter card for the requesting mat + ---@param mat tts__Object Playermat that triggered this + ---@param alwaysFaceUp boolean Whether the card should be drawn face-up MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end @@ -565,29 +572,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, diff --git a/unpacked/Custom_Token Token Arranger 022907.yaml b/unpacked/Custom_Token Token Arranger 022907.yaml index 6220ed80b..d07dcbd99 100644 --- a/unpacked/Custom_Token Token Arranger 022907.yaml +++ b/unpacked/Custom_Token Token Arranger 022907.yaml @@ -41,7 +41,7 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: -42.3 + posX: -40.5 posY: 1.53 posZ: -46.5 rotX: 0 diff --git a/unpacked/Custom_Token Victory Display 6ccd6d.ttslua b/unpacked/Custom_Token Victory Display 6ccd6d.ttslua index 562b6c28e..48742c832 100644 --- a/unpacked/Custom_Token Victory Display 6ccd6d.ttslua +++ b/unpacked/Custom_Token Victory Display 6ccd6d.ttslua @@ -41,279 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") - end - - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for - 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 - 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 - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlayAreaApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getPlayArea() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") - end - - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") - end - - -- Returns the current value of the investigator counter from the playmat - ---@return Integer. Number of investigators currently set on the counter - PlayAreaApi.getInvestigatorCount = function() - return getInvestigatorCounter().getVar("val") - end - - -- Updates the current value of the investigator counter from the playmat - ---@param count Number of investigators to set on the counter - PlayAreaApi.setInvestigatorCount = function(count) - getInvestigatorCounter().call("updateVal", count) - end - - -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' - ---@param playerColor Color Color of the player requesting the shift for messages - PlayAreaApi.shiftContentsUp = function(playerColor) - return getPlayArea().call("shiftContentsUp", playerColor) - end - - PlayAreaApi.shiftContentsDown = function(playerColor) - return getPlayArea().call("shiftContentsDown", playerColor) - end - - PlayAreaApi.shiftContentsLeft = function(playerColor) - return getPlayArea().call("shiftContentsLeft", playerColor) - end - - PlayAreaApi.shiftContentsRight = function(playerColor) - return getPlayArea().call("shiftContentsRight", playerColor) - end - - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") - end - - -- Sets whether location connections should be drawn - PlayAreaApi.setConnectionDrawState = function(state) - getPlayArea().call("setConnectionDrawState", state) - end - - -- Sets the connection color - PlayAreaApi.setConnectionColor = function(color) - getPlayArea().call("setConnectionColor", color) - end - - -- Event to be called when the current scenario has changed. - ---@param scenarioName Name of the new scenario - PlayAreaApi.onScenarioChanged = function(scenarioName) - getPlayArea().call("onScenarioChanged", scenarioName) - end - - -- Sets this playmat's snap points to limit snapping to locations or not. - -- 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) - end - - -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged - -- cards before they're destroyed by entering the container - PlayAreaApi.tryObjectEnterContainer = function(container, object) - getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) - end - - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") - end - - -- highlights all locations in the play area without metadata - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightMissingData = function(state) - return getPlayArea().call("highlightMissingData", state) - end - - -- highlights all locations in the play area with VP - ---@param state Boolean True if highlighting should be enabled - PlayAreaApi.highlightCountedVP = function(state) - return getPlayArea().call("countVP", state) - end - - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) - end - - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image - end - - PlayAreaApi.updateSurface = function(url) - return getPlayArea().call("updateSurface", url) - end - - -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the - -- data to the local token manager instance. - ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call - PlayAreaApi.updateLocations = function(args) - getPlayArea().call("updateLocations", args) - end - - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") - end - - return PlayAreaApi -end -end) -__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local CHAOS_TOKEN_NAMES = { - ["Elder Sign"] = true, - ["+1"] = true, - ["0"] = true, - ["-1"] = true, - ["-2"] = true, - ["-3"] = true, - ["-4"] = true, - ["-5"] = true, - ["-6"] = true, - ["-7"] = true, - ["-8"] = true, - ["Skull"] = true, - ["Cultist"] = true, - ["Tablet"] = true, - ["Elder Thing"] = true, - ["Auto-fail"] = true, - ["Bless"] = true, - ["Curse"] = true, - ["Frost"] = true - } - - local TokenChecker = {} - - -- returns true if the passed object is a chaos token (by name) - TokenChecker.isChaosToken = function(obj) - if CHAOS_TOKEN_NAMES[obj.getName()] then - return true - else - return false - end - end - - return TokenChecker -end -end) -__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local SearchLib = {} - local filterFunctions = { - isActionToken = function(x) return x.getDescription() == "Action Token" end, - 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, - isTileOrToken = function(x) return x.type == "Tile" end - } - - -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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) - if filter then filter = 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 - }) - - -- filtering the result - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then - table.insert(objList, v.hit_object) - end - end - return objList - end - - -- searches the specified area - SearchLib.inArea = function(pos, rot, size, filter) - return returnSearchResult(pos, rot, size, filter) - end - - -- searches the area on an object - SearchLib.onObject = function(obj, filter) - pos = obj.getPosition() - size = obj.getBounds().size:setAt("y", 1) - return returnSearchResult(pos, _, size, filter) - end - - -- searches the specified position (a single point) - SearchLib.atPosition = function(pos, filter) - size = { 0.1, 2, 0.1 } - return returnSearchResult(pos, _, size, filter) - end - - -- searches below the specified position (downwards until y = 0) - SearchLib.belowPosition = function(pos, filter) - direction = { 0, -1, 0 } - maxDistance = pos.y - return returnSearchResult(pos, _, size, filter, direction, maxDistance) - end - - return SearchLib -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/VictoryDisplay") -end) __bundle_register("core/VictoryDisplay", function(require, _LOADED, __bundle_register, __bundle_modules) local searchLib = require("util/SearchLib") local chaosBagApi = require("chaosbag/ChaosBagApi") @@ -601,7 +328,7 @@ do local ChaosBagApi = {} -- respawns the chaos bag with a new state of tokens - ---@param tokenList Table List of chaos token ids + ---@param tokenList table List of chaos token ids ChaosBagApi.setChaosBagState = function(tokenList) return Global.call("setChaosBagState", tokenList) end @@ -628,29 +355,30 @@ do end -- returns all sealed tokens on cards to the chaos bag + ---@param playerColor string Color of the player to show the broadcast to ChaosBagApi.releaseAllSealedTokens = function(playerColor) return Global.call("releaseAllSealedTokens", playerColor) end -- returns all drawn tokens to the chaos bag - ChaosBagApi.returnChaosTokens = function(playerColor) - return Global.call("returnChaosTokens", playerColor) + ChaosBagApi.returnChaosTokens = function() + return Global.call("returnChaosTokens") end -- removes the specified chaos token from the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.removeChaosToken = function(id) return Global.call("removeChaosToken", id) end -- returns a chaos token to the bag and calls all relevant functions - ---@param token TTSObject Chaos Token to return + ---@param token tts__Object Chaos token to return ChaosBagApi.returnChaosTokenToBag = function(token) return Global.call("returnChaosTokenToBag", token) end -- spawns the specified chaos token and puts it into the chaos bag - ---@param id String ID of the chaos token + ---@param id string ID of the chaos token ChaosBagApi.spawnChaosToken = function(id) return Global.call("spawnChaosToken", id) end @@ -659,14 +387,18 @@ do -- are drawn or replaced a TTS bug can cause those tokens to vanish. Any functions which change the -- contents of the bag should check this method before doing so. -- This method will broadcast a message to all players if the bag is being searched. - ---@return Boolean. True if the bag is manipulated, false if it should be blocked. + ---@return any canTouch True if the bag is manipulated, false if it should be blocked. ChaosBagApi.canTouchChaosTokens = function() return Global.call("canTouchChaosTokens") end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, drawAdditional) - return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) + ---@param mat tts__Object Playermat that triggered this + ---@param drawAdditional boolean Controls whether additional tokens should be drawn + ---@param tokenType? string Name of token (e.g. "Bless") to be drawn from the bag + ---@param guidToBeResolved? string GUID of the sealed token to be resolved instead of drawing a token from the bag + ChaosBagApi.drawChaosToken = function(mat, drawAdditional, tokenType, guidToBeResolved) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional, tokenType = tokenType, guidToBeResolved = guidToBeResolved}) end -- returns a Table List of chaos token ids in the current chaos bag @@ -678,4 +410,277 @@ do return ChaosBagApi end end) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local GUIDReferenceApi = {} + + local function getGuidHandler() + return getObjectFromGUID("123456") + end + + ---@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 + + return GUIDReferenceApi +end +end) +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") + end + + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + end + + -- Returns the current value of the investigator counter from the playmat + ---@return number: Number of investigators currently set on the counter + PlayAreaApi.getInvestigatorCount = function() + return getInvestigatorCounter().getVar("val") + end + + -- Updates the current value of the investigator counter from the playmat + ---@param count number Number of investigators to set on the counter + PlayAreaApi.setInvestigatorCount = function(count) + getInvestigatorCounter().call("updateVal", count) + end + + -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor string Color of the player requesting the shift for messages + PlayAreaApi.shiftContentsUp = function(playerColor) + getPlayArea().call("shiftContentsUp", playerColor) + end + + PlayAreaApi.shiftContentsDown = function(playerColor) + getPlayArea().call("shiftContentsDown", playerColor) + end + + PlayAreaApi.shiftContentsLeft = function(playerColor) + getPlayArea().call("shiftContentsLeft", playerColor) + end + + PlayAreaApi.shiftContentsRight = function(playerColor) + getPlayArea().call("shiftContentsRight", playerColor) + end + + ---@param state boolean This controls whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) + end + + ---@param color string Connection color to be used for location connections + PlayAreaApi.setConnectionColor = function(color) + getPlayArea().call("setConnectionColor", color) + end + + -- Event to be called when the current scenario has changed + ---@param scenarioName string Name of the new scenario + PlayAreaApi.onScenarioChanged = function(scenarioName) + getPlayArea().call("onScenarioChanged", scenarioName) + end + + -- Sets this playmat's snap points to limit snapping to locations or not. + -- 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 + PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) + getPlayArea().call("setLimitSnapsByType", matchCardTypes) + end + + -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged + -- cards before they're destroyed by entering the container + PlayAreaApi.tryObjectEnterContainer = function(container, object) + getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) + end + + -- counts the VP on locations in the play area + PlayAreaApi.countVP = function() + return getPlayArea().call("countVP") + end + + -- highlights all locations in the play area without metadata + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightMissingData = function(state) + return getPlayArea().call("highlightMissingData", state) + end + + -- highlights all locations in the play area with VP + ---@param state boolean True if highlighting should be enabled + PlayAreaApi.highlightCountedVP = function(state) + return getPlayArea().call("countVP", state) + end + + -- Checks if an object is in the play area (returns true or false) + PlayAreaApi.isInPlayArea = function(object) + return getPlayArea().call("isInPlayArea", object) + end + + PlayAreaApi.getSurface = function() + return getPlayArea().getCustomObject().image + end + + PlayAreaApi.updateSurface = function(url) + return getPlayArea().call("updateSurface", url) + end + + -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the + -- data to the local token manager instance. + ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call + PlayAreaApi.updateLocations = function(args) + getPlayArea().call("updateLocations", args) + end + + PlayAreaApi.getCustomDataHelper = function() + return getPlayArea().getVar("customDataHelper") + end + + return PlayAreaApi +end +end) +__bundle_register("core/token/TokenChecker", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local CHAOS_TOKEN_NAMES = { + ["Elder Sign"] = true, + ["+1"] = true, + ["0"] = true, + ["-1"] = true, + ["-2"] = true, + ["-3"] = true, + ["-4"] = true, + ["-5"] = true, + ["-6"] = true, + ["-7"] = true, + ["-8"] = true, + ["Skull"] = true, + ["Cultist"] = true, + ["Tablet"] = true, + ["Elder Thing"] = true, + ["Auto-fail"] = true, + ["Bless"] = true, + ["Curse"] = true, + ["Frost"] = true + } + + local TokenChecker = {} + + -- returns true if the passed object is a chaos token (by name) + TokenChecker.isChaosToken = function(obj) + if obj.type == "Tile" and CHAOS_TOKEN_NAMES[obj.getName()] then + return true + else + return false + end + end + + return TokenChecker +end +end) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local SearchLib = {} + local filterFunctions = { + isActionToken = function(x) return x.getDescription() == "Action Token" end, + 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, + isTileOrToken = function(x) return x.type == "Tile" end + } + + -- 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 + }) + + -- filtering the result + 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 + end + + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) + end + + -- searches the area on an object + SearchLib.onObject = function(obj, filter) + pos = obj.getPosition() + size = obj.getBounds().size:setAt("y", 1) + return returnSearchResult(pos, _, size, filter) + end + + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) + end + + -- searches below the specified position (downwards until y = 0) + SearchLib.belowPosition = function(pos, filter) + direction = { 0, -1, 0 } + maxDistance = pos.y + return returnSearchResult(pos, _, size, filter, direction, maxDistance) + end + + return SearchLib +end +end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/VictoryDisplay") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Deck Tarot Deck 77f1e5.yaml b/unpacked/Deck Tarot Deck 77f1e5.yaml index 629ffcf79..16c57973d 100644 --- a/unpacked/Deck Tarot Deck 77f1e5.yaml +++ b/unpacked/Deck Tarot Deck 77f1e5.yaml @@ -194,7 +194,8 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -202,9 +203,7 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn - __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card @@ -267,8 +266,7 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -276,7 +274,9 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn + __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card @@ -339,8 +339,7 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -348,7 +347,9 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn + __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card @@ -1276,8 +1277,7 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -1285,7 +1285,9 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn + __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card @@ -1420,7 +1422,8 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -1428,9 +1431,7 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn - __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card @@ -1493,7 +1494,8 @@ ContainedObjects: to require ' .. identifier .. ', but no such module has been registered')\n\t\t\t\telse\n\t\t\t\t\treturn superRequire(name)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tloaded[name] = loadingPlaceholder\n\t\t\tloadedModule = modules[name](require, loaded, register, modules)\n\t\t\tloaded[name] = loadedModule\n\t\tend\n\n\t\treturn - loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"playercards/Tarotcard\", + loadedModule\n\tend\n\n\treturn require, loaded, register, modules\nend)(nil)\n__bundle_register(\"__root\", + function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\n__bundle_register(\"playercards/Tarotcard\", function(require, _LOADED, __bundle_register, __bundle_modules)\n-- context menu to manually fix rotation\nfunction onLoad()\n self.addContextMenuItem(\"Rotate Preview\", rotatePreview)\n self.addContextMenuItem(\"Rotate Card+Preview\", @@ -1501,9 +1503,7 @@ ContainedObjects: \ local angle = self.alt_view_angle\n if angle.y == 0 then\n angle.y = 180\n \ else\n angle.y = 0\n end\n self.alt_view_angle = angle\nend\n\n-- rotates this card and the preview\nfunction rotateSelfAndPreview()\n self.setRotationSmooth(self.getRotation() - + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\n__bundle_register(\"__root\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nrequire(\"playercards/Tarotcard\")\nend)\nreturn - __bundle_require(\"__root\")" + + Vector(0, 180, 0))\n rotatePreview()\nend\nend)\nreturn __bundle_require(\"__root\")" LuaScriptState: '' MeasureMovement: false Name: Card diff --git a/unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml b/unpacked/Notecard Arkham SCE 3.6.0 - 2162024 - Page 1 2d0dbb.yaml similarity index 51% rename from unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml rename to unpacked/Notecard Arkham SCE 3.6.0 - 2162024 - Page 1 2d0dbb.yaml index ca3661761..596864c37 100644 --- a/unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml +++ b/unpacked/Notecard Arkham SCE 3.6.0 - 2162024 - Page 1 2d0dbb.yaml @@ -7,19 +7,15 @@ ColorDiffuse: b: 1 g: 1 r: 1 -Description: 'Thanks for downloading Arkham SCE 3.5.0! +Description: 'Thanks for downloading Arkham SCE 3.6.0! - - Added all officially-previewed Feast of Hemlock Vale player cards! + - Added full release of Feast of Hemlock Vale Investigator Expansion! - - Added Parallel Monterey Jack! + - Added a placeholder box for Feast of Hemlock Vale Campaign Expansion, which will + be available soon! - - The options panel has many new settings available. - - - Added new scripting to Empirical Hypothesis, accessible via right-clicking the - card. - - ' + - Added a new type of uses token: Offerings!' DragSelectable: true GMNotes: '' GUID: 2d0dbb @@ -34,7 +30,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Notecard -Nickname: Arkham SCE 3.5.0 - 1/25/2024 - Page 1 +Nickname: Arkham SCE 3.6.0 - 2/16/2024 - Page 1 Snap: true States: '2': @@ -47,16 +43,17 @@ States: b: 1 g: 1 r: 1 - Description: '- The Deck Importer now supports custom cards! Requires using the - Additional Player Cards bag and the nearby ArkhamDB instruction generator. Only - works with cards with Zoop metadata or an ''id'' field in metadata. + Description: '- All player and encounter card backs (both in-mod and downloadable + objects) have been updated with newer, higher-quality images. - - Added a reshuffle button under the encounter card discard. + - The Search-A-Card tool has been given a makeover! - - The Doom Counter now also prints the doom threshold when updated.' + - The Chaos Bag Manager has ALSO gotten a makeover! + + - Clue counters now track all clues on the playermat.' DragSelectable: true GMNotes: '' - GUID: 313b1d + GUID: 5d81bd Grid: true GridProjection: false Hands: false @@ -68,17 +65,17 @@ States: LuaScriptState: '' MeasureMovement: false Name: Notecard - Nickname: Arkham SCE 3.5.0 - 1/25/2024 - Page 2 + Nickname: Arkham SCE 3.6.0 - 2/16/2024 - Page 2 Snap: true Sticky: true Tooltip: true Transform: - posX: -6.36890459 - posY: 1.55641556 - posZ: -34.33106 - rotX: 3.95979223e-05 - rotY: 90.00111 - rotZ: 0.027191259 + posX: -27 + posY: 1.55149889 + posZ: -56.165 + rotX: 4.07705976e-08 + rotY: 90.00001 + rotZ: 4.08891943e-09 scaleX: 3 scaleY: 1 scaleZ: 3 @@ -94,17 +91,17 @@ States: b: 1 g: 1 r: 1 - Description: '- Bless/Curse manager has been slimmed down. All cards that would - have needed "take/remove" have proper right-click menus. + Description: '- Added custom scripting for Kohaku''s signature card, Book of Living + Myths. - - Drawing another color''s player cards using hotkeys draws them to the corresponding - hand. + - Deck Importer spawn instructions have been updated. - - Added hotkeys for changing seats. Only seats with an investigator card present - are included.' + - Custom content creators, BE ADVISED that the new card backs should be used + going forward. Cards using the correct URL have been placed next to the updates + notecard (this) for your convenience.' DragSelectable: true GMNotes: '' - GUID: 3c1fdd + GUID: 7071d6 Grid: true GridProjection: false Hands: false @@ -116,17 +113,17 @@ States: LuaScriptState: '' MeasureMovement: false Name: Notecard - Nickname: Arkham SCE 3.5.0 - 1/25/2024 - Page 3 + Nickname: Arkham SCE 3.6.0 - 2/16/2024 - Page 3 Snap: true Sticky: true Tooltip: true Transform: - posX: -6.36890554 - posY: 1.55641556 - posZ: -34.33106 - rotX: 3.961793e-05 - rotY: 90.00111 - rotZ: 0.02719125 + posX: -27 + posY: 1.55149889 + posZ: -56.165 + rotX: 2.77722e-08 + rotY: 90.00001 + rotZ: 1.83785609e-08 scaleX: 3 scaleY: 1 scaleZ: 3 @@ -142,17 +139,16 @@ States: b: 1 g: 1 r: 1 - Description: '- Campaign Exporter updated with bugfixes and additional features - such as support for the new Additional Player Cards bag. - - - Many more miscellaneous bugfixes. Thanks for reporting them! + Description: '- When the Hemlock Campaign Expansion releases, the downloadable + object will be updated over time as we implement the campaign. No version update + will be necessary! - - Special thanks to everyone helping out others with any questions they have - with the mod. We see and appreciate you!' + - Special Thanks In Advance to all of you for bearing with any minor inconveniences + arising from the card back swap.' DragSelectable: true GMNotes: '' - GUID: c677b8 + GUID: 5b7db3 Grid: true GridProjection: false Hands: false @@ -164,17 +160,17 @@ States: LuaScriptState: '' MeasureMovement: false Name: Notecard - Nickname: Arkham SCE 3.5.0 - 1/25/2024 - Page 4 + Nickname: Arkham SCE 3.6.0 - 2/16/2024 - Page 4 Snap: true Sticky: true Tooltip: true Transform: - posX: -6.3689065 - posY: 1.55641556 - posZ: -34.33106 - rotX: 3.95979223e-05 - rotY: 90.00111 - rotZ: 0.0271912515 + posX: -27 + posY: 1.55149889 + posZ: -56.165 + rotX: 4.336063e-08 + rotY: 90.00001 + rotZ: 3.51452734e-08 scaleX: 3 scaleY: 1 scaleZ: 3 diff --git a/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua b/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua index 0538b90b6..4d556d0af 100644 --- a/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua +++ b/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua @@ -283,7 +283,7 @@ end -- handles all button clicks function buttonClicked(player, _, id) - local index = tonumber(id) + local index = tonumber(id) or "" if index == 19 then setVisibility("toggle", player.color) @@ -343,8 +343,8 @@ function loadCameraFromApi(params) end -- loads the specified camera for a player ----@param player TTSPlayerInstance Player whose camera should be moved ----@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to +---@param player tts__Player Player whose camera should be moved +---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to function loadCamera(player, camera) local lookHere, index, matColor local matColorList = { "White", "Orange", "Green", "Red" } @@ -489,8 +489,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -500,7 +500,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -514,7 +514,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -522,7 +522,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -533,7 +533,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -541,7 +541,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -549,7 +549,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -557,7 +557,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -565,8 +565,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -574,7 +574,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -582,8 +582,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -602,8 +602,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -611,8 +611,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -620,7 +620,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -631,8 +631,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -640,8 +640,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -649,8 +649,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -658,7 +658,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -666,7 +666,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -676,10 +676,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -687,8 +687,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -696,8 +696,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -721,7 +721,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -729,8 +729,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -742,7 +742,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -767,29 +767,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -814,14 +816,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -834,7 +839,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end diff --git a/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua b/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua index 61c0d2233..55302850a 100644 --- a/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua +++ b/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua @@ -41,44 +41,6 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local NavigationOverlayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getNOHandler() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") - end - - -- Copies the visibility for the Navigation overlay - ---@param startColor String Color of the player to copy from - ---@param targetColor String Color of the targeted player - NavigationOverlayApi.copyVisibility = function(startColor, targetColor) - getNOHandler().call("copyVisibility", { - startColor = startColor, - targetColor = targetColor - }) - end - - -- Changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) - ---@param playerColor String Color of the player to update the visibility for - NavigationOverlayApi.cycleVisibility = function(playerColor) - getNOHandler().call("cycleVisibility", playerColor) - end - - -- loads the specified camera for a player - ---@param player TTSPlayerInstance Player whose camera should be moved - ---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to - NavigationOverlayApi.loadCamera = function(player, camera) - getNOHandler().call("loadCameraFromApi", { - player = player, - camera = camera - }) - end - - return NavigationOverlayApi -end -end) __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlaymatApi = {} @@ -86,8 +48,8 @@ do local searchLib = require("util/SearchLib") -- Convenience function to look up a mat's object by color, or get all mats. - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@return array Table Single-element if only single playmat is requested + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@return table: Single-element if only single playmat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") @@ -97,7 +59,7 @@ do end -- Returns the color of the closest playmat - ---@param startPos Table Starting position to get the closest mat from + ---@param startPos table Starting position to get the closest mat from PlaymatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do @@ -111,7 +73,7 @@ do end -- Returns the color of the player's hand that is seated next to the 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.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") @@ -119,7 +81,7 @@ do end -- Returns the color of the playmat that owns the playercolor's hand - ---@param handColor String Color of the playmat + ---@param handColor string Color of the playmat PlaymatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") @@ -130,7 +92,7 @@ do end -- 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) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("isDES") @@ -138,7 +100,7 @@ do end -- Performs a search of the deck area of the requested playmat and returns the result as table - ---@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.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") @@ -146,7 +108,7 @@ do end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) - ---@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.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") @@ -154,7 +116,7 @@ do end -- Returns the position of the discard pile of 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.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") @@ -162,8 +124,8 @@ do end -- Transforms a local position into a global position - ---@param localPos Table Local position to be transformed - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param localPos table Local position to be transformed + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlaymatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) @@ -171,7 +133,7 @@ do end -- Returns the rotation of 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.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() @@ -179,8 +141,8 @@ do end -- Returns a table with spawn data (position and rotation) for a helper object - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param helperName String Name of the helper object + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param helperName string Name of the helper object PlaymatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { @@ -199,8 +161,8 @@ do -- Triggers the Upkeep for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param playerColor String Color of the calling player (for messages) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param playerColor string Color of the calling player (for messages) PlaymatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) @@ -208,8 +170,8 @@ do end -- Handles discarding for the requested playmat for the provided list of objects - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param objList Table List of objects to discard + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param objList table List of objects to discard PlaymatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) @@ -217,7 +179,7 @@ do end -- Returns the active investigator id - ---@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.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") @@ -228,8 +190,8 @@ do -- 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 - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) @@ -237,8 +199,8 @@ do end -- Sets the requested playmat's draw 1 button to visible - ---@param isDrawButtonVisible Boolean Whether the draw 1 button should be visible or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) @@ -246,8 +208,8 @@ do end -- Shows or hides the clickable clue counter for the requested playmat - ---@param showCounter Boolean Whether the clickable counter should be present or not - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param showCounter boolean Whether the clickable counter should be present or not + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) @@ -255,7 +217,7 @@ do end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") @@ -263,7 +225,7 @@ do end -- Reports the clue count for the requested playmat - ---@param useClickableCounters Boolean Controls which type of counter is getting checked + ---@param useClickableCounters boolean Controls which type of counter is getting checked PlaymatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do @@ -273,10 +235,10 @@ do end -- updates the specified owned counter - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@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 + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@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 PlaymatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) @@ -284,8 +246,8 @@ do end -- triggers the draw function for the specified playmat - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param number Number Amount of cards to draw + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param number number Amount of cards to draw PlaymatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) @@ -293,8 +255,8 @@ do end -- returns the resource counter amount - ---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All") - ---@param type String Counter to target + ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") + ---@param type string Counter to target PlaymatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) @@ -318,7 +280,7 @@ do end -- resets the specified skill tracker to "1, 1, 1, 1" - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") @@ -326,8 +288,8 @@ do end -- finds all objects on the playmat and associated set aside zone and returns a table - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All - ---@param filter String Name of the filte function (see util/SearchLib) + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All + ---@param filter string Name of the filte function (see util/SearchLib) PlaymatApi.searchAroundPlaymat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do @@ -339,7 +301,7 @@ do end -- Discard a non-hidden card from the corresponding player's hand - ---@param matColor String Color of the playmat - White, Orange, Green, Red or All + ---@param matColor string Color of the playmat - White, Orange, Green, Red or All PlaymatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") @@ -369,14 +331,17 @@ do } -- performs the actual search and returns a filtered list of object references - ---@param pos Table Global position - ---@param rot Table 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 + ---@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) - if filter then filter = filterFunctions[filter] end + local filterFunc + if filter then + filterFunc = filterFunctions[filter] + end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, @@ -389,7 +354,7 @@ do -- filtering the result local objList = {} for _, v in ipairs(searchResult) do - if not filter or filter(v.hit_object) then + if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end @@ -427,104 +392,6 @@ end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("core/GameKeyHandler") end) -__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local BlessCurseManagerApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") - end - - -- removes all taken tokens and resets the counts - BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = getManager() - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) - Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) - Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.releasedToken = function(type, guid) - getManager().call("releasedToken", { type = type, guid = guid }) - end - - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.returnedToken = function(type, guid) - getManager().call("returnedToken", { type = type, guid = guid }) - end - - -- broadcasts the current status for bless/curse tokens - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.broadcastStatus = function(playerColor) - getManager().call("broadcastStatus", playerColor) - end - - -- removes all bless / curse tokens from the chaos bag and play - ---@param playerColor String Color of the player to show the broadcast to - BlessCurseManagerApi.removeAll = function(playerColor) - getManager().call("doRemove", playerColor) - end - - -- adds bless / curse sealing to the hovered card - ---@param playerColor String Color of the player to show the broadcast to - ---@param hoveredObject TTSObject Hovered object - BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi -end -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} - - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) - end - - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") - end - - return OptionPanelApi -end -end) -__bundle_register("core/VictoryDisplayApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local VictoryDisplayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - local function getVictoryDisplay() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "VictoryDisplay") - end - - -- triggers an update of the Victory count - ---@param delay Number Delay in seconds after which the update call is executed - VictoryDisplayApi.update = function(delay) - getVictoryDisplay().call("startUpdate", delay) - end - - -- moves a card to the victory display (in the first empty spot) - ---@param object Object Object that should be checked and potentially moved - VictoryDisplayApi.placeCard = function(object) - if object ~= nil and object.tag == "Card" then - getVictoryDisplay().call("placeCard", object) - end - end - - return VictoryDisplayApi -end -end) __bundle_register("core/GameKeyHandler", function(require, _LOADED, __bundle_register, __bundle_modules) local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local guidReferenceApi = require("core/GUIDReferenceApi") @@ -648,6 +515,8 @@ function getColorToDiscardFor(hoveredObject, playerColor) local discardForMatColor if inArea(pos, areaNearPlaymat) then 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 @@ -859,8 +728,8 @@ function addBlurseSealingMenu(playerColor, hoveredObject) end -- Simple method to check if the given point is in a specified area ----@param point Vector Point to check, only x and z values are relevant ----@param bounds Table Defined area to see if the point is within +---@param point tts__Vector Point to check, only x and z values are relevant +---@param bounds table Defined area to see if the point is within function inArea(point, bounds) return (point.x > bounds.minX and point.x < bounds.maxX @@ -875,6 +744,66 @@ function titleCase(str) return first:upper() .. rest:lower() end end) +__bundle_register("chaosbag/BlessCurseManagerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local BlessCurseManagerApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getManager() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + end + + -- removes all taken tokens and resets the counts + BlessCurseManagerApi.removeTakenTokensAndReset = function() + local BlessCurseManager = getManager() + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) + Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) + Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.sealedToken = function(type, guid) + getManager().call("sealedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.releasedToken = function(type, guid) + getManager().call("releasedToken", { type = type, guid = guid }) + end + + -- updates the internal count (called by cards that seal bless/curse tokens) + ---@param type string Type of chaos token ("Bless" or "Curse") + ---@param guid string GUID of the token + BlessCurseManagerApi.returnedToken = function(type, guid) + getManager().call("returnedToken", { type = type, guid = guid }) + end + + -- broadcasts the current status for bless/curse tokens + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.broadcastStatus = function(playerColor) + getManager().call("broadcastStatus", playerColor) + end + + -- removes all bless / curse tokens from the chaos bag and play + ---@param playerColor string Color of the player to show the broadcast to + BlessCurseManagerApi.removeAll = function(playerColor) + getManager().call("doRemove", playerColor) + end + + -- adds bless / curse sealing to the hovered card + ---@param playerColor string Color of the player to show the broadcast to + ---@param hoveredObject tts__Object Hovered object + BlessCurseManagerApi.addBlurseSealingMenu = function(playerColor, hoveredObject) + getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + end + + return BlessCurseManagerApi +end +end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -883,29 +812,31 @@ do return getObjectFromGUID("123456") end - -- returns all matching objects as a table with references - ---@param owner String Parent object for this search - ---@param type String Type of object to search for + ---@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 + ---@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 + ---@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 + ---@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, @@ -917,4 +848,86 @@ do return GUIDReferenceApi end end) +__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local OptionPanelApi = {} + + -- loads saved options + ---@param options table Set a new state for the option table + OptionPanelApi.loadSettings = function(options) + return Global.call("loadSettings", options) + end + + ---@return any: Table of option panel state + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") + end + + return OptionPanelApi +end +end) +__bundle_register("core/VictoryDisplayApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local VictoryDisplayApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getVictoryDisplay() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "VictoryDisplay") + end + + -- triggers an update of the victory count + ---@param delay number Delay in seconds after which the update call is executed + VictoryDisplayApi.update = function(delay) + getVictoryDisplay().call("startUpdate", delay) + end + + -- moves a card to the victory display (in the first empty spot) + ---@param object tts__Object Object that should be checked and potentially moved + VictoryDisplayApi.placeCard = function(object) + if object ~= nil and object.tag == "Card" then + getVictoryDisplay().call("placeCard", object) + end + end + + return VictoryDisplayApi +end +end) +__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) +do + local NavigationOverlayApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") + + local function getNOHandler() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") + end + + -- copies the visibility for the Navigation overlay + ---@param startColor string Color of the player to copy from + ---@param targetColor string Color of the targeted player + NavigationOverlayApi.copyVisibility = function(startColor, targetColor) + getNOHandler().call("copyVisibility", { + startColor = startColor, + targetColor = targetColor + }) + end + + -- changes the Navigation Overlay view ("Full View" --> "Play Areas" --> "Closed" etc.) + ---@param playerColor string Color of the player to update the visibility for + NavigationOverlayApi.cycleVisibility = function(playerColor) + getNOHandler().call("cycleVisibility", playerColor) + end + + -- loads the specified camera for a player + ---@param player tts__Player Player whose camera should be moved + ---@param camera number|string If number: Index of the camera view to load | If string: Color of the playermat to swap to + NavigationOverlayApi.loadCamera = function(player, camera) + getNOHandler().call("loadCameraFromApi", { + player = player, + camera = camera + }) + end + + return NavigationOverlayApi +end +end) return __bundle_require("__root") \ No newline at end of file