diff --git a/unpacked.ttslua b/unpacked.ttslua index a30978f69..ef5bee134 100644 --- a/unpacked.ttslua +++ b/unpacked.ttslua @@ -41,1505 +41,46 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("core/Global", function(require, _LOADED, __bundle_register, __bundle_modules) -local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") -local guidReferenceApi = require("core/GUIDReferenceApi") -local mythosAreaApi = require("core/MythosAreaApi") -local navigationOverlayApi = require("core/NavigationOverlayApi") -local playAreaApi = require("core/PlayAreaApi") -local playmatApi = require("playermat/PlaymatApi") -local soundCubeApi = require("core/SoundCubeApi") -local tokenArrangerApi = require("accessories/TokenArrangerApi") -local tokenChecker = require("core/token/TokenChecker") -local tokenManager = require("core/token/TokenManager") - ---------------------------------------------------------- --- general setup ---------------------------------------------------------- - -ENCOUNTER_DECK_POS = { -3.93, 1, 5.76 } -ENCOUNTER_DECK_DISCARD_POSITION = { -3.85, 1, 10.38 } - --- GUIDs that will not be interactable (e.g. parts of the table) -local NOT_INTERACTABLE = { - "6161b4", -- Decoration-Map - "721ba2", -- PlayArea - "9f334f", -- MythosArea - "463022", -- Panel behind tentacle stand - "f182ee", -- InvestigatorCount - "7bff34", -- Tentacle stand - "8646eb", -- horizontal border left - "75937e", -- horizontal border right - "612072", -- vertical border left - "975c39", -- vertical border right -} - --- global variable for access -chaosTokens = {} -local chaosTokensLastMat = nil - -local bagSearchers = {} -local MAT_COLORS = { "White", "Orange", "Green", "Red" } -local hideTitleSplashWaitFunctionId = nil - --- online functionality related variables -local MOD_VERSION = "3.4.0" -local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main' -local library, requestObj, modMeta -local acknowledgedUpgradeVersions = {} -local contentToShow = "campaigns" -local currentListItem = 1 -local xmlVisibility = { - downloadWindow = false, - optionPanel = false, - playareaGallery = false, - updateNotification = false -} -local tabIdTable = { - tab1 = "campaigns", - tab2 = "scenarios", - tab3 = "fanmadeCampaigns", - tab4 = "fanmadeScenarios", - tab5 = "fanmadePlayerCards" -} - --- optionPanel data -optionPanel = {} -local LANGUAGES = { - { code = "zh_CN", name = "简体中文" }, - { code = "zh_TW", name = "繁體中文" }, - { code = "de", name = "Deutsch" }, - { code = "en", name = "English" }, - { code = "es", name = "Español" }, - { code = "fr", name = "Français" }, - { code = "it", name = "Italiano" } -} -local RESOURCE_OPTIONS = { - "enabled", - "custom", - "disabled" -} - ---------------------------------------------------------- --- data for tokens ---------------------------------------------------------- - -TOKEN_DATA = { - damage = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357115146/903D11AAE7BD5C254C8DC136E9202EE516289DEA/", scale = {0.17, 0.17, 0.17}}, - horror = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357163535/6D9E0756503664D65BDB384656AC6D4BD713F5FC/", scale = {0.17, 0.17, 0.17}}, - resource = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/", scale = {0.17, 0.17, 0.17}}, - doom = {image = "https://i.imgur.com/EoL7yaZ.png", scale = {0.17, 0.17, 0.17}}, - clue = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357164917/1D06F1DC4D6888B6F57124BD2AFE20D0B0DA15A8/", scale = {0.15, 0.15, 0.15}} -} - -ID_URL_MAP = { - ['blue'] = {name = "Elder Sign", url = 'https://i.imgur.com/nEmqjmj.png'}, - ['p1'] = {name = "+1", url = 'https://i.imgur.com/uIx8jbY.png'}, - ['0'] = {name = "0", url = 'https://i.imgur.com/btEtVfd.png'}, - ['m1'] = {name = "-1", url = 'https://i.imgur.com/w3XbrCC.png'}, - ['m2'] = {name = "-2", url = 'https://i.imgur.com/bfTg2hb.png'}, - ['m3'] = {name = "-3", url = 'https://i.imgur.com/yfs8gHq.png'}, - ['m4'] = {name = "-4", url = 'https://i.imgur.com/qrgGQRD.png'}, - ['m5'] = {name = "-5", url = 'https://i.imgur.com/3Ym1IeG.png'}, - ['m6'] = {name = "-6", url = 'https://i.imgur.com/c9qdSzS.png'}, - ['m7'] = {name = "-7", url = 'https://i.imgur.com/4WRD42n.png'}, - ['m8'] = {name = "-8", url = 'https://i.imgur.com/9t3rPTQ.png'}, - ['skull'] = {name = "Skull", url = 'https://i.imgur.com/stbBxtx.png'}, - ['cultist'] = {name = "Cultist", url = 'https://i.imgur.com/VzhJJaH.png'}, - ['tablet'] = {name = "Tablet", url = 'https://i.imgur.com/1plY463.png'}, - ['elder'] = {name = "Elder Thing", url = 'https://i.imgur.com/ttnspKt.png'}, - ['red'] = {name = "Auto-fail", url = 'https://i.imgur.com/lns4fhz.png'}, - ['bless'] = {name = "Bless", url = 'http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/'}, - ['curse'] = {name = "Curse", url = 'http://cloud-3.steamusercontent.com/ugc/1655601092778636039/2A25BD38E8C44701D80DD96BF0121DA21843672E/'}, - ['frost'] = {name = "Frost", url = 'http://cloud-3.steamusercontent.com/ugc/1858293462583104677/195F93C063A8881B805CE2FD4767A9718B27B6AE/'} -} - ---------------------------------------------------------- --- data for chaos token stat tracker ---------------------------------------------------------- - -local tokenDrawingStats = { - ["Overall"] = {}, - ["8b081b"] = {}, - ["bd0ff4"] = {}, - ["383d8b"] = {}, - ["0840d5"] = {} -} - ---------------------------------------------------------- --- general code ---------------------------------------------------------- - --- saving state of optionPanel to restore later -function onSave() - return JSON.encode({ - optionPanel = optionPanel, - acknowledgedUpgradeVersions = acknowledgedUpgradeVersions - }) -end - -function onLoad(savedData) - if savedData then - loadedData = JSON.decode(savedData) - optionPanel = loadedData.optionPanel - acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions - updateOptionPanelState() - else - print("Saved state could not be found!") - end - - for _, guid in ipairs(NOT_INTERACTABLE) do - local obj = getObjectFromGUID(guid) - if obj ~= nil then obj.interactable = false end - end - - resetChaosTokenStatTracker() - getModVersion() - math.randomseed(os.time()) - - -- initialization of loadable objects library (delay to let Navigation Overlay build) - Wait.time(function() - WebRequest.get(SOURCE_REPO .. '/library.json', libraryDownloadCallback) - end, 1) -end - --- Event hook for any object search. When chaos tokens are manipulated while the chaos bag --- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the --- chaos bag during search operations to avoid this. -function onObjectSearchStart(object, playerColor) - chaosbag = findChaosBag() - if object == chaosbag then - bagSearchers[playerColor] = true - end -end - --- Event hook for any object search. When chaos tokens are manipulated while the chaos bag --- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the --- chaos bag during search operations to avoid this. -function onObjectSearchEnd(object, playerColor) - chaosbag = findChaosBag() - if object == chaosbag then - bagSearchers[playerColor] = nil - end -end - --- Pass object enter container events to the PlayArea to clear vector lines from dragged cards. --- This requires the try method as cards won't exist any more after they enter a deck, so the lines --- can't be cleared. -function tryObjectEnterContainer(container, object) - playAreaApi.tryObjectEnterContainer(container, object) - return true -end - --- TTS event for objects that enter zones --- used to detect the "token discard zones" beneath the hand zones -function onObjectEnterZone(zone, enteringObj) - if zone.getName() ~= "TokenDiscardZone" then return end - if tokenChecker.isChaosToken(enteringObj) then return end - - if enteringObj.type == "Tile" and enteringObj.getMemo() and enteringObj.getLock() == false then - local matcolor = playmatApi.getMatColorByPosition(enteringObj.getPosition()) - local trash = guidReferenceApi.getObjectByOwnerAndType(matcolor, "Trash") - trash.putObject(enteringObj) - end -end - ---------------------------------------------------------- --- chaos token drawing ---------------------------------------------------------- - --- checks scripting zone for chaos bag (also called by a lot of objects!) -function findChaosBag() - local chaosbag_zone = getObjectFromGUID("83ef06") - - -- error handling: scripting zone not found - if chaosbag_zone == nil then - printToAll("Zone for chaos bag detection couldn't be found.", "Red") - return - end - - for _, item in ipairs(chaosbag_zone.getObjects()) do - if item.getDescription() == "Chaos Bag" then - return item - end - end - - -- error handling: chaos bag not found - printToAll("Chaos bag couldn't be found.", "Red") -end - -function returnChaosTokens() - for _, token in pairs(chaosTokens) do - if token ~= nil then chaosbag.putObject(token) end - end - chaosTokens = {} -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. -function canTouchChaosTokens() - for color, searching in pairs(bagSearchers) do - if searching then - broadcastToAll("Someone is searching the chaos bag, can't touch the tokens.", "Red") - return false - end - end - return true -end - --- called by playermats (by the "Draw chaos token" button) -function drawChaosToken(params) - if not canTouchChaosTokens() then return end - - local mat = params[1] - local tokenOffset = params[2] - local isRightClick = params[3] - chaosbag = findChaosBag() - - -- return token(s) on other playmat first - if chaosTokensLastMat ~= nil and chaosTokensLastMat ~= mat and #chaosTokens ~= 0 then - returnChaosTokens() - chaosTokensLastMat = nil - return - end - - chaosTokensLastMat = mat - - -- if we have left clicked and have no tokens OR if we have right clicked - if isRightClick or #chaosTokens == 0 then - if #chaosbag.getObjects() == 0 then return end - chaosbag.shuffle() - - -- 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 = mat.positionToWorld(tokenOffset), - rotation = mat.getRotation() - }) - - -- get data for token description - local name = token.getName() - local tokenData = mythosAreaApi.returnTokenData().tokenData or {} - local specificData = tokenData[name] or {} - token.setDescription(specificData.description or "") - - -- track the chaos token (for stat tracker and future returning) - trackChaosToken(name, mat.getGUID()) - chaosTokens[#chaosTokens + 1] = token - return - else - returnChaosTokens() - end -end - ---------------------------------------------------------- --- token spawning ---------------------------------------------------------- - --- DEPRECATED. Use TokenManager instead. --- Spawns a single token. ----@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 - ---------------------------------------------------------- --- chaos token stat tracker ---------------------------------------------------------- - -function trackChaosToken(tokenName, matGUID) - tokenDrawingStats["Overall"][tokenName] = (tokenDrawingStats["Overall"][tokenName] or 0) + 1 - tokenDrawingStats[matGUID][tokenName] = (tokenDrawingStats[matGUID][tokenName] or 0) + 1 -end - --- Left-click: print stats, Right-click: reset stats -function handleStatTrackerClick(_, _, isRightClick) - if isRightClick then - resetChaosTokenStatTracker() - else - local squidKing = "Nobody" - local maxSquid = 0 - local foundAnyStats = false - - for key, personalStats in pairs(tokenDrawingStats) do - local playerColor, playerName - - if key == "Overall" then - playerColor = "White" - playerName = "Overall" - else - -- get mat color - local matColor = playmatApi.getMatColorByPosition(getObjectFromGUID(key).getPosition()) - playerColor = playmatApi.getPlayerColor(matColor) - playerName = Player[playerColor].steam_name or playerColor - - local playerSquidCount = personalStats["Auto-fail"] - if playerSquidCount > maxSquid then - squidKing = playerName - maxSquid = playerSquidCount - end - end - - -- get the total count of drawn tokens for the player - local totalCount = 0 - for tokenName, value in pairs(personalStats) do - totalCount = totalCount + value - end - - -- only print the personal stats if any tokens were drawn - if totalCount > 0 then - foundAnyStats = true - printToAll("------------------------------") - printToAll(playerName .. " Stats", playerColor) - - for tokenName, value in pairs(personalStats) do - if value ~= 0 then - printToAll(tokenName .. ': ' .. tostring(value)) - end - end - printToAll('Total: ' .. tostring(totalCount)) - end - end - - -- detect if any player drew tokens - if foundAnyStats then - printToAll("------------------------------") - printToAll(squidKing .. " is an auto-fail magnet.", { 255, 0, 0 }) - else - printToAll("No tokens have been drawn yet.", "Yellow") - end - end -end - --- resets the count for each token to 0 -function resetChaosTokenStatTracker() - for key, _ in pairs(tokenDrawingStats) do - tokenDrawingStats[key] = {} - for _, token in pairs(ID_URL_MAP) do - tokenDrawingStats[key][token.name] = 0 - end - end -end - ---------------------------------------------------------- --- Difficulty selector script ---------------------------------------------------------- - --- called for button creation on the difficulty selectors ----@param object object Usually "self" ----@param key string Name of the scenario -function createSetupButtons(args) - local data = getDataValue('modeData', args.key) - if data ~= nil then - local buttonParameters = {} - buttonParameters.function_owner = args.object - buttonParameters.position = { 0, 0.1, -0.15 } - buttonParameters.scale = { 0.47, 1, 0.47 } - buttonParameters.height = 200 - buttonParameters.width = 1150 - buttonParameters.color = { 0.87, 0.8, 0.7 } - - if data.easy ~= nil then - buttonParameters.label = "Easy" - buttonParameters.click_function = "easyClick" - args.object.createButton(buttonParameters) - buttonParameters.position[3] = buttonParameters.position[3] + 0.20 - end - - if data.normal ~= nil then - buttonParameters.label = "Standard" - buttonParameters.click_function = "normalClick" - args.object.createButton(buttonParameters) - buttonParameters.position[3] = buttonParameters.position[3] + 0.20 - end - - if data.hard ~= nil then - buttonParameters.label = "Hard" - buttonParameters.click_function = "hardClick" - args.object.createButton(buttonParameters) - buttonParameters.position[3] = buttonParameters.position[3] + 0.20 - end - - if data.expert ~= nil then - buttonParameters.label = "Expert" - buttonParameters.click_function = "expertClick" - args.object.createButton(buttonParameters) - buttonParameters.position[3] = buttonParameters.position[3] + 0.20 - end - - if data.standalone ~= nil then - buttonParameters.label = "Standalone" - buttonParameters.click_function = "standaloneClick" - args.object.createButton(buttonParameters) - end - end -end - --- called for adding chaos tokens ----@param object object Usually "self" ----@param key string Name of the scenario ----@param mode string difficulty (e.g. "hard" or "expert") -function fillContainer(args) - local data = getDataValue('modeData', args.key) - if data == nil then return end - - local value = data[args.mode] - if value == nil or value.token == nil then return end - - local tokenList = {} - - for _, tokenId in ipairs(value.token) do - table.insert(tokenList, tokenId) - end - - if value.append ~= nil then - for _, tokenId in ipairs(value.append) do - table.insert(tokenList, tokenId) - end - end - - -- randomly choose tokens for specific Carcosa scenarios in standalone - if value.random then - local n = #value.random - if n > 0 then - for _, tokenId in ipairs(value.random[math.random(1, n)]) do - table.insert(tokenList, tokenId) - end - end - end - - setChaosBagState(tokenList) - - if value.message then - broadcastToAll(value.message) - end - - if value.warning then - broadcastToAll(value.warning, { 1, 0.5, 0.5 }) - end -end - -function getDataValue(storage, key) - local DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - local data = DATA_HELPER.getTable(storage) - if data ~= nil then - local value = data[key] - if value ~= nil then - local res = {} - for m, v in pairs(value) do - res[m] = v - if res[m].parent ~= nil then - local parentData = getDataValue(storage, res[m].parent) - if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then - res[m].token = parentData[m].token - end - res[m].parent = nil - end - end - return res - end - end -end - -function createChaosTokenNameLookupTable() - local namesToIds = {} - for k, v in pairs(ID_URL_MAP) do - namesToIds[v.name] = k - end - return namesToIds -end - --- returns a Table List of chaos token ids in the current chaos bag ----@api chaosbag/ChaosBagApi -function getChaosBagState() - local tokens = {} - local invertedTable = createChaosTokenNameLookupTable() - local chaosbag = findChaosBag() - - for _, v in ipairs(chaosbag.getObjects()) do - local id = invertedTable[v.name] - if id then - table.insert(tokens, id) - else - printToAll(v.name .. " token not recognized. Will not be recorded.", "Yellow") - end - end - - return tokens -end - --- respawns the chaos bag with a new state of tokens ----@param tokenList Table List of chaos token ids ----@api chaosbag/ChaosBagApi -function setChaosBagState(tokenList) - if not canTouchChaosTokens() then return end - - local chaosbag = findChaosBag() - local chaosbagData = chaosbag.getData() - local reserveData = getObjectFromGUID("106418").getData() - local tokenCache = {} - local containedObjects = {} - - -- create a temporary copy of the data for each chaos token - for _, objData in ipairs(reserveData.ContainedObjects) do - tokenCache[objData.Nickname] = objData - end - - -- iterate over tokenlist and insert specified tokens into new table - for _, tokenId in ipairs(tokenList) do - local tokenName = ID_URL_MAP[tokenId].name - table.insert(containedObjects, tokenCache[tokenName]) - end - - -- overwrite chaos bag content and respawn it - chaosbagData.ContainedObjects = containedObjects - chaosbag.destruct() - spawnObjectData({ data = chaosbagData }) - - -- remove tokens that are still in play - for _, token in pairs(chaosTokens) do - if token ~= nil then token.destruct() end - end - chaosTokens = {} - chaosTokensLastMat = nil - - -- reset bless / curse manager - blessCurseManagerApi.removeTakenTokensAndReset() - - printToAll("Chaos bag set to chosen difficulty.", "Green") -end - --- spawns the specified chaos token and puts it into the chaos bag ----@param id String ID of the chaos token -function spawnChaosToken(id) - if not canTouchChaosTokens() then return end - - id = id:lower() - local chaosbag = findChaosBag() - local url = ID_URL_MAP[id].url or "" - - if url ~= "" then - return spawnObject({ - type = 'Custom_Tile', - position = { 0.49, 3, 0 }, - scale = { 0.81, 1.0, 0.81 }, - rotation = { 0, 270, 0 }, - callback_function = function(obj) - obj.setName(ID_URL_MAP[id].name) - chaosbag.putObject(obj) - tokenArrangerApi.layout() - end - }).setCustomObject({ - type = 2, - image = url, - thickness = 0.1 - }) - end -end - --- removes the specified chaos token from the chaos bag ----@param id String ID of the chaos token -function removeChaosToken(id) - if not canTouchChaosTokens() then return end - - local tokens = {} - local chaosbag = findChaosBag() - local name = ID_URL_MAP[id].name - - for _, v in ipairs(chaosbag.getObjects()) do - if v.name == name then table.insert(tokens, v.guid) end - end - - -- error handling: no matching token found - if #tokens == 0 then - printToAll("No " .. name .. " tokens in the chaos bag.", "Yellow") - return - end - - chaosbag.takeObject({ - guid = tokens[1], - smooth = false, - callback_function = function(obj) - obj.destruct() - tokenArrangerApi.layout() - end - }) - printToAll("Removing " .. name .. " token (in bag: " .. #tokens - 1 .. ")", "White") -end - --- empty the chaos bag -function emptyChaosBag() - if not canTouchChaosTokens() then return end - - local chaosbag = findChaosBag() - for _, object in ipairs(chaosbag.getObjects()) do - chaosbag.takeObject({ callback_function = function(item) item.destruct() end }) - end -end - --- returns all sealed tokens on cards to the chaos bag -function releaseAllSealedTokens(playerColor) - local chaosbag = findChaosBag() - for _, obj in ipairs(getObjectsWithTag("CardThatSeals")) do - obj.call("releaseAllTokens", playerColor) - end -end - ---------------------------------------------------------- --- Content Importing and XML functions ---------------------------------------------------------- - --- forwards the requested content type to the update function and sets highlight to 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 - UI.setClass(listId, 'downloadTab activeTab') - contentToShow = listContent - else - UI.setClass(listId, 'downloadTab') - end - end - currentListItem = 1 - updateDownloadItemList() -end - --- click function for the items in the download window --- updates backgroundcolor for row panel and fontcolor for list item -function onClick_select(_, _, identificationKey) - UI.setAttribute("panel" .. currentListItem, "color", "clear") - UI.setAttribute(contentToShow .. "_" .. currentListItem, "color", "white") - - -- parses the identification key (contentToShow_currentListItem) - if identificationKey then - contentToShow = nil - currentListItem = nil - for str in string.gmatch(identificationKey, "([^_]+)") do - if not contentToShow then - -- grab the first part to know the content type - contentToShow = str - else - -- get the index - currentListItem = tonumber(str) - break - end - end - end - - UI.setAttribute("panel" .. currentListItem, "color", "grey") - UI.setAttribute(contentToShow .. "_" .. currentListItem, "color", "black") - updatePreviewWindow() -end - --- click function for the download button in the preview window -function onClick_download(player) - local params = library[contentToShow][currentListItem] - params.player = player - placeholder_download(params) -end - --- the download button on the placeholder objects calls this to directly initiate a download ----@param param 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) - startLuaCoroutine(Global, 'downloadCoroutine') -end - -function downloadCoroutine() - -- show progress bar - UI.setAttribute('download_progress', 'active', true) - - -- update progress bar - while requestObj do - UI.setAttribute('download_progress', 'percentage', requestObj.download_progress * 100) - coroutine.yield(0) - end - UI.setAttribute('download_progress', 'percentage', 100) - - -- wait 30 frames - for i = 1, 30 do - coroutine.yield(0) - end - - -- hide progress bar - UI.setAttribute('download_progress', 'active', false) - - -- hide download window - if xmlVisibility.downloadWindow then - xmlVisibility.downloadWindow = false - UI.hide('downloadWindow') - end - return 1 -end - --- spawns a bag that contains every object from the library -function onClick_downloadAll() - broadcastToAll("Download initiated - this will take a few minutes!") - - -- hide download window - if xmlVisibility.downloadWindow then - xmlVisibility.downloadWindow = false - UI.hide('downloadWindow') - end - - startLuaCoroutine(Global, "coroutineDownloadAll") -end - -function coroutineDownloadAll() - local JSON = [[ - { - "Name": "Bag", - "Transform": { - "posX": -39.5, - "posY": 2, - "posZ": -87, - "rotX": 0, - "rotY": 270, - "rotZ": 0, - "scaleX": 1.0, - "scaleY": 1.0, - "scaleZ": 1.0 - }, - "Nickname": "All Downloadable Content", - "Bag": { - "Order": 0 - }, - "ContainedObjects": [ - ]] - - local contained = "" - local downloadedItems = 0 - local skippedItems = 0 - - -- loop through the library to add content - for contentType, objectList in pairs(library) do - broadcastToAll("Downloading " .. contentType .. "...") - for _, params in ipairs(objectList) do - local request = WebRequest.get(SOURCE_REPO .. '/' .. params.url) - local start = os.time() - while true do - if request.is_done then - contained = contained .. request.text .. "," - downloadedItems = downloadedItems + 1 - break - -- time-out if item can't be loaded in 5s - elseif request.is_error or (os.time() - start) > 5 then - skippedItems = skippedItems + 1 - break - end - coroutine.yield(0) - end - end - end - - JSON = JSON .. contained .. "]}" - spawnObjectJSON({json = JSON}) - - broadcastToAll(downloadedItems .. " objects downloaded.", "Green") - broadcastToAll(skippedItems .. " objects had a time-out / error.", "Orange") - return 1 -end - --- spawns a placeholder box for the selected object -function onClick_spawnPlaceholder() - -- get object references - local item = library[contentToShow][currentListItem] - local dummy = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlaceholderBoxDummy") - - -- error handling - if not item.boxsize or item.boxsize == "" or not item.boxart or item.boxart == "" then - print("Error loading object.") - return - end - - -- get data for placeholder - local spawnPos = {-39.5, 2, -87} - - local meshTable = { - big = "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj", - small = "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj", - wide = "http://pastebin.com/raw.php?i=uWAmuNZ2" - } - - local scaleTable = { - big = {1.00, 0.14, 1.00}, - small = {2.21, 0.46, 2.42}, - wide = {2.00, 0.11, 1.69} - } - - local placeholder = spawnObject({ - type = "Custom_Model", - position = spawnPos, - rotation = {0, 270, 0}, - scale = scaleTable[item.boxsize], - }) - - placeholder.setCustomObject({ - mesh = meshTable[item.boxsize], - diffuse = item.boxart, - material = 3 - }) - - placeholder.setColorTint({1, 1, 1, 71/255}) - placeholder.setName(item.name) - placeholder.setDescription("by " .. (item.author or "Unknown")) - placeholder.setGMNotes(item.url) - placeholder.setLuaScript(dummy.getLuaScript()) - Player.getPlayers()[1].pingTable(spawnPos) - - -- hide download window - if xmlVisibility.downloadWindow then - xmlVisibility.downloadWindow = false - UI.hide('downloadWindow') - end -end - --- toggles the visibility of the respective UI ----@param player LuaPlayer 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) - return - -- hide the playareaGallery if visible - elseif title == "downloadWindow" and xmlVisibility.playareaGallery then - onClick_toggleUi(_, "playareaGallery") - -- hide the downloadWindow if visible - elseif title == "playareaGallery" and xmlVisibility.downloadWindow then - onClick_toggleUi(_, "downloadWindow") - end - - if xmlVisibility[title] then - -- small delay to allow button click sounds to play - Wait.time(function() UI.hide(title) end, 0.1) - else - UI.show(title) - end - xmlVisibility[title] = not xmlVisibility[title] -end - --- forwards the call to the onClick function -function togglePlayareaGallery() - onClick_toggleUi(_, "playareaGallery") -end - --- updates the preview window -function updatePreviewWindow() - local item = library[contentToShow][currentListItem] - local tempImage = "http://cloud-3.steamusercontent.com/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/" - - -- set default image if not defined - if item.boxsize == nil or item.boxsize == "" or item.boxart == nil or item.boxart == "" then - item.boxsize = "big" - item.boxart = "http://cloud-3.steamusercontent.com/ugc/762723517667628371/18438B0A0045038A7099648AA3346DFCAA267C66/" - end - - UI.setValue("previewTitle", item.name) - UI.setValue("previewAuthor", "by " .. (item.author or "- Author not found -")) - UI.setValue("previewDescription", item.description or "- Description not found -") - - -- update mask according to size (hardcoded values to align image in mask) - local maskData = {} - if item.boxsize == "big" then - maskData = { - image = "box-cover-mask-big", - width = "870", - height = "435", - offsetXY = "154 60" - } - elseif item.boxsize == "small" then - maskData = { - image = "box-cover-mask-small", - width = "792", - height = "594", - offsetXY = "135 13" - } - elseif item.boxsize == "wide" then - maskData = { - image = "box-cover-mask-wide", - width = "756", - height = "630", - offsetXY = "-190 -70" - } - end - - -- loading empty image as placeholder until real image is loaded - UI.setAttribute("previewArtImage", "image", tempImage) - - -- insert the image itself - UI.setAttribute("previewArtImage", "image", item.boxart) - UI.setAttributes("previewArtMask", maskData) -end - --- formats the json response from the webrequest into a key-value lua table --- strips the prefix from the community content items -function formatLibrary(json_response) - library = {} - library["campaigns"] = json_response.campaigns - library["scenarios"] = json_response.scenarios - library["extras"] = json_response.extras - library["fanmadeCampaigns"] = {} - library["fanmadeScenarios"] = {} - library["fanmadePlayerCards"] = {} - - for _, item in ipairs(json_response.community) do - local identifier = nil - for str in string.gmatch(item.name, "([^:]+)") do - if not identifier then - -- grab the first part to know the content type - identifier = str - else - -- update the name without the content type - item.name = str - break - end - end - - if identifier == "Fan Investigators" then - table.insert(library["fanmadePlayerCards"], item) - elseif identifier == "Fan Campaign" then - table.insert(library["fanmadeCampaigns"], item) - elseif identifier == "Fan Scenario" then - table.insert(library["fanmadeScenarios"], item) - end - end -end - --- updates the window content to the requested content -function updateDownloadItemList() - if not library then return end - - -- addition of list items according to library file - local globalXml = UI.getXmlTable() - local contentList = getXmlTableElementById(globalXml, 'contentList') - - contentList.children = {} - for i, v in ipairs(library[contentToShow]) do - table.insert(contentList.children, - { - tag = "Panel", - attributes = { id = "panel" .. i }, - children = { - tag = 'Text', - value = v.name, - attributes = { - id = contentToShow .. "_" .. i, - onClick = 'onClick_select', - alignment = 'MiddleLeft' - } - } - }) - end - - contentList.attributes.height = #contentList.children * 27 - UI.setXmlTable(globalXml) - - -- select the first item - Wait.time(onClick_select, 0.2) -end - --- called after the webrequest of downloading an item --- deletes the placeholder and spawns the downloaded item -function contentDownloadCallback(request, params) - requestObj = nil - - -- error handling - if request.is_error or request.response_code ~= 200 then - print('Error: ' .. request.error) - return - end - - -- initiate content spawning - local spawnTable = { json = request.text } - if params.replace then - local replacedObject = getObjectFromGUID(params.replace) - if replacedObject then - spawnTable.position = replacedObject.getPosition() - spawnTable.rotation = replacedObject.getRotation() - spawnTable.scale = replacedObject.getScale() - destroyObject(replacedObject) - end - end - - -- if position is undefined, get empty position - if not spawnTable.position then - spawnTable.rotation = { 0, 270, 0} - - local pos = getValidSpawnPosition() - if pos then - spawnTable.position = pos - else - broadcastToAll("Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red") - return - end - end - - -- if spawned from menu, move the camera and/or ping the table - if params.name then - spawnTable["callback_function"] = function(obj) - Wait.time(function() - -- move camera - if params.player then - params.player.lookAt({ - position = obj.getPosition(), - pitch = 65, - yaw = 90, - distance = 65 - }) - end - - -- ping object - local pingPlayer = params.player or Player.getPlayers()[1] - pingPlayer.pingTable(obj.getPosition()) - end, 0.1) - end - end - - if pcall(function() spawnObjectJSON(spawnTable) end) then - print('Object loaded.') - else - print('Error loading object.') - end -end - --- gets the first empty position to spawn a custom content object safely -function getValidSpawnPosition() - local potentialSpawnPositionX = { 65, 50, 35 } - local potentialSpawnPositionY = 1.5 - local potentialSpawnPositionZ = { 35, 21, 7, -7, -21, -35 } - - for i, posX in ipairs(potentialSpawnPositionX) do - for j, posZ in ipairs(potentialSpawnPositionZ) do - local pos = { - x = posX, - y = potentialSpawnPositionY, - z = posZ, - } - if checkPositionForContentSpawn(pos) then - return pos - end - end - end - return nil -end - --- checks whether something is in the specified position --- returns true if empty -function checkPositionForContentSpawn(checkPos) - local search = Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0.1, - type = 3, - size = { 0.1, 0.1, 0.1 }, - origin = checkPos - }) - -- first hit is the table surface, additional hits means something is there - return #search == 1 -end - --- downloading of the library file -function libraryDownloadCallback(request) - if request.is_error or request.response_code ~= 200 then - print('error: ' .. request.error) - return - end - - local json_response = nil - if pcall(function () json_response = JSON.decode(request.text) end) then - formatLibrary(json_response) - updateDownloadItemList() - else - print('error parsing downloaded library') - end -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 - ---------------------------------------------------------- --- Option Panel related functionality ---------------------------------------------------------- - --- called by toggling an option -function onClick_toggleOption(_, id) - local state = self.UI.getAttribute(id, "isOn") - - -- flip state (and handle stupid "False" value) - if state == "False" then - state = true - else - state = false - end - - self.UI.setAttribute(id, "isOn", state) - applyOptionPanelChange(id, state) -end - --- called by the language selection dropdown -function languageSelected(_, selectedIndex, id) - optionPanel[id] = LANGUAGES[tonumber(selectedIndex) + 1].code -end - --- returns the ID (position in the table) for a provided language code -function returnLanguageId(code) - for index, tbl in ipairs(LANGUAGES) do - if tbl.code == code then - return index - end - end -end - --- called by the resource counter selection dropdown -function resourceCounterSelected(_, selectedIndex, id) - optionPanel[id] = RESOURCE_OPTIONS[tonumber(selectedIndex) + 1] -end - --- returns the ID for the provided option name -function returnResourceCounterId(name) - for index, optionName in ipairs(RESOURCE_OPTIONS) do - if optionName == name then - return index - end - end -end - --- sets the option panel to the correct state (corresponding to 'optionPanel') -function updateOptionPanelState() - for id, optionValue in pairs(optionPanel) do - if id == "cardLanguage" and type(optionValue) == "string" then - local dropdownId = returnLanguageId(optionValue) - 1 - UI.setAttribute(id, "value", dropdownId) - elseif id == "useResourceCounters" and type(optionValue) == "string" then - local dropdownId = returnResourceCounterId(optionValue) - 1 - UI.setAttribute(id, "value", dropdownId) - elseif (type(optionValue) == "boolean" and optionValue) - or (type(optionValue) == "string" and optionValue) - or (type(optionValue) == "table" and #optionValue ~= 0) then - UI.setAttribute(id, "isOn", true) - else - UI.setAttribute(id, "isOn", "False") - end - end -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) -function applyOptionPanelChange(id, state) - -- option: Snap tags - if id == "useSnapTags" then - playmatApi.setLimitSnapsByType(state, "All") - optionPanel[id] = state - - -- option: Draw 1 button - elseif id == "showDrawButton" then - playmatApi.showDrawButton(state, "All") - optionPanel[id] = state - - -- option: Clickable clue counters - elseif id == "useClueClickers" then - playmatApi.clickableClues(state, "All") - optionPanel[id] = state - - -- update master clue counter - local counter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "MasterClueCounter") - counter.setVar("useClickableCounters", state) - - -- option: Play area snap tags - elseif id == "playAreaSnapTags" then - playAreaApi.setLimitSnapsByType(state) - optionPanel[id] = state - - -- option: Show Title on placing scenarios - elseif id == "showTitleSplash" then - optionPanel[id] = state - - -- option: Show clean up helper - elseif id == "showCleanUpHelper" then - optionPanel[id] = spawnOrRemoveHelper(state, "Clean Up Helper", {-66, 1.6, 46}) - - -- option: Show hand helper for each player - elseif id == "showHandHelper" then - for i, color in ipairs(MAT_COLORS) do - local pos = playmatApi.transformLocalPosition({0.05, 0, -1.182}, color) - local rot = playmatApi.returnRotation(color) - optionPanel[id][i] = spawnOrRemoveHelper(state, "Hand Helper", pos, rot) - end - - -- option: Show search assistant for each player - elseif id == "showSearchAssistant" then - for i, color in ipairs(MAT_COLORS) do - local pos = playmatApi.transformLocalPosition({-0.3, 0, -1.182}, color) - local rot = playmatApi.returnRotation(color) - optionPanel[id][i] = spawnOrRemoveHelper(state, "Search Assistant", pos, rot) - end - - -- option: Show attachment helper - elseif id == "showAttachmentHelper" then - optionPanel[id] = spawnOrRemoveHelper(state, "Attachment Helper", {-62, 1.4, 0}) - - -- option: Show CYOA campaign guides - elseif id == "showCYOA" then - optionPanel[id] = spawnOrRemoveHelper(state, "CYOA Campaign Guides", {39, 1.3, -20}) - - -- option: Show displacement tool - elseif id == "showDisplacementTool" then - optionPanel[id] = spawnOrRemoveHelper(state, "Displacement Tool", {-57, 1.6, 46}) - end -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}) ----@return. GUID of the spawnedObj (or nil if object was removed) -function spawnOrRemoveHelper(state, name, position, rotation) - if (type(state) == "table" and #state == 0) then - return removeHelperObject(name) - elseif state then - Player.getPlayers()[1].pingTable(position) - return spawnHelperObject(name, position, rotation).getGUID() - else - return removeHelperObject(name) - end -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) -function spawnHelperObject(name, position, rotation) - local sourceBag = guidReferenceApi.getObjectByOwnerAndType("Mythos","OptionPanelSource") - - -- error handling for missing sourceBag - if not sourceBag then - broadcastToAll("Option panel source bag could not be found!", "Red") - return - end - - local spawnTable = { position = position } - - -- only overrride rotation if there is one provided (object's rotation used instead) - if rotation then - spawnTable.rotation = rotation - end - - for _, obj in ipairs(sourceBag.getData().ContainedObjects) do - if obj["Nickname"] == name then - spawnTable.data = obj - spawnTable.callback_function = function(spawnedObj) - Wait.time(function() spawnedObj.setLock(true) end, 2) - end - return spawnObjectData(spawnTable) - end - end -end - --- removes the specified tool (by name) ----@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 = { - ["Clean Up Helper"] = "showCleanUpHelper", - ["Hand Helper"] = "showHandHelper", - ["Search Assistant"] = "showSearchAssistant", - ["Displacement Tool"] = "showDisplacementTool", - ["Attachment Helper"] = "showAttachmentHelper", - ["CYOA Campaign Guides"] = "showCYOA" - } - - local data = optionPanel[referenceTable[name]] - - -- if there is a GUID stored, remove that object - if type(data) == "string" then - local obj = getObjectFromGUID(data) - if obj then obj.destruct() end - - -- if it is a table (e.g. for the "Hand Helper", remove all of them) - elseif type(data) == "table" then - for _, guid in pairs(data) do - local obj = getObjectFromGUID(guid) - if obj then obj.destruct() end - end - end -end - --- loads saved options -function loadSettings(newOptions) - optionPanel = newOptions - updateOptionPanelState() - for id, state in pairs(optionPanel) do - applyOptionPanelChange(id, state) - end -end - --- loads the default options -function onClick_defaultSettings() - for id, _ in pairs(optionPanel) do - local state = false - -- override for settings that are enabled by default - if id == "useSnapTags" or id == "showTitleSplash" then - state = true - end - applyOptionPanelChange(id, state) - end - - -- clean reset of variables - optionPanel = { - cardLanguage = "en", - playAreaSnapTags = true, - showAttachmentHelper = false, - showCleanUpHelper = false, - showCYOA = false, - showDisplacementTool = false, - showDrawButton = false, - showHandHelper = {}, - showSearchAssistant = {}, - showTitleSplash = true, - useClueClickers = false, - useResourceCounters = "disabled", - useSnapTags = true - } - - -- update UI - updateOptionPanelState() -end - --- splash scenario title on setup -function titleSplash(scenarioName) - if optionPanel['showTitleSplash'] then - -- if there's any ongoing title being displayed, hide it and cancel the waiting function - if hideTitleSplashWaitFunctionId then - Wait.stop(hideTitleSplashWaitFunctionId) - hideTitleSplashWaitFunctionId = nil - UI.setAttribute('title_splash', 'active', false) - end - - -- display scenario name and set a 4 seconds (2 seconds animation and 2 seconds on screen) - -- wait timer to hide the scenario name - UI.setValue('title_splash_text', scenarioName) - UI.show('title_splash') - hideTitleSplashWaitFunctionId = Wait.time(function() - UI.hide('title_splash') - hideTitleSplashWaitFunctionId = nil - end, 4) - - soundCubeApi.playSoundByName("Deep Bell") - end -end - ---------------------------------------------------------- --- Update notification related functionality ---------------------------------------------------------- - --- grabs the latest mod version and release notes from GitHub (called onLoad()) -function getModVersion() - WebRequest.get(SOURCE_REPO .. '/modversion.json', compareVersion) -end - --- compares the modversion with GitHub and possibly shows the update notification -function compareVersion(request) - if request.is_error then - log(request.error) - return - end - - -- global variable to make it accessible for other functions - modMeta = JSON.decode(request.text) - - -- stop here if on latest or newer version - if convertVersionToNumber(MOD_VERSION) >= convertVersionToNumber(modMeta["latestVersion"]) then return end - - -- stop here if "don't show again" was clicked for this version before - if acknowledgedUpgradeVersions[modMeta["latestVersion"]] then return end - - updateNotificationLoading() - - -- delay to avoid lagging during onLoad() - Wait.time(function() UI.show("FinnIcon") end, 1) -end - --- converts a version number to a string ----@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 -end - --- updates the XML update notification based on the mod metadata -function updateNotificationLoading() - -- grab data - local highlights = modMeta["releaseHighlights"] - - -- concatenate the release highlights - local highlightText = "• " .. highlights[1] - for i, entry in pairs(highlights) do - if i ~= 1 then - highlightText = highlightText .. "\n• " .. entry - end - end - - -- update the XML UI - UI.setValue("notificationHeader", "New version available: " .. modMeta["latestVersion"]) - UI.setValue("releaseHighlightText", highlightText) - UI.setAttribute("highlightRow", "preferredHeight", 20*#highlights) - UI.setAttribute("updateNotification", "height", 20*#highlights + 125) -end - --- close / don't show again buttons on the update notification -function onClick_notification(_, parameter) - if parameter == "dontShowAgain" then - -- this variable tracks if "don't show again" was pressed for a version - acknowledgedUpgradeVersions[modMeta["latestVersion"]] = true - end - UI.hide("FinnIcon") - UI.hide("updateNotification") - xmlVisibility["updateNotification"] = false -end -end) -__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local NavigationOverlayApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local GUIDReferenceApi = {} - local function getNOHandler() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") + local function getGuidHandler() + return getObjectFromGUID("123456") 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 + -- 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 - - -- 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 NavigationOverlayApi + return GUIDReferenceApi end end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1591,6 +132,16 @@ do 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) @@ -1599,7 +150,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -1654,89 +205,6 @@ do return PlayAreaApi 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("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 tokenData 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/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 to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) - end - - return MythosAreaApi -end -end) __bundle_register("core/SoundCubeApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local SoundCubeApi = {} @@ -1763,6 +231,78 @@ do 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 = { @@ -1801,128 +341,12 @@ do 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("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/Global") -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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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 - - -- 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 - - return GUIDReferenceApi -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 = { @@ -2077,7 +501,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -2119,7 +543,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -2328,7 +752,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -2408,12 +832,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -2445,28 +867,59 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) + 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 - return TokenManager + -- 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 @@ -2561,6 +1014,26 @@ do 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) @@ -2646,6 +1119,15 @@ do 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 @@ -2655,6 +1137,22 @@ do 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) @@ -2665,7 +1163,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -2694,4 +1192,1758 @@ do 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) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/Global") +end) +__bundle_register("core/Global", function(require, _LOADED, __bundle_register, __bundle_modules) +local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local mythosAreaApi = require("core/MythosAreaApi") +local navigationOverlayApi = require("core/NavigationOverlayApi") +local playAreaApi = require("core/PlayAreaApi") +local playmatApi = require("playermat/PlaymatApi") +local searchLib = require("util/SearchLib") +local soundCubeApi = require("core/SoundCubeApi") +local tokenArrangerApi = require("accessories/TokenArrangerApi") +local tokenChecker = require("core/token/TokenChecker") +local tokenManager = require("core/token/TokenManager") + +--------------------------------------------------------- +-- general setup +--------------------------------------------------------- + +ENCOUNTER_DECK_POS = { -3.93, 1, 5.76 } +ENCOUNTER_DECK_DISCARD_POSITION = { -3.85, 1, 10.38 } + +-- GUIDs that will not be interactable (e.g. parts of the table) +local NOT_INTERACTABLE = { + "6161b4", -- Decoration-Map + "9f334f", -- MythosArea + "463022", -- Panel behind tentacle stand + "f182ee", -- InvestigatorCount + "7bff34", -- Tentacle stand + "8646eb", -- horizontal border left + "75937e", -- horizontal border right + "612072", -- vertical border left + "975c39", -- vertical border right +} + +local chaosTokens = {} +local chaosTokensLastMatGUID = nil + +-- chaos token stat tracking +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 SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main' +local library, requestObj, modMeta +local acknowledgedUpgradeVersions = {} +local contentToShow = "campaigns" +local currentListItem = 1 +local xmlVisibility = { + downloadWindow = false, + optionPanel = false, + playAreaGallery = false, + updateNotification = false +} +local tabIdTable = { + tab1 = "campaigns", + tab2 = "scenarios", + tab3 = "fanmadeCampaigns", + tab4 = "fanmadeScenarios", + tab5 = "fanmadePlayerCards" +} + +-- optionPanel data +optionPanel = {} +local LANGUAGES = { + { code = "zh_CN", name = "简体中文" }, + { code = "zh_TW", name = "繁體中文" }, + { code = "de", name = "Deutsch" }, + { code = "en", name = "English" }, + { code = "es", name = "Español" }, + { code = "fr", name = "Français" }, + { code = "it", name = "Italiano" } +} +local RESOURCE_OPTIONS = { + "enabled", + "custom", + "disabled" +} + +--------------------------------------------------------- +-- data for tokens +--------------------------------------------------------- + +TOKEN_DATA = { + damage = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357115146/903D11AAE7BD5C254C8DC136E9202EE516289DEA/", scale = {0.17, 0.17, 0.17}}, + horror = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357163535/6D9E0756503664D65BDB384656AC6D4BD713F5FC/", scale = {0.17, 0.17, 0.17}}, + resource = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/", scale = {0.17, 0.17, 0.17}}, + doom = {image = "https://i.imgur.com/EoL7yaZ.png", scale = {0.17, 0.17, 0.17}}, + clue = {image = "http://cloud-3.steamusercontent.com/ugc/1758068501357164917/1D06F1DC4D6888B6F57124BD2AFE20D0B0DA15A8/", scale = {0.15, 0.15, 0.15}} +} + +ID_URL_MAP = { + ['blue'] = {name = "Elder Sign", url = 'https://i.imgur.com/nEmqjmj.png'}, + ['p1'] = {name = "+1", url = 'https://i.imgur.com/uIx8jbY.png'}, + ['0'] = {name = "0", url = 'https://i.imgur.com/btEtVfd.png'}, + ['m1'] = {name = "-1", url = 'https://i.imgur.com/w3XbrCC.png'}, + ['m2'] = {name = "-2", url = 'https://i.imgur.com/bfTg2hb.png'}, + ['m3'] = {name = "-3", url = 'https://i.imgur.com/yfs8gHq.png'}, + ['m4'] = {name = "-4", url = 'https://i.imgur.com/qrgGQRD.png'}, + ['m5'] = {name = "-5", url = 'https://i.imgur.com/3Ym1IeG.png'}, + ['m6'] = {name = "-6", url = 'https://i.imgur.com/c9qdSzS.png'}, + ['m7'] = {name = "-7", url = 'https://i.imgur.com/4WRD42n.png'}, + ['m8'] = {name = "-8", url = 'https://i.imgur.com/9t3rPTQ.png'}, + ['skull'] = {name = "Skull", url = 'https://i.imgur.com/stbBxtx.png'}, + ['cultist'] = {name = "Cultist", url = 'https://i.imgur.com/VzhJJaH.png'}, + ['tablet'] = {name = "Tablet", url = 'https://i.imgur.com/1plY463.png'}, + ['elder'] = {name = "Elder Thing", url = 'https://i.imgur.com/ttnspKt.png'}, + ['red'] = {name = "Auto-fail", url = 'https://i.imgur.com/lns4fhz.png'}, + ['bless'] = {name = "Bless", url = 'http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/'}, + ['curse'] = {name = "Curse", url = 'http://cloud-3.steamusercontent.com/ugc/1655601092778636039/2A25BD38E8C44701D80DD96BF0121DA21843672E/'}, + ['frost'] = {name = "Frost", url = 'http://cloud-3.steamusercontent.com/ugc/1858293462583104677/195F93C063A8881B805CE2FD4767A9718B27B6AE/'} +} + +--------------------------------------------------------- +-- general code +--------------------------------------------------------- + +-- saving state of optionPanel to restore later +function onSave() + local chaosTokensGUID = {} + for _, obj in ipairs(chaosTokens) do + if obj ~= nil then + table.insert(chaosTokensGUID, obj.getGUID()) + end + end + + return JSON.encode({ + optionPanel = optionPanel, + acknowledgedUpgradeVersions = acknowledgedUpgradeVersions, + chaosTokensLastMatGUID = chaosTokensLastMatGUID, + chaosTokensGUID = chaosTokensGUID + }) +end + +function onLoad(savedData) + if savedData then + loadedData = JSON.decode(savedData) + optionPanel = loadedData.optionPanel + acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions + updateOptionPanelState() + + -- restore saved state for drawn chaos tokens + for _, guid in ipairs(loadedData.chaosTokensGUID or {}) do + table.insert(chaosTokens, getObjectFromGUID(guid)) + end + chaosTokensLastMatGUID = loadedData.chaosTokensLastMatGUID + else + print("Saved state could not be found!") + end + + for _, guid in ipairs(NOT_INTERACTABLE) do + local obj = getObjectFromGUID(guid) + if obj ~= nil then obj.interactable = false end + end + + getModVersion() + math.randomseed(os.time()) + + -- initialization of loadable objects library (delay to let Navigation Overlay build) + Wait.time(function() + WebRequest.get(SOURCE_REPO .. '/library.json', libraryDownloadCallback) + end, 1) +end + +-- Event hook for any object search. When chaos tokens are manipulated while the chaos bag +-- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the +-- chaos bag during search operations to avoid this. +function onObjectSearchStart(object, playerColor) + local chaosBag = findChaosBag() + if object == chaosBag then + bagSearchers[playerColor] = true + end +end + +-- Event hook for any object search. When chaos tokens are manipulated while the chaos bag +-- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the +-- chaos bag during search operations to avoid this. +function onObjectSearchEnd(object, playerColor) + local chaosBag = findChaosBag() + if object == chaosBag then + bagSearchers[playerColor] = nil + end +end + +-- Pass object enter container events to the PlayArea to clear vector lines from dragged cards. +-- This requires the try method as cards won't exist any more after they enter a deck, so the lines +-- can't be cleared. +function tryObjectEnterContainer(container, object) + playAreaApi.tryObjectEnterContainer(container, object) + return true +end + +-- TTS event for objects that enter zones +-- used to detect the "token discard zones" beneath the hand zones +function onObjectEnterZone(zone, enteringObj) + if zone.getName() ~= "TokenDiscardZone" then return end + if tokenChecker.isChaosToken(enteringObj) then return end + + if enteringObj.type == "Tile" and enteringObj.getMemo() and enteringObj.getLock() == false then + local matcolor = playmatApi.getMatColorByPosition(enteringObj.getPosition()) + local trash = guidReferenceApi.getObjectByOwnerAndType(matcolor, "Trash") + trash.putObject(enteringObj) + end +end + +-- handle card drawing via number typing for multihanded gameplay +-- (and additionally allow Norman Withers to draw multiple cards via number) +function onObjectNumberTyped(hoveredObject, playerColor, number) + -- only continue for decks or cards + if hoveredObject.type ~= "Deck" and hoveredObject.type ~= "Card" then return end + + -- check whether the hovered object is part of a players draw objects + for _, color in ipairs(playmatApi.getUsedMatColors()) do + local deckAreaObjects = playmatApi.getDeckAreaObjects(color) + if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then + playmatApi.drawCardsWithReshuffle(color, number) + return true + end + end +end + +--------------------------------------------------------- +-- chaos token drawing +--------------------------------------------------------- + +-- checks scripting zone for chaos bag (also called by a lot of objects!) +function findChaosBag() + local chaosBagZone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "ChaosBagZone") + + -- error handling: scripting zone not found + if chaosBagZone == nil then + printToAll("Zone for chaos bag detection couldn't be found.", "Red") + return + end + + for _, item in ipairs(chaosBagZone.getObjects()) do + if item.getDescription() == "Chaos Bag" then + return item + end + end + + -- error handling: chaos bag not found + printToAll("Chaos bag couldn't be found.", "Red") +end + +function returnChaosTokens() + local chaosBag = findChaosBag() + for _, token in pairs(chaosTokens) do + if token ~= nil then chaosBag.putObject(token) end + end + chaosTokens = {} +end + +-- returns a single chaos token to the bag and calls respective functions +function returnChaosTokenToBag(token) + local name = token.getName() + local guid = token.getGUID() + local chaosBag = findChaosBag() + chaosBag.putObject(token) + tokenArrangerApi.layout() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.releasedToken(name, guid) + 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. +function canTouchChaosTokens() + for color, searching in pairs(bagSearchers) do + if searching then + broadcastToAll("Someone is searching the chaos bag, can't touch the tokens.", "Red") + return false + end + end + return true +end + +-- called by playermats (by the "Draw chaos token" button) +function drawChaosToken(params) + if not canTouchChaosTokens() then return end + + local tokenOffset = {-1.55, 0.25, -0.58} + local matGUID = params.mat.getGUID() + + -- return token(s) on other playmat first + if chaosTokensLastMatGUID ~= nil and chaosTokensLastMatGUID ~= matGUID and #chaosTokens ~= 0 then + returnChaosTokens() + chaosTokensLastMatGUID = nil + return + end + + chaosTokensLastMatGUID = matGUID + + -- if we have left clicked and have no tokens OR if we have right clicked + if params.drawAdditional or #chaosTokens == 0 then + local chaosBag = findChaosBag() + if #chaosBag.getObjects() == 0 then return end + chaosBag.shuffle() + + -- 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() + }) + + -- get data for token description + local name = token.getName() + local tokenData = mythosAreaApi.returnTokenData().tokenData or {} + local specificData = tokenData[name] or {} + token.setDescription(specificData.description or "") + + -- track the chaos token (for stat tracker and future returning) + trackChaosToken(name, matGUID) + chaosTokens[#chaosTokens + 1] = token + else + returnChaosTokens() + end +end + +--------------------------------------------------------- +-- token spawning +--------------------------------------------------------- + +-- DEPRECATED. Use TokenManager instead. +-- Spawns a single token. +---@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 + +--------------------------------------------------------- +-- chaos token stat tracker +--------------------------------------------------------- + +function trackChaosToken(tokenName, matGUID) + -- initialize tables + if not tokenDrawingStats[matGUID] then tokenDrawingStats[matGUID] = {} end + + -- increase stats by 1 + tokenDrawingStats["Overall"][tokenName] = (tokenDrawingStats["Overall"][tokenName] or 0) + 1 + tokenDrawingStats[matGUID][tokenName] = (tokenDrawingStats[matGUID][tokenName] or 0) + 1 +end + +-- Left-click: print stats, Right-click: reset stats +function handleStatTrackerClick(_, _, isRightClick) + if isRightClick then + resetChaosTokenStatTracker() + else + local squidKing = "Nobody" + local maxSquid = 0 + local foundAnyStats = false + + for key, personalStats in pairs(tokenDrawingStats) do + local playerColor, playerName + + if key == "Overall" then + playerColor = "White" + playerName = "Overall" + else + -- get mat color + local matColor = playmatApi.getMatColorByPosition(getObjectFromGUID(key).getPosition()) + playerColor = playmatApi.getPlayerColor(matColor) + playerName = Player[playerColor].steam_name or playerColor + + local playerSquidCount = personalStats["Auto-fail"] or 0 + if playerSquidCount > maxSquid then + squidKing = playerName + maxSquid = playerSquidCount + end + end + + -- get the total count of drawn tokens for the player + local totalCount = 0 + for tokenName, value in pairs(personalStats) do + totalCount = totalCount + value + end + + -- only print the personal stats if any tokens were drawn + if totalCount > 0 then + foundAnyStats = true + printToAll("------------------------------") + printToAll(playerName .. " Stats", playerColor) + + for tokenName, value in pairs(personalStats) do + if value ~= 0 then + printToAll(tokenName .. ': ' .. tostring(value)) + end + end + printToAll('Total: ' .. tostring(totalCount)) + end + end + + -- detect if any player drew tokens + if foundAnyStats then + printToAll("------------------------------") + printToAll(squidKing .. " is an auto-fail magnet.", { 255, 0, 0 }) + else + printToAll("No tokens have been drawn yet.", "Yellow") + end + end +end + +-- resets the count for each token to 0 +function resetChaosTokenStatTracker() + tokenDrawingStats = { ["Overall"] = {} } +end + +--------------------------------------------------------- +-- Difficulty selector script +--------------------------------------------------------- + +-- called for button creation on the difficulty selectors +---@param args Table Parameters for this function: +-- object TTSObject Usually "self" +-- key String Name of the scenario +function createSetupButtons(args) + local data = getDataValue('modeData', args.key) + if data ~= nil then + local buttonParameters = {} + buttonParameters.function_owner = args.object + buttonParameters.position = { 0, 0.1, -0.15 } + buttonParameters.scale = { 0.47, 1, 0.47 } + buttonParameters.height = 200 + buttonParameters.width = 1150 + buttonParameters.color = { 0.87, 0.8, 0.7 } + + if data.easy ~= nil then + buttonParameters.label = "Easy" + buttonParameters.click_function = "easyClick" + args.object.createButton(buttonParameters) + buttonParameters.position[3] = buttonParameters.position[3] + 0.20 + end + + if data.normal ~= nil then + buttonParameters.label = "Standard" + buttonParameters.click_function = "normalClick" + args.object.createButton(buttonParameters) + buttonParameters.position[3] = buttonParameters.position[3] + 0.20 + end + + if data.hard ~= nil then + buttonParameters.label = "Hard" + buttonParameters.click_function = "hardClick" + args.object.createButton(buttonParameters) + buttonParameters.position[3] = buttonParameters.position[3] + 0.20 + end + + if data.expert ~= nil then + buttonParameters.label = "Expert" + buttonParameters.click_function = "expertClick" + args.object.createButton(buttonParameters) + buttonParameters.position[3] = buttonParameters.position[3] + 0.20 + end + + if data.standalone ~= nil then + buttonParameters.label = "Standalone" + buttonParameters.click_function = "standaloneClick" + args.object.createButton(buttonParameters) + end + end +end + +-- called for adding chaos tokens +---@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") +function fillContainer(args) + local data = getDataValue('modeData', args.key) + if data == nil then return end + + local value = data[args.mode] + if value == nil or value.token == nil then return end + + local tokenList = {} + + for _, tokenId in ipairs(value.token) do + table.insert(tokenList, tokenId) + end + + if value.append ~= nil then + for _, tokenId in ipairs(value.append) do + table.insert(tokenList, tokenId) + end + end + + -- randomly choose tokens for specific Carcosa scenarios in standalone + if value.random then + local n = #value.random + if n > 0 then + for _, tokenId in ipairs(value.random[math.random(1, n)]) do + table.insert(tokenList, tokenId) + end + end + end + + setChaosBagState(tokenList) + + if value.message then + broadcastToAll(value.message) + end + + if value.warning then + broadcastToAll(value.warning, { 1, 0.5, 0.5 }) + end +end + +function getDataValue(storage, key) + local DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") + local data = DATA_HELPER.getTable(storage) + if data ~= nil then + local value = data[key] + if value ~= nil then + local res = {} + for m, v in pairs(value) do + res[m] = v + if res[m].parent ~= nil then + local parentData = getDataValue(storage, res[m].parent) + if parentData ~= nil and parentData[m] ~= nil and parentData[m].token ~= nil then + res[m].token = parentData[m].token + end + res[m].parent = nil + end + end + return res + end + end +end + +function createChaosTokenNameLookupTable() + local namesToIds = {} + for k, v in pairs(ID_URL_MAP) do + namesToIds[v.name] = k + end + return namesToIds +end + +-- returns the currently drawn chaos tokens +---@api ChaosBagApi +function getChaosTokensinPlay() + return chaosTokens +end + +-- returns a Table List of chaos token ids in the current chaos bag +---@api ChaosBag / ChaosBagApi +function getChaosBagState() + local tokens = {} + local invertedTable = createChaosTokenNameLookupTable() + local chaosBag = findChaosBag() + + for _, v in ipairs(chaosBag.getObjects()) do + local id = invertedTable[v.name] + if id then + table.insert(tokens, id) + else + printToAll(v.name .. " token not recognized. Will not be recorded.", "Yellow") + end + end + + return tokens +end + +-- respawns the chaos bag with a new state of tokens +---@param tokenList Table List of chaos token ids +---@api ChaosBag / ChaosBagApi +function setChaosBagState(tokenList) + if not canTouchChaosTokens() then return end + + local chaosBag = findChaosBag() + local chaosBagData = chaosBag.getData() + local reserveData = getObjectFromGUID("106418").getData() + local tokenCache = {} + local containedObjects = {} + + -- create a temporary copy of the data for each chaos token + for _, objData in ipairs(reserveData.ContainedObjects) do + tokenCache[objData.Nickname] = objData + end + + -- iterate over tokenlist and insert specified tokens into new table + for _, tokenId in ipairs(tokenList) do + local tokenName = ID_URL_MAP[tokenId].name + table.insert(containedObjects, tokenCache[tokenName]) + end + + -- overwrite chaos bag content and respawn it + chaosBagData.ContainedObjects = containedObjects + chaosBag.destruct() + spawnObjectData({ data = chaosBagData }) + + -- remove tokens that are still in play + for _, token in pairs(chaosTokens) do + if token ~= nil then token.destruct() end + end + chaosTokens = {} + chaosTokensLastMatGUID = nil + + -- reset bless / curse manager + blessCurseManagerApi.removeTakenTokensAndReset() + + printToAll("Chaos bag set to chosen difficulty.", "Green") +end + +-- spawns the specified chaos token and puts it into the chaos bag +---@param id String ID of the chaos token +function spawnChaosToken(id) + if not canTouchChaosTokens() then return end + + id = id:lower() + local chaosBag = findChaosBag() + local url = ID_URL_MAP[id].url or "" + + if url ~= "" then + return spawnObject({ + type = 'Custom_Tile', + position = { 0.49, 3, 0 }, + scale = { 0.81, 1.0, 0.81 }, + rotation = { 0, 270, 0 }, + callback_function = function(obj) + obj.setName(ID_URL_MAP[id].name) + chaosBag.putObject(obj) + tokenArrangerApi.layout() + end + }).setCustomObject({ + type = 2, + image = url, + thickness = 0.1 + }) + end +end + +-- removes the specified chaos token from the chaos bag +---@param id String ID of the chaos token +function removeChaosToken(id) + if not canTouchChaosTokens() then return end + + local tokens = {} + local chaosBag = findChaosBag() + local name = ID_URL_MAP[id].name + + for _, v in ipairs(chaosBag.getObjects()) do + if v.name == name then table.insert(tokens, v.guid) end + end + + -- error handling: no matching token found + if #tokens == 0 then + printToAll("No " .. name .. " tokens in the chaos bag.", "Yellow") + return + end + + chaosBag.takeObject({ + guid = tokens[1], + smooth = false, + callback_function = function(obj) + obj.destruct() + tokenArrangerApi.layout() + end + }) + printToAll("Removing " .. name .. " token (in bag: " .. #tokens - 1 .. ")", "White") +end + +-- empty the chaos bag +function emptyChaosBag() + if not canTouchChaosTokens() then return end + + local chaosBag = findChaosBag() + for _, object in ipairs(chaosBag.getObjects()) do + chaosBag.takeObject({ callback_function = function(item) item.destruct() end }) + end +end + +-- returns all sealed tokens on cards to the chaos bag +function releaseAllSealedTokens(playerColor) + local chaosBag = findChaosBag() + for _, obj in ipairs(getObjectsWithTag("CardThatSeals")) do + obj.call("releaseAllTokens", playerColor) + end +end + +--------------------------------------------------------- +-- Content Importing and XML functions +--------------------------------------------------------- + +-- forwards the requested content type to the update function and sets highlight to 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 + UI.setClass(listId, 'downloadTab activeTab') + contentToShow = listContent + else + UI.setClass(listId, 'downloadTab') + end + end + currentListItem = 1 + updateDownloadItemList() +end + +-- click function for the items in the download window +-- updates backgroundcolor for row panel and fontcolor for list item +function onClick_select(_, _, identificationKey) + UI.setAttribute("panel" .. currentListItem, "color", "clear") + UI.setAttribute(contentToShow .. "_" .. currentListItem, "color", "white") + + -- parses the identification key (contentToShow_currentListItem) + if identificationKey then + contentToShow = nil + currentListItem = nil + for str in string.gmatch(identificationKey, "([^_]+)") do + if not contentToShow then + -- grab the first part to know the content type + contentToShow = str + else + -- get the index + currentListItem = tonumber(str) + break + end + end + end + + UI.setAttribute("panel" .. currentListItem, "color", "grey") + UI.setAttribute(contentToShow .. "_" .. currentListItem, "color", "black") + updatePreviewWindow() +end + +-- click function for the "Custom URL" button in the playarea image gallery +function onClick_customUrl(player) + onClick_toggleUi(_, "playareaGallery") + Wait.time(function() + player.showInputDialog("Enter a custom URL for the playarea image", "", function(newURL) + playAreaApi.updateSurface(newURL) + end) + end, 0.15) +end + +-- click function for the download button in the preview window +function onClick_download(player) + local params = library[contentToShow][currentListItem] + params.player = player + placeholder_download(params) +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 +function placeholder_download(params) + local url = SOURCE_REPO .. '/' .. params.url + requestObj = WebRequest.get(url, function (request) contentDownloadCallback(request, params) end) + startLuaCoroutine(Global, 'downloadCoroutine') +end + +function downloadCoroutine() + -- show progress bar + UI.setAttribute('download_progress', 'active', true) + + -- update progress bar + while requestObj do + UI.setAttribute('download_progress', 'percentage', requestObj.download_progress * 100) + coroutine.yield(0) + end + UI.setAttribute('download_progress', 'percentage', 100) + + -- wait 30 frames + for i = 1, 30 do + coroutine.yield(0) + end + + -- hide progress bar + UI.setAttribute('download_progress', 'active', false) + + -- hide download window + if xmlVisibility.downloadWindow then + xmlVisibility.downloadWindow = false + UI.hide('downloadWindow') + end + return 1 +end + +-- spawns a bag that contains every object from the library +function onClick_downloadAll() + broadcastToAll("Download initiated - this will take a few minutes!") + + -- hide download window + if xmlVisibility.downloadWindow then + xmlVisibility.downloadWindow = false + UI.hide('downloadWindow') + end + + startLuaCoroutine(Global, "coroutineDownloadAll") +end + +function coroutineDownloadAll() + local JSON = [[ + { + "Name": "Bag", + "Transform": { + "posX": {{POSX}}, + "posY": 2, + "posZ": -95, + "rotX": 0, + "rotY": 270, + "rotZ": 0, + "scaleX": 1.0, + "scaleY": 1.0, + "scaleZ": 1.0 + }, + "Nickname": "{{NICKNAME}}", + "Bag": { + "Order": 0 + }, + "ContainedObjects": [ + ]] + + local posx = -45.0 + local downloadedItems = 0 + local skippedItems = 0 + + -- loop through the library to add content + for contentType, objectList in pairs(library) do + broadcastToAll("Downloading " .. contentType .. "...") + local contained = "" + for _, params in ipairs(objectList) do + local request = WebRequest.get(SOURCE_REPO .. '/' .. params.url) + local start = os.time() + while true do + if request.is_done then + contained = contained .. request.text .. "," + downloadedItems = downloadedItems + 1 + break + -- time-out if item can't be loaded in 5s + elseif request.is_error or (os.time() - start) > 5 then + skippedItems = skippedItems + 1 + break + end + coroutine.yield(0) + end + end + local JSONCopy = JSON + JSONCopy = JSONCopy .. contained .. "]}" + JSONCopy = JSONCopy:gsub("{{POSX}}", posx) + JSONCopy = JSONCopy:gsub("{{NICKNAME}}", contentType) + spawnObjectJSON({json = JSONCopy}) + posx = posx + 3 + end + + broadcastToAll(downloadedItems .. " objects downloaded.", "Green") + broadcastToAll(skippedItems .. " objects had a time-out / error.", "Orange") + return 1 +end + +-- spawns a placeholder box for the selected object +function onClick_spawnPlaceholder() + -- get object references + local item = library[contentToShow][currentListItem] + local dummy = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlaceholderBoxDummy") + + -- error handling + if not item.boxsize or item.boxsize == "" or not item.boxart or item.boxart == "" then + print("Error loading object.") + return + end + + -- get data for placeholder + local spawnPos = {-39.5, 2, -87} + + local meshTable = { + big = "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/core_h_MSH.obj", + small = "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj", + wide = "http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/" + } + + local scaleTable = { + big = {1.00, 0.14, 1.00}, + small = {2.21, 0.46, 2.42}, + wide = {2.00, 0.11, 1.69} + } + + local placeholder = spawnObject({ + type = "Custom_Model", + position = spawnPos, + rotation = {0, 270, 0}, + scale = scaleTable[item.boxsize], + }) + + placeholder.setCustomObject({ + mesh = meshTable[item.boxsize], + diffuse = item.boxart, + material = 3 + }) + + placeholder.setColorTint({1, 1, 1, 71/255}) + placeholder.setName(item.name) + placeholder.setDescription("by " .. (item.author or "Unknown")) + placeholder.setGMNotes(item.url) + placeholder.setLuaScript(dummy.getLuaScript()) + Player.getPlayers()[1].pingTable(spawnPos) + + -- hide download window + if xmlVisibility.downloadWindow then + xmlVisibility.downloadWindow = false + UI.hide('downloadWindow') + end +end + +-- toggles the visibility of the respective UI +---@param player LuaPlayer 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) + return + -- hide the playareaGallery if visible + elseif title == "downloadWindow" and xmlVisibility.playAreaGallery then + onClick_toggleUi(_, "playAreaGallery") + -- hide the downloadWindow if visible + elseif title == "playAreaGallery" and xmlVisibility.downloadWindow then + onClick_toggleUi(_, "downloadWindow") + end + + if xmlVisibility[title] then + -- small delay to allow button click sounds to play + Wait.time(function() UI.hide(title) end, 0.1) + else + UI.show(title) + end + xmlVisibility[title] = not xmlVisibility[title] +end + +-- forwards the call to the onClick function +function togglePlayAreaGallery() + onClick_toggleUi(_, "playAreaGallery") +end + +-- updates the preview window +function updatePreviewWindow() + local item = library[contentToShow][currentListItem] + local tempImage = "http://cloud-3.steamusercontent.com/ugc/2115061845788345842/2CD6ABC551555CCF58F9D0DDB7620197BA398B06/" + + -- set default image if not defined + if item.boxsize == nil or item.boxsize == "" or item.boxart == nil or item.boxart == "" then + item.boxsize = "big" + item.boxart = "http://cloud-3.steamusercontent.com/ugc/762723517667628371/18438B0A0045038A7099648AA3346DFCAA267C66/" + end + + UI.setValue("previewTitle", item.name) + UI.setValue("previewAuthor", "by " .. (item.author or "- Author not found -")) + UI.setValue("previewDescription", item.description or "- Description not found -") + + -- update mask according to size (hardcoded values to align image in mask) + local maskData = {} + if item.boxsize == "big" then + maskData = { + image = "box-cover-mask-big", + width = "870", + height = "435", + offsetXY = "154 60" + } + elseif item.boxsize == "small" then + maskData = { + image = "box-cover-mask-small", + width = "792", + height = "594", + offsetXY = "135 13" + } + elseif item.boxsize == "wide" then + maskData = { + image = "box-cover-mask-wide", + width = "756", + height = "630", + offsetXY = "-190 -70" + } + end + + -- loading empty image as placeholder until real image is loaded + UI.setAttribute("previewArtImage", "image", tempImage) + + -- insert the image itself + UI.setAttribute("previewArtImage", "image", item.boxart) + UI.setAttributes("previewArtMask", maskData) +end + +-- formats the json response from the webrequest into a key-value lua table +-- strips the prefix from the community content items +function formatLibrary(json_response) + library = {} + library["campaigns"] = json_response.campaigns + library["scenarios"] = json_response.scenarios + library["extras"] = json_response.extras + library["fanmadeCampaigns"] = {} + library["fanmadeScenarios"] = {} + library["fanmadePlayerCards"] = {} + + for _, item in ipairs(json_response.community) do + local identifier = nil + for str in string.gmatch(item.name, "([^:]+)") do + if not identifier then + -- grab the first part to know the content type + identifier = str + else + -- update the name without the content type + item.name = str + break + end + end + + if identifier == "Fan Investigators" then + table.insert(library["fanmadePlayerCards"], item) + elseif identifier == "Fan Campaign" then + table.insert(library["fanmadeCampaigns"], item) + elseif identifier == "Fan Scenario" then + table.insert(library["fanmadeScenarios"], item) + end + end +end + +-- updates the window content to the requested content +function updateDownloadItemList() + if not library then return end + + -- addition of list items according to library file + local globalXml = UI.getXmlTable() + local contentList = getXmlTableElementById(globalXml, 'contentList') + + contentList.children = {} + for i, v in ipairs(library[contentToShow]) do + table.insert(contentList.children, + { + tag = "Panel", + attributes = { id = "panel" .. i }, + children = { + tag = 'Text', + value = v.name, + attributes = { + id = contentToShow .. "_" .. i, + onClick = 'onClick_select', + alignment = 'MiddleLeft' + } + } + }) + end + + contentList.attributes.height = #contentList.children * 27 + UI.setXmlTable(globalXml) + + -- select the first item + Wait.time(onClick_select, 0.2) +end + +-- called after the webrequest of downloading an item +-- deletes the placeholder and spawns the downloaded item +function contentDownloadCallback(request, params) + requestObj = nil + + -- error handling + if request.is_error or request.response_code ~= 200 then + print('Error: ' .. request.error) + return + end + + -- initiate content spawning + local spawnTable = { json = request.text } + if params.replace then + local replacedObject = getObjectFromGUID(params.replace) + if replacedObject then + spawnTable.position = replacedObject.getPosition() + spawnTable.rotation = replacedObject.getRotation() + spawnTable.scale = replacedObject.getScale() + destroyObject(replacedObject) + end + end + + -- if position is undefined, get empty position + if not spawnTable.position then + spawnTable.rotation = { 0, 270, 0} + + local pos = getValidSpawnPosition() + if pos then + spawnTable.position = pos + else + broadcastToAll("Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red") + return + end + end + + -- if spawned from menu, move the camera and/or ping the table + if params.name then + spawnTable["callback_function"] = function(obj) + Wait.time(function() + -- move camera + if params.player then + params.player.lookAt({ + position = obj.getPosition(), + pitch = 65, + yaw = 90, + distance = 65 + }) + end + + -- ping object + local pingPlayer = params.player or Player.getPlayers()[1] + pingPlayer.pingTable(obj.getPosition()) + end, 0.1) + end + end + + if pcall(function() spawnObjectJSON(spawnTable) end) then + print('Object loaded.') + else + print('Error loading object.') + end +end + +-- gets the first empty position to spawn a custom content object safely +function getValidSpawnPosition() + local potentialSpawnPositionX = { 65, 50, 35 } + local potentialSpawnPositionY = 1.5 + local potentialSpawnPositionZ = { 35, 21, 7, -7, -21, -35 } + + for i, posX in ipairs(potentialSpawnPositionX) do + for j, posZ in ipairs(potentialSpawnPositionZ) do + local pos = { + x = posX, + y = potentialSpawnPositionY, + z = posZ, + } + if checkPositionForContentSpawn(pos) then + return pos + end + end + end + return nil +end + +-- checks whether something is in the specified position +-- returns true if empty +function checkPositionForContentSpawn(checkPos) + local searchResult = searchLib.atPosition(checkPos) + + -- first hit is the table surface, additional hits means something is there + return #searchResult == 1 +end + +-- downloading of the library file +function libraryDownloadCallback(request) + if request.is_error or request.response_code ~= 200 then + print('error: ' .. request.error) + return + end + + local json_response = nil + if pcall(function () json_response = JSON.decode(request.text) end) then + formatLibrary(json_response) + updateDownloadItemList() + else + print('error parsing downloaded library') + end +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 + +--------------------------------------------------------- +-- Option Panel related functionality +--------------------------------------------------------- + +-- called by toggling an option +function onClick_toggleOption(_, id) + local state = self.UI.getAttribute(id, "isOn") + + -- flip state (and handle stupid "False" value) + if state == "False" then + state = true + else + state = false + end + + self.UI.setAttribute(id, "isOn", state) + applyOptionPanelChange(id, state) +end + +-- color selection for playArea +function onClick_playAreaConnectionColor(player, _, id) + player.showColorDialog(optionPanel[id], function(color) + applyOptionPanelChange(id, color) + end) +end + +-- called by the language selection dropdown +function languageSelected(_, selectedIndex, id) + optionPanel[id] = LANGUAGES[tonumber(selectedIndex) + 1].code +end + +-- returns the ID (position in the table) for a provided language code +function returnLanguageId(code) + for index, tbl in ipairs(LANGUAGES) do + if tbl.code == code then + return index + end + end +end + +-- called by the resource counter selection dropdown +function resourceCounterSelected(_, selectedIndex, id) + optionPanel[id] = RESOURCE_OPTIONS[tonumber(selectedIndex) + 1] +end + +-- returns the ID for the provided option name +function returnResourceCounterId(name) + for index, optionName in ipairs(RESOURCE_OPTIONS) do + if optionName == name then + return index + end + end +end + +-- called by the playermat removal selection dropdown +function playermatRemovalSelected(player, selectedIndex, id) + if selectedIndex == "0" then return end + + local matColorList = { "White", "Orange", "Green", "Red" } + local matColor = matColorList[tonumber(selectedIndex)] + local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + + if mat then + -- confirmation dialog about deletion + player.pingTable(mat.getPosition()) + player.showConfirmDialog("Do you really want to remove " .. matColor .. "'s playermat and related objects? This can't be reversed.", function() removePlayermat(matColor) end) + else + -- info dialog that it is already deleted + player.showInfoDialog(matColor .. "'s playermat has already been removed.") + end + + -- set selected value back to first option + UI.setAttribute(id, "value", 0) +end + +-- removes a playermat and all related objects from play +---@param matColor String Color of the playermat to remove +function removePlayermat(matColor) + local matObjects = guidReferenceApi.getObjectsByOwner(matColor) + if not matObjects.Playermat then return end + + -- remove action tokens + local actionTokens = playmatApi.searchAroundPlaymat(matColor, "isActionToken") + for _, obj in ipairs(actionTokens) do + obj.destruct() + end + + -- remove mat owned objects + for _, obj in pairs(matObjects) do + obj.destruct() + end +end + +-- sets the option panel to the correct state (corresponding to 'optionPanel') +function updateOptionPanelState() + for id, optionValue in pairs(optionPanel) do + if id == "cardLanguage" and type(optionValue) == "string" then + local dropdownId = returnLanguageId(optionValue) - 1 + UI.setAttribute(id, "value", dropdownId) + elseif id == "useResourceCounters" and type(optionValue) == "string" then + local dropdownId = returnResourceCounterId(optionValue) - 1 + UI.setAttribute(id, "value", dropdownId) + elseif id == "playAreaConnectionColor" then + UI.setAttribute(id, "color", "#" .. Color.new(optionValue):toHex()) + elseif (type(optionValue) == "boolean" and optionValue) + or (type(optionValue) == "string" and optionValue) + or (type(optionValue) == "table" and #optionValue ~= 0) then + UI.setAttribute(id, "isOn", true) + else + UI.setAttribute(id, "isOn", "False") + end + end +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) +function applyOptionPanelChange(id, state) + -- option: Snap tags + if id == "useSnapTags" then + playmatApi.setLimitSnapsByType(state, "All") + optionPanel[id] = state + + -- option: Draw 1 button + elseif id == "showDrawButton" then + playmatApi.showDrawButton(state, "All") + optionPanel[id] = state + + -- option: Clickable clue counters + elseif id == "useClueClickers" then + playmatApi.clickableClues(state, "All") + optionPanel[id] = state + + -- update master clue counter + local counter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "MasterClueCounter") + counter.setVar("useClickableCounters", state) + + -- option: Play area snap tags + elseif id == "playAreaConnections" then + playAreaApi.setConnectionDrawState(state) + optionPanel[id] = state + + -- option: Play area connection color + elseif id == "playAreaConnectionColor" then + playAreaApi.setConnectionColor(state) + UI.setAttribute(id, "color", "#" .. Color.new(state):toHex()) + optionPanel[id] = state + + -- option: Play area snap tags + elseif id == "playAreaSnapTags" then + playAreaApi.setLimitSnapsByType(state) + optionPanel[id] = state + + -- option: Show Title on placing scenarios + elseif id == "showTitleSplash" then + optionPanel[id] = state + + -- option: Change custom playarea image on setup + elseif id == "changePlayAreaImage" then + optionPanel[id] = state + + -- option: Show clean up helper + elseif id == "showCleanUpHelper" then + optionPanel[id] = spawnOrRemoveHelper(state, "Clean Up Helper", {-66, 1.6, 46}) + + -- option: Show hand helper for each player + elseif id == "showHandHelper" then + local helperName = "Hand Helper" + local spawnData = playmatApi.getHelperSpawnData("All", helperName) + local i = 0 + for color, data in pairs(spawnData) do + i = i + 1 + optionPanel[id][i] = spawnOrRemoveHelper(state, helperName, data.position, data.rotation, color) + end + + -- option: Show search assistant for each player + elseif id == "showSearchAssistant" then + local helperName = "Search Assistant" + local spawnData = playmatApi.getHelperSpawnData("All", helperName) + local i = 0 + for color, data in pairs(spawnData) do + i = i + 1 + optionPanel[id][i] = spawnOrRemoveHelper(state, helperName, data.position, data.rotation, color) + end + + -- option: Show attachment helper + elseif id == "showAttachmentHelper" then + optionPanel[id] = spawnOrRemoveHelper(state, "Attachment Helper", {-62, 1.4, 0}) + + -- option: Show CYOA campaign guides + elseif id == "showCYOA" then + optionPanel[id] = spawnOrRemoveHelper(state, "CYOA Campaign Guides", {39, 1.3, -20}) + + -- option: Show displacement tool + elseif id == "showDisplacementTool" then + optionPanel[id] = spawnOrRemoveHelper(state, "Displacement Tool", {-57, 1.6, 46}) + end +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) +function spawnOrRemoveHelper(state, name, position, rotation, owner) + if (type(state) == "table" and #state == 0) then + return removeHelperObject(name) + elseif state then + Player.getPlayers()[1].pingTable(position) + local spawnedGUID = spawnHelperObject(name, position, rotation).getGUID() + local cleanName = name:gsub("%s+", "") + guidReferenceApi.editIndex(owner or "Mythos", cleanName, spawnedGUID) + return spawnedGUID + else + return removeHelperObject(name) + end +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) +function spawnHelperObject(name, position, rotation) + local sourceBag = guidReferenceApi.getObjectByOwnerAndType("Mythos","OptionPanelSource") + + -- error handling for missing sourceBag + if not sourceBag then + broadcastToAll("Option panel source bag could not be found!", "Red") + return + end + + local spawnTable = { position = position } + + -- only overrride rotation if there is one provided (object's rotation used instead) + if rotation then + spawnTable.rotation = rotation + end + + for _, obj in ipairs(sourceBag.getData().ContainedObjects) do + if obj["Nickname"] == name then + spawnTable.data = obj + spawnTable.callback_function = function(spawnedObj) + Wait.time(function() spawnedObj.setLock(true) end, 2) + end + return spawnObjectData(spawnTable) + end + end +end + +-- removes the specified tool (by name) +---@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 = { + ["Clean Up Helper"] = "showCleanUpHelper", + ["Hand Helper"] = "showHandHelper", + ["Search Assistant"] = "showSearchAssistant", + ["Displacement Tool"] = "showDisplacementTool", + ["Attachment Helper"] = "showAttachmentHelper", + ["CYOA Campaign Guides"] = "showCYOA" + } + + local data = optionPanel[referenceTable[name]] + + -- if there is a GUID stored, remove that object + if type(data) == "string" then + local obj = getObjectFromGUID(data) + if obj then obj.destruct() end + + -- if it is a table (e.g. for the "Hand Helper", remove all of them) + elseif type(data) == "table" then + for _, guid in pairs(data) do + local obj = getObjectFromGUID(guid) + if obj then obj.destruct() end + end + end +end + +-- loads saved options +function loadSettings(newOptions) + optionPanel = newOptions + updateOptionPanelState() + for id, state in pairs(optionPanel) do + applyOptionPanelChange(id, state) + end +end + +-- loads the default options +function onClick_defaultSettings() + for id, _ in pairs(optionPanel) do + local state = false + -- override for settings that are enabled by default + if id == "useSnapTags" or id == "showTitleSplash" then + state = true + end + applyOptionPanelChange(id, state) + end + + -- clean reset of variables + optionPanel = { + cardLanguage = "en", + playAreaConnectionColor = { 0.4, 0.4, 0.4, 1 }, + playAreaConnections = true, + playAreaSnapTags = true, + showAttachmentHelper = false, + showCleanUpHelper = false, + showCYOA = false, + showDisplacementTool = false, + showDrawButton = false, + showHandHelper = {}, + showSearchAssistant = {}, + showTitleSplash = true, + useClueClickers = false, + useResourceCounters = "disabled", + useSnapTags = true + } + + -- update UI + updateOptionPanelState() +end + +-- splash scenario title on setup +function titleSplash(scenarioName) + if optionPanel['showTitleSplash'] then + -- if there's any ongoing title being displayed, hide it and cancel the waiting function + if hideTitleSplashWaitFunctionId then + Wait.stop(hideTitleSplashWaitFunctionId) + hideTitleSplashWaitFunctionId = nil + UI.setAttribute('title_splash', 'active', false) + end + + -- display scenario name and set a 4 seconds (2 seconds animation and 2 seconds on screen) + -- wait timer to hide the scenario name + UI.setValue('title_splash_text', scenarioName) + UI.show('title_splash') + hideTitleSplashWaitFunctionId = Wait.time(function() + UI.hide('title_splash') + hideTitleSplashWaitFunctionId = nil + end, 4) + + soundCubeApi.playSoundByName("Deep Bell") + end +end + +--------------------------------------------------------- +-- Update notification related functionality +--------------------------------------------------------- + +-- grabs the latest mod version and release notes from GitHub (called onLoad()) +function getModVersion() + WebRequest.get(SOURCE_REPO .. '/modversion.json', compareVersion) +end + +-- compares the modversion with GitHub and possibly shows the update notification +function compareVersion(request) + if request.is_error then + log(request.error) + return + end + + -- global variable to make it accessible for other functions + modMeta = JSON.decode(request.text) + + -- stop here if on latest or newer version + if convertVersionToNumber(MOD_VERSION) >= convertVersionToNumber(modMeta["latestVersion"]) then return end + + -- stop here if "don't show again" was clicked for this version before + if acknowledgedUpgradeVersions[modMeta["latestVersion"]] then return end + + updateNotificationLoading() + + -- delay to avoid lagging during onLoad() + Wait.time(function() UI.show("FinnIcon") end, 1) +end + +-- converts a version number to a string +---@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 +end + +-- updates the XML update notification based on the mod metadata +function updateNotificationLoading() + -- grab data + local highlights = modMeta["releaseHighlights"] + + -- concatenate the release highlights + local highlightText = "• " .. highlights[1] + for i, entry in pairs(highlights) do + if i ~= 1 then + highlightText = highlightText .. "\n• " .. entry + end + end + + -- update the XML UI + UI.setValue("notificationHeader", "New version available: " .. modMeta["latestVersion"]) + UI.setValue("releaseHighlightText", highlightText) + UI.setAttribute("highlightRow", "preferredHeight", 20*#highlights) + UI.setAttribute("updateNotification", "height", 20*#highlights + 125) +end + +-- close / don't show again buttons on the update notification +function onClick_notification(_, parameter) + if parameter == "dontShowAgain" then + -- this variable tracks if "don't show again" was pressed for a version + acknowledgedUpgradeVersions[modMeta["latestVersion"]] = true + end + UI.hide("FinnIcon") + UI.hide("updateNotification") + xmlVisibility["updateNotification"] = false +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("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") \ No newline at end of file diff --git a/unpacked.xml b/unpacked.xml index 9d7a8fa8e..c80a6b4cb 100644 --- a/unpacked.xml +++ b/unpacked.xml @@ -211,7 +211,7 @@ - + + + + + + + + + + Change background on setup + + + + @@ -716,7 +806,7 @@ - + Enable snap tags @@ -730,7 +820,7 @@ - + Show "Draw 1" button @@ -744,7 +834,7 @@ - + Use clickable clue counters @@ -757,13 +847,13 @@ - - + + Use clickable resource tokens - - + + @@ -774,6 +864,28 @@ + + + + + Remove a playermat + + + + + + + + + + + + + + + @@ -788,7 +900,7 @@ - + Attachment Helper @@ -802,7 +914,7 @@ - + Clean Up Helper @@ -816,7 +928,7 @@ - + CYOA Campaign Guides @@ -828,9 +940,9 @@ + tooltip="This allows moving all objects on the main play area in a chosen direction."> - + Displacement Tool @@ -844,7 +956,7 @@ - + Hand Helper @@ -858,7 +970,7 @@ - + Search Assistant diff --git a/unpacked.yaml b/unpacked.yaml index c867d62c5..bb6930ebc 100644 --- a/unpacked.yaml +++ b/unpacked.yaml @@ -10,7 +10,7 @@ CameraStates: z: 5.26 Rotation: x: 64.34 - y: 90.33 + y: 90 z: 0 Zoomed: false - AbsolutePosition: @@ -133,16 +133,16 @@ CustomUIAssets: URL: http://cloud-3.steamusercontent.com/ugc/2028355502896482829/8DAB311590B97586309E66D795AC2C43D4913188/ - Name: header_cover Type: 0 - URL: http://cloud-3.steamusercontent.com/ugc/5118935530977312342/0D22712378B1F9A5A1FC7DA40C355943C878DDC0/ + URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753624/53E7443E2A9957BC5CA4D73B67D5C1C30971C9F9/ - Name: header_acolyte Type: 0 - URL: http://cloud-3.steamusercontent.com/ugc/5118935530977311773/B8B2021D42CFB084AFDCCA42EE6B9A57F3E30AC6/ -- Name: header_ruins + URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753484/961371448C1CB9F93D574E0F78CF51A88D0D34F6/ +- Name: header_compass Type: 0 - URL: http://cloud-3.steamusercontent.com/ugc/5118935530977312917/E24A34736C912186C7AC58270E3819B6A44B3EE8/ + URL: http://cloud-3.steamusercontent.com/ugc/2280574378889786684/52E2A801060A523AF5DD956C72A41889B5A1D2C9/ - Name: header_olive Type: 0 - URL: http://cloud-3.steamusercontent.com/ugc/5118935530977377198/4E88B41107A29D027D86E6B80D47B03617335990/ + URL: http://cloud-3.steamusercontent.com/ugc/2280574378889753733/F67B7B37FF7AA253B6D697E577DF54A3E76030C2/ - Name: option_on Type: 0 URL: http://cloud-3.steamusercontent.com/ugc/2024962321889555728/22ABD35CBB49A001F3A5318E4AFCFB22D24FEA39/ @@ -206,6 +206,9 @@ CustomUIAssets: - Name: Inv-Jacqueline Type: 0 URL: https://i.imgur.com/AFuB9II.png +- Name: Inv-Kohaku + Type: 0 + URL: http://cloud-3.steamusercontent.com/ugc/2279451480492739312/E59E79D4CFCFE60190BFD69B7FFBF1601DA3FAA5/ - Name: TitleGradient Type: 0 URL: https://i.imgur.com/Mdjm349.png @@ -221,7 +224,7 @@ CustomUIAssets: - Name: box-cover-mask-wide Type: 0 URL: http://cloud-3.steamusercontent.com/ugc/2115061298538827369/A20C2ECB8ECDC1B0AD8B2B38F68CA1C1F5E07D37/ -Date: Sat Nov 18 18:06:45 CST 2023 +Date: Thu Jan 25 01:22:12 UTC 2024 DecalPallet: - ImageURL: http://cloud-3.steamusercontent.com/ugc/1474319121424323663/BC5570ECF747F1B30224461B576E8B0FE7FA5F33/ Name: Achivement Checkmark @@ -230,7 +233,7 @@ DecalPallet: Name: Victory Display Size: 15 Decals: [] -EpochTime: 1700352405 +EpochTime: 1706145732 GameComplexity: '' GameMode: Arkham Horror LCG - Super Complete Edition GameType: '' @@ -281,7 +284,7 @@ Lighting: LutIndex: 0 ReflectionIntensity: 1 LuaScript: !include 'unpacked.ttslua' -LuaScriptState: '{"acknowledgedUpgradeVersions":[],"optionPanel":{"cardLanguage":"en","playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showSearchAssistant":[],"showTitleSplash":true,"useClueClickers":false,"useResourceCounters":"disabled","useSnapTags":true}}' +LuaScriptState: '{"acknowledgedUpgradeVersions":[],"chaosTokensGUID":[],"optionPanel":{"cardLanguage":"en","changePlayAreaImage":false,"playAreaConnectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"playAreaConnections":true,"playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showSearchAssistant":[],"showTitleSplash":true,"useClueClickers":false,"useResourceCounters":"disabled","useSnapTags":true}}' MusicPlayer: AudioLibrary: - Item1: http://cloud-3.steamusercontent.com/ugc/784110538847453001/4481D1CC5684FCF04AB143954DEFE09E94BF5CEB/ @@ -359,7 +362,7 @@ ObjectStates: - !include 'unpacked/Custom_Model Decoration - Coin 180a23.yaml' - !include 'unpacked/Custom_Tile Panel 463022.yaml' - !include 'unpacked/Custom_Token TentacleStand 7bff34.yaml' -- !include 'unpacked/ScriptingTrigger 83ef06.yaml' +- !include 'unpacked/ScriptingTrigger ChaosBagZone 83ef06.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Clue tokens 11e0cf.yaml' - !include 'unpacked/Custom_Model_Infinite_Bag Doom tokens b015d8.yaml' - !include 'unpacked/Custom_Token Doom Counter 85c4c6.yaml' @@ -422,10 +425,9 @@ ObjectStates: - !include 'unpacked/Custom_Token Master Clue Counter 4a3aa4.yaml' - !include 'unpacked/Custom_Model_Bag Legacy Assets 7165a9.yaml' - !include 'unpacked/Custom_Token Play Area 721ba2.yaml' +- !include 'unpacked/Bag Additional Player Cards 2cba6b.yaml' - !include 'unpacked/Custom_Assetbundle_Bag Barkham Horror 308439.yaml' - !include 'unpacked/Custom_Token Chaos Bag Stat Tracker 766620.yaml' -- !include 'unpacked/Custom_Model_Bag Bless tokens afa06b.yaml' -- !include 'unpacked/Custom_Model_Bag Curse tokens bd0253.yaml' - !include 'unpacked/Checker_white Token Spawn Tool 36b4ee.yaml' - !include 'unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml' - !include 'unpacked/Deck Tarot Deck 77f1e5.yaml' @@ -491,6 +493,7 @@ ObjectStates: - !include 'unpacked/Bag Token Source 124381.yaml' - !include 'unpacked/FogOfWarTrigger Game Data 3dbe47.yaml' - !include 'unpacked/Custom_Token SCED Tour 0e5aa8.yaml' +- !include 'unpacked/Custom_Token Instruction Generator 240522.yaml' - !include 'unpacked/Custom_Tile Player Cards 2d30ee.yaml' - !include 'unpacked/Custom_Tile Token Remover 39b175.yaml' - !include 'unpacked/Custom_Tile Token Remover 2ba7a5.yaml' @@ -521,7 +524,27 @@ ObjectStates: - !include 'unpacked/Custom_Token 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/Notecard Arkham SCE 3.4.0 - 11182023 - Page 1 964222.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' +- !include 'unpacked/Custom_Tile Tokencache_-2 8af600.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-3 a7a9cb.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-4 984eec.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-5 1df0a5.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-6 2460df.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-7 81a1d7.yaml' +- !include 'unpacked/Custom_Tile Tokencache_-8 298b5f.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Skull cc8bbb.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Cultist 7d6103.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Tablet 1a1506.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Elder Thing 38609c.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Auto-fail e31821.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Elder Sign 0b1aca.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Bless 8e3aab.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml' +- !include 'unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml' +- !include 'unpacked/BlockSquare Physics Detector b300d8.yaml' +- !include 'unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml' PlayArea: 1 PlayerCounts: - 0 @@ -529,7 +552,7 @@ PlayerCounts: PlayingTime: - 0 - 0 -SaveName: Arkham SCE - 3.4.0 +SaveName: Arkham SCE - 3.5.0 Sky: Sky_Museum SkyURL: https://i.imgur.com/GkQqaOF.jpg SnapPoints: @@ -718,9 +741,9 @@ SnapPoints: y: 1.48 z: -71 - Position: - x: 1.6 - y: 1.58 - z: -13.75 + x: -28.64 + y: 1.48 + z: -38.65 Rotation: x: 0 y: 315 @@ -741,6 +764,14 @@ SnapPoints: x: -27 y: 1.48 z: -56.16 +- Position: + x: 1.6 + y: 1.58 + z: -13.75 + Rotation: + x: 0 + y: 315 + z: 0 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 new file mode 100644 index 000000000..cb64768cf --- /dev/null +++ b/unpacked/Bag Additional Player Cards 2cba6b.ttslua @@ -0,0 +1,182 @@ +-- 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/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) +__bundle_register("arkhamdb/HotfixBag", function(require, _LOADED, __bundle_register, __bundle_modules) +-- A Hotfix bag contains replacement cards for the All Cards Bag, and should +-- have the 'AllCardsHotfix' tag on the object. Code for the All Cards Bag will +-- find these bags during indexing, and use them to replace cards from the +-- actual bag. + +-- Tells the All Cards Bag to recreate its indexes. The All Cards Bag may +-- ignore this request; see the rebuildIndexForHotfix() method in the All Cards +-- Bag for details. + +local allCardsBagApi = require("playercards/AllCardsBagApi") + +function onLoad() + allCardsBagApi.rebuildIndexForHotfix() + self.addContextMenuItem("Update card index", function() allCardsBagApi.rebuildIndexForHotfix() 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) +return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Bag Additional Player Cards 2cba6b.yaml b/unpacked/Bag Additional Player Cards 2cba6b.yaml new file mode 100644 index 000000000..25d6b2aff --- /dev/null +++ b/unpacked/Bag Additional Player Cards 2cba6b.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +Bag: + Order: 0 +ColorDiffuse: + b: 0 + g: 0.36652 + r: 0.70588 +Description: 'Put any cards in here to add them to the indices for the player card + panel and deck importer. + + + Select the ''update index'' entry in the context menu of this bag once you''ve added + all cards. + + + This can be used for custom cards too.' +DragSelectable: true +GMNotes: '' +GUID: 2cba6b +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: !include 'Bag Additional Player Cards 2cba6b.ttslua' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Bag +Nickname: Additional Player Cards +Number: 0 +Snap: true +Sticky: true +Tags: +- AllCardsHotfix +Tooltip: true +Transform: + posX: 60 + posY: 1.2 + posZ: 48 + rotX: 0 + rotY: 0 + rotZ: 0 + scaleX: 1.5 + scaleY: 1.5 + scaleZ: 1.5 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07.ttslua b/unpacked/Bag All Player Cards 15bb07.ttslua index 5964e108c..7468598d7 100644 --- a/unpacked/Bag All Player Cards 15bb07.ttslua +++ b/unpacked/Bag All Player Cards 15bb07.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/AllCardsBag") +end) __bundle_register("playercards/AllCardsBag", function(require, _LOADED, __bundle_register, __bundle_modules) local cardIdIndex = { } local classAndLevelIndex = { } @@ -116,6 +119,7 @@ end -- yielding. Based on the current count of cards this will require -- approximately 60 frames to complete. function buildIndex() + local cardCount = 0 indexingDone = false if (self.getData().ContainedObjects == nil) then return 1 @@ -124,18 +128,39 @@ function buildIndex() local cardMetadata = JSON.decode(cardData.GMNotes) if (cardMetadata ~= nil) then addCardToIndex(cardData, cardMetadata) - end - if (i % 20 == 0) then - coroutine.yield(0) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end end end local hotfixBags = getObjectsWithTag("AllCardsHotfix") for _, hotfixBag in ipairs(hotfixBags) do if (#hotfixBag.getObjects() > 0) then for i, cardData in ipairs(hotfixBag.getData().ContainedObjects) do - local cardMetadata = JSON.decode(cardData.GMNotes) - if (cardMetadata ~= nil) then - addCardToIndex(cardData, cardMetadata) + if cardData.ContainedObjects then + for j, deepCardData in ipairs(cardData.ContainedObjects) do + local deepCardMetadata = JSON.decode(deepCardData.GMNotes) + if deepCardMetadata ~= nil then + addCardToIndex(deepCardData, deepCardMetadata) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end + end + end + else + local cardMetadata = JSON.decode(cardData.GMNotes) + if cardMetadata ~= nil then + addCardToIndex(cardData, cardMetadata) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end + end end end end @@ -146,9 +171,13 @@ 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: TTS object data for the card +---@param cardMetadata: 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 + cardMetadata.id = cardMetadata.TtsZoopGuid + end cardIdIndex[cardMetadata.id] = { data = cardData, metadata = cardMetadata } if (cardMetadata.alternate_ids ~= nil) then for _, alternateId in ipairs(cardMetadata.alternate_ids) do @@ -397,7 +426,4 @@ 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 a69ae36a7..11226230d 100644 --- a/unpacked/Bag All Player Cards 15bb07.yaml +++ b/unpacked/Bag All Player Cards 15bb07.yaml @@ -19,19 +19,53 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/Card Charlie Kane 4deeff.yaml' - !include 'Bag All Player Cards 15bb07/Card Finn Edwards dd40c0.yaml' - !include 'Bag All Player Cards 15bb07/Card Monterey Jack 46b145.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) + 46b147.yaml' - !include 'Bag All Player Cards 15bb07/Card If it bleeds... acf2b0.yaml' - !include 'Bag All Player Cards 15bb07/Card Beat Cop (2) 7001be.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml' +- !include "Bag All Player Cards 15bb07/CardCustom K\u014Dhaku Narukami cea427.yaml" +- !include "Bag All Player Cards 15bb07/CardCustom K\u014Dhaku Narukami 54eaa7.yaml" - !include 'Bag All Player Cards 15bb07/CardCustom Ad Hoc c9fb2f.yaml' - !include 'Bag All Player Cards 15bb07/Card Hasty Repairs 0821d5.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Wilson Richards ceb426.yaml' -- !include 'Bag All Player Cards 15bb07/CardCustom Wilson Richards 54eab5.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Flux Stabilizer 55990a.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2323.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml' +- !include 'Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml' - !include 'Bag All Player Cards 15bb07/Card Hard Times 876557.yaml' - !include 'Bag All Player Cards 15bb07/Card Pete''s Guitar 876557.yaml' - !include 'Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Front) 5294c3.yaml' - !include 'Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel Back) 5294c3.yaml' - !include 'Bag All Player Cards 15bb07/Card Ashcan Pete (Parallel) 5294c3.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Eldritch Tongue e8765a.yaml' +- !include 'Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml' +- !include 'Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom False Surrender adf28e.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom The Necronomicon 5b2e10.yaml' - !include 'Bag All Player Cards 15bb07/Card Roland''s .38 Special 4edb91.yaml' - !include 'Bag All Player Cards 15bb07/Card Stubborn Detective 4ea68b.yaml' @@ -748,7 +782,7 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/Card Waveworn Idol 591284.yaml' - !include 'Bag All Player Cards 15bb07/Card Take Heart cc6e4d.yaml' - !include 'Bag All Player Cards 15bb07/Card Olive McBride 9683d0.yaml' -- !include 'Bag All Player Cards 15bb07/Card Olive McBride 9683d2.yaml' +- !include 'Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml' - !include 'Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml' - !include 'Bag All Player Cards 15bb07/Card Harmony Restored (2) 7885cf.yaml' - !include 'Bag All Player Cards 15bb07/Card Glory 273584.yaml' @@ -1050,6 +1084,7 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/Card Discipline 3247da.yaml' - !include 'Bag All Player Cards 15bb07/Card Shrewd Dealings c70129.yaml' - !include 'Bag All Player Cards 15bb07/Card Buried Secrets 28080d.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml' - !include 'Bag All Player Cards 15bb07/Card Mechanic''s Wrench 598ba0.yaml' - !include 'Bag All Player Cards 15bb07/Card Fend Off (3) 0c2449.yaml' - !include 'Bag All Player Cards 15bb07/Card Join the Caravan (1) 6367dd.yaml' @@ -1197,6 +1232,7 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/Card Tidal Memento b4f9ee.yaml' - !include 'Bag All Player Cards 15bb07/Card Jacob Morrison (3) aa38d0.yaml' - !include 'Bag All Player Cards 15bb07/Card Trusty Bullwhip ca9a60.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml' - !include 'Bag All Player Cards 15bb07/Card Mob Goons fc1506.yaml' - !include 'Bag All Player Cards 15bb07/Card Guard Dog 001ae8.yaml' - !include 'Bag All Player Cards 15bb07/Card First Aid (3) 3c7eb1.yaml' @@ -1581,20 +1617,38 @@ ContainedObjects: - !include 'Bag All Player Cards 15bb07/Card Final Rhapsody 561775.yaml' - !include 'Bag All Player Cards 15bb07/Card Jim Culver (Parallel Back) aba863.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom The Beyond 37ab47.yaml' -- !include 'Bag All Player Cards 15bb07/CardCustom Devil 2a0ba5.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi cea425.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Alessandra Zorzi 54eaa5.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Zamacona 541ba9.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Beguile 019526.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Ofuda 860c1e.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom I''ll Pay You Back! 40e1ca.yaml' -- !include 'Bag All Player Cards 15bb07/CardCustom Occult Reliquary acd0c2.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Grift df75d7.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cc.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hank Samson (Assistant) 3764ce.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hank Samson (Warden) 3764cf.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml' +- !include 'Bag All Player Cards 15bb07/Card Where''s Pa 9aba43.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml' +- !include 'Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Control Variable 133868.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Blackmail File de456d.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Speak to the Dead c763aa.yaml' - !include 'Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml' +- !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' 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 d67aa1528..283877009 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60522\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 3,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60522\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\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\": \"Investigator Packs\"\n}" GUID: f8a977 Grid: true GridProjection: false 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 ec946c29e..9021da764 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60505\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60505\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 2,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 101a41 Grid: true GridProjection: false 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 64eea2c98..632046453 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07305\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 4,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07305\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 4425b5 Grid: true GridProjection: false 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 bbb05bf27..45a2faa44 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07025\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07025\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: a5087b Grid: true GridProjection: false 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 2712526a8..b30e8e180 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52001\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return - to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52001\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 6,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Return to the Path to Carcosa\"\n}" GUID: c026c9 Grid: true GridProjection: false 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 3a8cfa07e..1b53be2a6 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03020\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03020\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 6,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: b0f851 Grid: true GridProjection: false 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 9eac0385d..bf2bbe39f 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06195\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06195\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: c32e40 Grid: true GridProjection: false 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 65b6f4e6f..2288cfc29 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 @@ -19,12 +19,12 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03234\",\r\n \"alternate_ids\": [\r\n \"01688\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 3,\r\n - \ \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03234\",\n \"alternate_ids\": [\n \"01688\"\n ],\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 Path to + Carcosa\"\n}" GUID: f57af7 Grid: true GridProjection: false 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 236a57ff6..2d611f4d4 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01047\",\r\n \"alternate_ids\": [\r\n \"01547\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n \"combatIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Ammo\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01047\",\n \"alternate_ids\": [\n \"01547\"\n ],\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 + \ \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: fe2db3 Grid: true GridProjection: false 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 bc879b3f9..039d5540d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03190\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 4,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03190\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: fe0cc0 Grid: true GridProjection: false 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 e732bbba7..fe4de87e7 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01016\",\r\n \"alternate_ids\": [\r\n \"01516\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 4,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Ammo\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01016\",\n \"alternate_ids\": [\n \"01516\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Guardian\",\n \"cost\": 4,\n + \ \"level\": 0,\n \"traits\": \"Item. Weapon. Firearm.\",\n \"agilityIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: 12660b Grid: true GridProjection: false 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 0b245b73e..d06aa73f8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Guardian DragSelectable: true -GMNotes: "{\r\n \"id\": \"05186\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 6,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05186\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 6,\n \"level\": 3,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: b492cb Grid: true GridProjection: false 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 0457ca083..05519da94 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Rogue DragSelectable: true -GMNotes: "{\r\n \"id\": \"05187\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 5,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 5,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05187\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Rogue\",\n \"cost\": 5,\n \"level\": 3,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: d4dbc7 Grid: true GridProjection: false 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 63c3c66dc..053deb11d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05115\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Rogue\",\r\n - \ \"cost\": 6,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05115\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian|Rogue\",\n \"cost\": 6,\n \"level\": 0,\n \"traits\": + \"Item. Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: 2c6509 Grid: true GridProjection: false 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 62ebf10c4..76cedead8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08048\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Fortune. Gambit.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08048\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Fortune. Gambit.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 5210c2 Grid: true GridProjection: false 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 299b617af..40b0ee5b7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03238\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03238\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Fortune.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 0edef1 Grid: true GridProjection: false 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 7a8ee1152..5bfe01079 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02270\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02270\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Fortune.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 3f3488 Grid: true GridProjection: false 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 cc4a8d1c6..e30ef6c4f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06245\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Blessed. Fortune.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06245\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Blessed. Fortune.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: f21109 Grid: true GridProjection: false 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 d6477fca1..caa0ce63a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03156\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03156\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 4cfcc7 Grid: true GridProjection: false 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 f7e87570b..fd33ac1c4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60523\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60523\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 71a760 Grid: true GridProjection: false 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 e95d4e7f9..2f87b3d7c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60513\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60513\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 48e516 Grid: true GridProjection: false 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 2f9260616..75241b83d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07269\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Spirit. Blessed.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07269\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Spirit. Blessed.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: '176836' Grid: true GridProjection: false 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 dcb4831d2..90f6b3e60 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01515\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01515\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Core\"\n}" GUID: 35a7e9 Grid: true GridProjection: false 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 689cbb0df..96dcf7be9 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Core\"\n}" GUID: 79b4af Grid: true GridProjection: false 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 624041de2..0089876ae 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90040\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 89fe92 Grid: true GridProjection: false 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 0b7e9c965..1c66da840 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Ally. Believer. DragSelectable: true -GMNotes: "{\r\n \"id\": \"82022\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Believer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"82022\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Believer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: a4b514 Grid: true GridProjection: false 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 17dba8a3a..dd81521a0 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Library Intern DragSelectable: true -GMNotes: "{\r\n \"id\": \"06324\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06324\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Ally. + Miskatonic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: 97e9ce Grid: true GridProjection: false 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 ca03aca5a..7dac27a3e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05038\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05038\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: '051742' Grid: true GridProjection: false 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 66cbf64cf..290e40959 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07159\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07159\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: a2d392 Grid: true GridProjection: false 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 175d4ab37..4954a3c94 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"04041\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04041\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 85e7d9 Grid: true GridProjection: false 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 fbbc52609..2b74907f1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07038\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Cultist. Cursed.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07038\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Cultist. Cursed.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: ef91a9 Grid: true GridProjection: false 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 49dd99499..a4bb33fe7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02266\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Trick.\",\r\n \"cycle\": \"The - Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02266\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 074858 Grid: true GridProjection: false 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 8b7ea98c6..b2e176b1a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Fateful Step DragSelectable: true -GMNotes: "{\r\n \"id\": \"05040\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05040\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: 52a677 Grid: true GridProjection: false 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 6f1fa0d28..0d1aec508 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Let Your Arrow Fly True DragSelectable: true -GMNotes: "{\r\n \"id\": \"05023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05023\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: c4d436 Grid: true GridProjection: false 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 0937dbbb7..67b953529 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Madness. DragSelectable: true -GMNotes: "{\r\n \"id\": \"02178\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"cost\": 0,\r\n \"traits\": \"Madness.\",\r\n \"weakness\": - true,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02178\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: fb943f Grid: true GridProjection: false 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 ff80cf7c9..ebf1bc3a4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05037\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Gambit.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05037\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Tactic. Gambit.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 0bea17 Grid: true GridProjection: false 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 af24350ca..6cce4b6e4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02110\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02110\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 731d2a Grid: true GridProjection: false 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 90cf38cfd..c0e7890d1 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04202\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04202\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten + Age\"\n}" GUID: c077bf Grid: true GridProjection: false 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 c1c09ec46..ecc0d34ea 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05274\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 7,\r\n \"level\": 5,\r\n \"traits\": \"Ally. Agency.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05274\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 7,\n \"level\": 5,\n \"traits\": \"Ally. + Agency.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"combatIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d6eda3 Grid: true GridProjection: false 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 e9674a79b..b45136859 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Foundation Researcher DragSelectable: true -GMNotes: "{\r\n \"id\": \"09763\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Agency. Detective.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09763\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Agency. Detective.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: d61c6a Grid: true GridProjection: false 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 541fce635..f63390f6e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09010\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Coterie. Detective.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09010\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Coterie. Detective.\",\n \"weakness\": true,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 95b0cf Grid: true GridProjection: false 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 3c3d85e2c..6c2206155 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Waitress DragSelectable: true -GMNotes: "{\r\n \"id\": \"01004-pb\",\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" +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}" 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 cec37d2d2..d73fece71 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Waitress DragSelectable: true -GMNotes: "{\r\n \"id\": \"01004-pf\",\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" +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}" 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 7113b5bad..6b8d71a71 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Waitress DragSelectable: true -GMNotes: "{\r\n \"id\": \"01004-p\",\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" +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}" 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 bf3353015..0933319ec 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Waitress DragSelectable: true -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" +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}" GUID: 25e2db Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker e53693.yaml b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker e53693.yaml index 0c0ef5696..f36d3d1db 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker e53693.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Agnes Baker e53693.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01004-m\",\r\n \"alternate_ids\": [\r\n \"01504-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"01004-m\",\n \"alternate_ids\": [\n \"01504-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: e53693 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 7b61e5914..f64b8f86f 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Shaman DragSelectable: true -GMNotes: "{\r\n \"id\": \"03004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Sorcerer.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" 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 f790b50b0..30e874456 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 @@ -19,29 +19,28 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09040\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Science.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"customizations\": [\r\n {\r\n - \ \"name\": \"Mending Distillate\",\r\n \"xp\": 1,\r\n \"text\": \"Add - this option: \u201C\u27D0 Heal 2 damage.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Calming Distillate\",\r\n \"xp\": 1,\r\n \"text\": \"Add this option: - \u201C\u27D0 Heal 2 horror.\u201D\"\r\n },\r\n {\r\n \"name\": \"Enlightening - Distillate\",\r\n \"xp\": 1,\r\n \"text\": \"Add this option: \u201C\u27D0 - Place 1 charge or secret on an asset you control.\u201D\"\r\n },\r\n {\r\n - \ \"name\": \"Quickening Distillate\",\r\n \"xp\": 1,\r\n \"text\": - \"Add this option: \u201C\u27D0 Move up to 2 times.\u201D\"\r\n },\r\n {\r\n - \ \"name\": \"Refined\",\r\n \"xp\": 2,\r\n \"text\": \"Alchemical - Distillation enters play with 2 additional supplies on it.\",\r\n \"replaces\": - {\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ]\r\n - \ }\r\n },\r\n {\r\n \"name\": \"Empowered\",\r\n \"xp\": 4,\r\n - \ \"text\": \"When you initiate this skill test, you may increase its difficulty +GMNotes: "{\n \"id\": \"09040\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Science.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"customizations\": + [\n {\n \"name\": \"Mending Distillate\",\n \"xp\": 1,\n \"text\": + \"Add this option: \u201C\u27D0 Heal 2 damage.\u201D\"\n },\n {\n \"name\": + \"Calming Distillate\",\n \"xp\": 1,\n \"text\": \"Add this option: \u201C\u27D0 + Heal 2 horror.\u201D\"\n },\n {\n \"name\": \"Enlightening Distillate\",\n + \ \"xp\": 1,\n \"text\": \"Add this option: \u201C\u27D0 Place 1 charge + or secret on an asset you control.\u201D\"\n },\n {\n \"name\": \"Quickening + Distillate\",\n \"xp\": 1,\n \"text\": \"Add this option: \u201C\u27D0 + Move up to 2 times.\u201D\"\n },\n {\n \"name\": \"Refined\",\n \"xp\": + 2,\n \"text\": \"Alchemical Distillation enters play with 2 additional supplies + on it.\",\n \"replaces\": {\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n + \ ]\n }\n },\n {\n \"name\": \"Empowered\",\n \"xp\": + 4,\n \"text\": \"When you initiate this skill test, you may increase its difficulty by 2. If you do, increase the value of the effect granted by each option by 1 for - this test.\"\r\n },\r\n {\r\n \"name\": \"Perfected\",\r\n \"xp\": - 5,\r\n \"text\": \"If you succeed by 2 or more, the chosen investigator may - perform two different options instead of one.\"\r\n }\r\n ],\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" + this test.\"\n },\n {\n \"name\": \"Perfected\",\n \"xp\": 5,\n + \ \"text\": \"If you succeed by 2 or more, the chosen investigator may perform + two different options instead of one.\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 502a4d Grid: true GridProjection: false 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 83a2b3d7e..75c322719 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52007\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Return to the Path to Carcosa\"\n}" GUID: 283e54 Grid: true GridProjection: false 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 a3d863e09..c04e8f3b5 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03032\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Path + to Carcosa\"\n}" GUID: 54832d Grid: true GridProjection: false 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 061e58397..dc5dbf517 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Renowned Historian DragSelectable: true -GMNotes: "{\r\n \"id\": \"04051\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04051\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Wayfarer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: c49b4b Grid: true GridProjection: false 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 d89a1a4f5..e34e6174e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Fearless Flatfoot DragSelectable: true -GMNotes: "{\r\n \"id\": \"05151\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Detective. Police.\",\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05151\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Detective. Police.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: ae20e0 Grid: true GridProjection: false 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 3a7d18f41..fc8f83672 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04309\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 5,\r\n \"traits\": \"Fortune.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04309\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 5,\n \"traits\": \"Fortune.\",\n \"wildIcons\": 2,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 7d3a27 Grid: true GridProjection: false 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 691a0f087..f5d0bfd24 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53009\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53009\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Spell. Blessed.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 9e4e11 Grid: true GridProjection: false 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 550386cbf..83f0ef045 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04313\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04313\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Spell. Blessed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 83c86b Grid: true GridProjection: false 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 b0ae4d668..baaa5caa2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Speaker to the Dead DragSelectable: true -GMNotes: "{\r\n \"id\": \"02232\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02232\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Sorcerer.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 53867b Grid: true GridProjection: false 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 288a5d279..8574e641f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Student DragSelectable: true -GMNotes: "{\r\n \"id\": \"07002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Miskatonic. Scholar.\",\r\n \"willpowerIcons\": - 2,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +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}" 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 21a13dc99..4231c2c93 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03148\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03148\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: a1fd61 Grid: true GridProjection: false 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 fd0bdd310..abb7a3ab8 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Operator DragSelectable: true -GMNotes: "{\r\n \"id\": \"09011\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Chosen. Cursed.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 3,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +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}" 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 108142af1..83a0cb977 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Amnesia 2210c1.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01096\",\r\n \"alternate_ids\": [\r\n \"01596\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01096\",\n \"alternate_ids\": [\n \"01596\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Madness.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 2,\n \"cycle\": \"Core\"\n}" GUID: 2210c1 Grid: true GridProjection: false 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 61c25bd66..615f17a40 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Analysis 80285f.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09049\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09049\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 80285f Grid: true GridProjection: false 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 99d535e4d..306caa016 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Talent.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03010\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Talent.\",\n \"wildIcons\": 2,\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 7b6ab5 Grid: true GridProjection: false 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 35bf827e4..15a8f27bf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03108\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03108\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: a8e495 Grid: true GridProjection: false 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 aef7e0b2e..39ebc35be 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07303\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07303\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 7b7d14 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml index 7c951870a..9a5650cd3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ancient Ankh 0ce113.yaml @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: true Description: Item. Relic. DragSelectable: true -GMNotes: "{\r\n \"id\": \"83056\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 4,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n - \ ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"83056\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: 0ce113 Grid: true GridProjection: false 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 493ef5d8a..7347e6510 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 @@ -20,8 +20,8 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: "{\n \"id\": \"07122-t\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n - \ \"level\": 2,\n \"traits\": \"Covenant. Blessed.\",\n \"permanent\": true,\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Blessed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e01cc7 Grid: true GridProjection: false 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 85388ac81..6ac2669c1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Unidentified DragSelectable: true -GMNotes: "{\r\n \"id\": \"04022\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04022\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 9bc46e Grid: true GridProjection: false 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 c73419b5a..2757fd883 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Transient Thoughts DragSelectable: true -GMNotes: "{\n \"id\": \"53004\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. Relic.\",\n \"agilityIcons\": - 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"Return to the Forgotten Age\"\n}" +GMNotes: "{\n \"id\": \"53004\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"agilityIcons\": 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Return to + the Forgotten Age\"\n}" GUID: 3289b0 Grid: true GridProjection: false 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 58e3b2801..e889d7187 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Knowledge of the Elders DragSelectable: true -GMNotes: "{\n \"id\": \"04230\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. Relic.\",\n \"intellectIcons\": - 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" +GMNotes: "{\n \"id\": \"04230\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 0,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 863f91 Grid: true GridProjection: false 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 c0b310012..e67b4005e 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Minds in Harmony DragSelectable: true -GMNotes: "{\n \"id\": \"04231\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": - 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" +GMNotes: "{\n \"id\": \"04231\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 2,\n \"uses\": [\n {\n \"count\": 0,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 9c56d3 Grid: true GridProjection: false 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 79c07eef3..329762d5b 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: d8705c Grid: true GridProjection: false 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 4d2acbb0a..ad8901051 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Mysterious Soothsayer DragSelectable: true -GMNotes: "{\r\n \"id\": \"05283\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Ally. Clairvoyant.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05283\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Ally. + Clairvoyant.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 03a4de Grid: true GridProjection: false 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 a54486dff..2e57ff183 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05278\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05278\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 006d44 Grid: true GridProjection: false 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 9df30264b..e224a82b3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08124\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue|Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08124\",\n \"type\": \"Asset\",\n \"class\": \"Seeker|Rogue|Mystic\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"wildIcons\": 1,\n + \ \"uses\": [\n {\n \"count\": 2,\n \"replenish\": 2,\n \"type\": + \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 452db2 Grid: true GridProjection: false 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 1de74aaca..27826ef89 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60302\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 6,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60302\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 6,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 2c563c Grid: true GridProjection: false 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 73a5e8fc4..300c76cb0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Anyu 1bf025.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Faithful Companion DragSelectable: true -GMNotes: "{\r\n \"id\": \"08738\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Creature.\",\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08738\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Creature.\",\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 1bf025 Grid: true GridProjection: false 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 0c78c26e0..de220d14f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: The Forgotten Daughter DragSelectable: true -GMNotes: "{\r\n \"id\": \"01082\",\r\n \"alternate_ids\": [\r\n \"01582\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 5,\r\n - \ \"level\": 1,\r\n \"traits\": \"Ally.\",\r\n \"willpowerIcons\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01082\",\n \"alternate_ids\": [\n \"01582\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Survivor\",\n \"cost\": 5,\n + \ \"level\": 1,\n \"traits\": \"Ally.\",\n \"willpowerIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 9393ec Grid: true GridProjection: false 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 59e7b0c37..ce508beb3 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: The Forgotten Daughter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02308\",\r\n \"alternate_ids\": [\r\n \"01691\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 4,\r\n - \ \"level\": 3,\r\n \"traits\": \"Ally.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02308\",\n \"alternate_ids\": [\n \"01691\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Survivor\",\n \"cost\": 4,\n + \ \"level\": 3,\n \"traits\": \"Ally.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: fb9dbb Grid: true GridProjection: false 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 523fc8e95..d5ef125c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60402\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60402\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 3,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 4fbdb2 Grid: true GridProjection: false 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 cc7b63dc9..db0ada6db 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60205\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60205\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: e69708 Grid: true GridProjection: false 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 ae46ed83d..ba3261f4f 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 @@ -19,12 +19,12 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03271\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 1,\r\n - \ \"type\": \"Doom\",\r\n \"token\": \"doom\"\r\n },\r\n {\r\n \"count\": - 2,\r\n \"type\": \"Horror\",\r\n \"token\": \"horror\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03271\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Ally. + Sorcerer.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 1,\n \"type\": \"Doom\",\n \"token\": \"doom\"\n },\n + \ {\n \"count\": 2,\n \"type\": \"Horror\",\n \"token\": \"horror\"\n + \ }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 65b30d Grid: true GridProjection: false 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 4ce92671c..b7f5cc190 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01063\",\r\n \"alternate_ids\": [\r\n \"01563\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 1,\r\n \"type\": \"Doom\",\r\n \"token\": - \"doom\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01063\",\n \"alternate_ids\": [\n \"01563\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": + 0,\n \"traits\": \"Ally. Sorcerer.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n + \ {\n \"count\": 1,\n \"type\": \"Doom\",\n \"token\": \"doom\"\n + \ }\n ],\n \"cycle\": \"Core\"\n}" GUID: 7307c4 Grid: true GridProjection: false 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 f029283ea..d0aaaf60c 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03266\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03266\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 536b52 Grid: true GridProjection: false 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 31f546e43..935d87f1e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04109\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04109\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: e425d0 Grid: true GridProjection: false 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 b4f1d9e22..a88eb68a3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50007\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"intellectIcons\": 2,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: 644af9 Grid: true GridProjection: false 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 0f031d54e..9142deb07 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60428\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"intellectIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"replenish\": 2,\r\n \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60428\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": + 2,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: ca23d4 Grid: true GridProjection: false 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 f8b62fb5c..92fd24618 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01062\",\r\n \"alternate_ids\": [\r\n \"01562\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01062\",\n \"alternate_ids\": [\n \"01562\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Talent.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 9e4505 Grid: true GridProjection: false 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 18ca31d22..c49d875b4 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Prophecy Foretold DragSelectable: true -GMNotes: "{\r\n \"id\": \"03193\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03193\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 3d35aa Grid: true GridProjection: false 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 ba98e3f1f..d8056d03d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Markings of Isis DragSelectable: true -GMNotes: "{\r\n \"id\": \"52004\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52004\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Return to the Path to Carcosa\"\n}" GUID: 66d5a3 Grid: true GridProjection: false 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 e5ec0af81..deb59579b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Guiding Stones DragSelectable: true -GMNotes: "{\r\n \"id\": \"03192\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03192\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: a14a11 Grid: true GridProjection: false 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 2212c5500..21152195a 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Untranslated DragSelectable: true -GMNotes: "{\n \"id\": \"03025\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Item. Occult. Tome.\",\n \"intellectIcons\": - 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" +GMNotes: "{\n \"id\": \"03025\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Item. + Occult. Tome.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: cbfc12 Grid: true GridProjection: false 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 12c469dde..c0325e004 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Gateway to Paradise DragSelectable: true -GMNotes: "{\r\n \"id\": \"08044\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Leyline\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08044\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Leyline\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 098132 Grid: true GridProjection: false 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 fe1bc2241..0eaf2bc7b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Gateway to Tindalos DragSelectable: true -GMNotes: "{\r\n \"id\": \"08041\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"combatIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Leyline\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08041\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"combatIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Leyline\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 1fdf4c Grid: true GridProjection: false 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 56abca4b4..990b02378 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Gateway to Aldebaran DragSelectable: true -GMNotes: "{\r\n \"id\": \"08043\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"agilityIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Leyline\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08043\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"agilityIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Leyline\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 4b1b99 Grid: true GridProjection: false 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 b619a7edf..352ec528c 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Gateway to Acheron DragSelectable: true -GMNotes: "{\r\n \"id\": \"08042\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"intellectIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Leyline\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08042\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"intellectIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Leyline\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 88ff66 Grid: true GridProjection: false 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 ee8c3cbed..414e43508 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Unidentified DragSelectable: true -GMNotes: "{\n \"id\": \"08033\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tome. Occult.\",\n \"wildIcons\": - 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Leyline\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" +GMNotes: "{\n \"id\": \"08033\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Occult.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n + \ \"type\": \"Leyline\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 8023f5 Grid: true GridProjection: false 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 88e03de63..7e4afa28c 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07304\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Ritual.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07304\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Ritual.\",\n + \ \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 27f6aa Grid: true GridProjection: false 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 fb80967f6..db4664cf0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08130\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Injury.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08130\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 8f1420 Grid: true GridProjection: false 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 92d6f2dc3..449bbceee 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07226\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07226\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Spell. + Cursed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 32e5a4 Grid: true GridProjection: false 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 6a553edf4..9aa3cd5d9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Armageddon 3feff1.yaml @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"combatIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07117\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Spell. + Cursed.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 3feff1 Grid: true GridProjection: false 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 b110b9d83..18a882463 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03305\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Item. Armor. Relic.\",\r\n - \ \"willpowerIcons\": 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"The Path to - Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03305\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Item. + Armor. Relic.\",\n \"willpowerIcons\": 2,\n \"combatIcons\": 2,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: f7a9ab Grid: true GridProjection: false 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 c13356a93..f7c35a2a0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Arrogance b2e5b0.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60303\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"wildIcons\": 1,\r\n \"negativeIcons\": - true,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60303\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"wildIcons\": 1,\n \"negativeIcons\": + true,\n \"cycle\": \"Investigator Packs\"\n}" GUID: b2e5b0 Grid: true GridProjection: false 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 84310ec9d..fdfe6fa47 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02149\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02149\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 07a8f0 Grid: true GridProjection: false 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 6bd865946..6d810a2c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09002\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Practiced. Expert.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": \"The - Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09002\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Practiced. Expert.\",\n \"wildIcons\": 3,\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 4b891d Grid: true GridProjection: false 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 cca3f95fc..503b864b7 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Drifter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02005-pb\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 4dced3c2f..8ffb11e6d 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Drifter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02005-pf\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 5d6693d4a..197e28b80 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Drifter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02005-p\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 084cfbe2b..bef1c985c 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Drifter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02005\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Drifter.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 b33b55fec..31410d1fc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Research.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06023\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Research.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 7686cb Grid: true GridProjection: false 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 16d9e29eb..919d2af0d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09091\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09091\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: b5d894 Grid: true GridProjection: false 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 303961a29..d3cce696f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03034\",\r\n \"alternate_ids\": [\r\n \"60413\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03034\",\n \"alternate_ids\": [\n \"60413\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 31d087 Grid: true GridProjection: false 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 c1eff8a4c..fc45ae431 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08067\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08067\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 2,\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: '804397' Grid: true GridProjection: false 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 b6b0a8768..ac4570d74 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09109\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Dilemma. Insight.\",\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09109\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Dilemma. Insight.\",\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 48e90b Grid: true GridProjection: false 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 ee7ced9eb..823dce37a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Atychiphobia a3bc7a.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60504\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60504\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: a3bc7a Grid: true GridProjection: false 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 543977f24..c0dfb5e0a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Augur cf9ca8.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06033\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Ally. Creature. Dreamlands.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06033\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"traits\": \"Ally. Creature. Dreamlands.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: cf9ca8 Grid: true GridProjection: false 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 953f79624..1e6110d78 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Elegant and Elusive DragSelectable: true -GMNotes: "{\r\n \"id\": \"05227\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Cultist. Silver Twilight.\",\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05227\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Cultist. Silver Twilight.\",\n \"cycle\": \"The Circle Undone\"\n}" GUID: 83b588 Grid: true GridProjection: false 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 b0be61eea..63de74abd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07180\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07180\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic. Clothing.\",\n \"agilityIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e81861 Grid: true GridProjection: false 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 2188cf501..7fe2ceef8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60425\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60425\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: c5fb42 Grid: true GridProjection: false 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 58fb00e4b..842ea62ef 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60430\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60430\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 0ee874 Grid: true GridProjection: false 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 e5e00607b..fbcc94b8c 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60407\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60407\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 17319c Grid: true GridProjection: false 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 895a45970..3b8e6fcb1 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53011\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item.\",\n + \ \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to the Forgotten + Age\"\n}" GUID: 389a34 Grid: true GridProjection: false 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 bae89b3bd..bc6f0fa0f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backpack f59085.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04037\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04037\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.\",\n + \ \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: f59085 Grid: true GridProjection: false 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 53bd4aca7..a79efc6b2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60329\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60329\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 7baf75 Grid: true GridProjection: false 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 7431831ec..bdc0e94fe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Backstab cdfd9f.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01051\",\r\n \"alternate_ids\": [\r\n \"01551\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01051\",\n \"alternate_ids\": [\n \"01551\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Tactic.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: cdfd9f Grid: true GridProjection: false 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 fc48ef549..5a012a93f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05282\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05282\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: f9a232 Grid: true GridProjection: false 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 012daad78..bc98df85b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02034\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02034\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 2c2d9a Grid: true GridProjection: false 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 eb3372445..7f11fb04d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandages b460e1.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08073\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08073\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.\",\n \"agilityIcons\": 1,\n + \ \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: b460e1 Grid: true GridProjection: false 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 71cfd19cb..1774dc361 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51001\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51001\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Return to The Dunwich + Legacy\"\n}" GUID: e8b7ad Grid: true GridProjection: false 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 41c728983..e733285d4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bandolier 82775a.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02147\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02147\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item.\",\n + \ \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 82775a Grid: true GridProjection: false 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 06e56a3fe..8edd6d549 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08075\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Charm. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 1,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08075\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Charm. Cursed.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": + 1,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: a65852 Grid: true GridProjection: false 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 9aa1b61c4..c92588a13 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05113\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05113\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: a00fca Grid: true GridProjection: false 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 e6d80bf3d..c67b40438 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05019\",\r\n \"alternate_ids\": [\r\n \"99003\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"traits\": \"Avatar.\",\r\n - \ \"weakness\": true,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05019\",\n \"alternate_ids\": [\n \"99003\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Neutral\",\n \"traits\": \"Avatar.\",\n + \ \"weakness\": true,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 16ad5d Grid: true GridProjection: false 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 bd2717fdc..472884e92 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50004\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return - to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50004\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Insight. Tactic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to the + Night of the Zealot\"\n}" GUID: 3689dd Grid: true GridProjection: false 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 cd3f7c2dc..4dc3de74f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Barricade edb554.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01038\",\r\n \"alternate_ids\": [\r\n \"01538\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01038\",\n \"alternate_ids\": [\n \"01538\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Seeker\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Insight. Tactic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: edb554 Grid: true GridProjection: false 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 423c434b9..99b41dc80 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09113\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09113\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '567525' Grid: true GridProjection: false 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 0b50717d7..cbdb34247 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01574\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01574\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 14d8ff Grid: true GridProjection: false 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 42a6aa691..f38d3e04f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01074\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01074\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 48e103 Grid: true GridProjection: false 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 7648a9350..7b93de7d8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bauta 9c9196.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"82023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Mask.\",\r\n \"combatIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"82023\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Mask.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: 9c9196 Grid: true GridProjection: false 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 fd8d796da..5da0dcba5 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Trap. DragSelectable: true -GMNotes: "{\r\n \"id\": \"81020\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Trap.\",\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"81020\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Trap.\",\n \"cycle\": \"Standalone\"\n}" GUID: 74840a Grid: true GridProjection: false 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 c87a0dea9..fee7d5d65 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01028\",\r\n \"alternate_ids\": [\r\n \"01528\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 4,\r\n - \ \"level\": 2,\r\n \"traits\": \"Ally. Police.\",\r\n \"combatIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01028\",\n \"alternate_ids\": [\n \"01528\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Guardian\",\n \"cost\": 4,\n + \ \"level\": 2,\n \"traits\": \"Ally. Police.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 7001be Grid: true GridProjection: false 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 cd0dcdc8c..d30a7eea6 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01018\",\r\n \"alternate_ids\": [\r\n \"01518\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 4,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Police.\",\r\n \"combatIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01018\",\n \"alternate_ids\": [\n \"01518\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Guardian\",\n \"cost\": 4,\n + \ \"level\": 0,\n \"traits\": \"Ally. Police.\",\n \"combatIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 7d4749 Grid: true GridProjection: false 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 8e8e503ec..936512d0a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Becky 587589.yaml @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Custom Marlin Model 1894 DragSelectable: true -GMNotes: "{\r\n \"id\": \"06006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 2,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06006\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Weapon. Firearm.\",\n + \ \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": + [\n {\n \"count\": 2,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: '587589' Grid: true GridProjection: false 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 429d718e7..009f4b268 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05160\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Gambit. Trick.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05160\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Gambit. Trick.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: dffa9d Grid: true GridProjection: false 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 2a72d3e45..cd15213f4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Beloved b4666d.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07036\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07036\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate. Blessed.\",\n \"willpowerIcons\": 1,\n + \ \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: b4666d Grid: true GridProjection: false 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 e56018c72..2fb063124 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60331\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 2,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 4,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60331\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 2,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Investigator Packs\"\n}" GUID: 91da6b Grid: true GridProjection: false 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 cccc0e692..adcb5d959 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09032\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 39e14a Grid: true GridProjection: false 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 d26a50670..ebc029a9a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02031\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02031\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: ba1460 Grid: true GridProjection: false 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 962c98243..2743a7602 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Interdimensional Prison DragSelectable: true -GMNotes: "{\r\n \"id\": \"09089\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09089\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: c72750 Grid: true GridProjection: false 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 a1771335e..a70d4e095 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09046\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Science.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09046\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Science.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 2423d4 Grid: true GridProjection: false 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 908aa45aa..565a9aa7c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08055\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Favor.\",\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08055\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Favor.\",\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: 20da53 Grid: true GridProjection: false 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 2d91609e3..d1c23aa24 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to The - Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51002\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return + to The Dunwich Legacy\"\n}" GUID: 37a2b5 Grid: true GridProjection: false 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 85c9e6781..31a5971c3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Blackjack 097dcc.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02016\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02016\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 097dcc Grid: true GridProjection: false 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 bab2df7b1..0c97904df 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Shellblade Tribute DragSelectable: true -GMNotes: "{\r\n \"id\": \"86054\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n \"combatIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"86054\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic. Weapon. Melee.\",\n \"combatIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: e89f48 Grid: true GridProjection: false 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 6643512fa..063081f43 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07018\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee. Blessed.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07018\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee. Blessed.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: cf4571 Grid: true GridProjection: false 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 6527143f7..63d1862d3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07190\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Ritual. Blessed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07190\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Ritual. Blessed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: '205385' Grid: true GridProjection: false 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 da9d956c6..9d5cf05ee 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01069\",\r\n \"alternate_ids\": [\r\n \"01569\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01069\",\n \"alternate_ids\": [\n \"01569\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 8254d4 Grid: true GridProjection: false 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 765e105a2..afd585575 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01066\",\r\n \"alternate_ids\": [\r\n \"01566\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01066\",\n \"alternate_ids\": [\n \"01566\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 30f860 Grid: true GridProjection: false 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 200bb75ab..7e80c2ab9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53001\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53001\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Spell. Spirit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 5efc92 Grid: true GridProjection: false 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 5439c9868..f14dc51e0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04266\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04266\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Spell. Spirit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 53d765 Grid: true GridProjection: false 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 5610410f2..215d34878 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02191\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Spell. Pact.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02191\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Spell. Pact.\",\n \"permanent\": + true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 64e131 Grid: true GridProjection: false 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 db73ef625..76591595a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07158\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Pact.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07158\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell. Pact.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: fc709b Grid: true GridProjection: false 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 e4c30b9fc..196f169c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08079\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Pact. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08079\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Pact. Cursed.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: e81f1e Grid: true GridProjection: false 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 fff207c58..9f5be9961 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05317\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05317\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: eafd12 Grid: true GridProjection: false 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 45f3488e5..5327979d2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bloodlust aafc17.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Treachery DragSelectable: true -GMNotes: "{\r\n \"id\": \"06019\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06019\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: aafc17 Grid: true GridProjection: false 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 3d144d1ca..13117fd63 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Murder Weapon DragSelectable: true -GMNotes: "{\r\n \"id\": \"84006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Weapon. Melee. Cursed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"84006\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Weapon. Melee. Cursed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: d71f11 Grid: true GridProjection: false 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 6d3d82e2f..e0325cdfa 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08109\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08109\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue|Mystic\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spell.\",\n + \ \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 5be76d Grid: true GridProjection: false 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 6aab15183..a6d652ce7 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08111\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08111\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue|Mystic\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 5ade28 Grid: true GridProjection: false 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 26466d411..2307b6870 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Salesman DragSelectable: true -GMNotes: "{\r\n \"id\": \"08016\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Entrepreneur.\",\r\n \"willpowerIcons\": 2,\r\n - \ \"intellectIcons\": 4,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +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}" 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 cb46cee64..9dccfc90d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bolas d4b254.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09025\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09025\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: d4b254 Grid: true GridProjection: false 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 0b9791d8b..c0411a9e8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Bonesaw 4b371d.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09005\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Tool. Melee.\",\n + \ \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 4b371d Grid: true GridProjection: false 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 7dc801f5f..18d6c1ab6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Loyal Assistant DragSelectable: true -GMNotes: "{\r\n \"id\": \"09019\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Civic. Assistant.\",\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09019\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Ally. Civic. Assistant.\",\n + \ \"wildIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 634e9e Grid: true GridProjection: false 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 0469f092a..9cf277532 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07017\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome. Blessed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07017\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Blessed.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: cc1ef3 Grid: true GridProjection: false 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 90d224d15..e811ed248 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03154\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03154\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 35166c Grid: true GridProjection: false 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 92bcacf6f..b4aac060f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01070\",\r\n \"alternate_ids\": [\r\n \"01570\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 4,\r\n - \ \"level\": 3,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01070\",\n \"alternate_ids\": [\n \"01570\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": + 3,\n \"traits\": \"Item. Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 296dc8 Grid: true GridProjection: false 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 8d5be913e..7eef89aca 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"04308\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n - \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Ritual.\",\n \"willpowerIcons\": - 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": - \"Click\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten - Age\"\n}" +GMNotes: "{\n \"id\": \"04308\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Click\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 0db666 Grid: true GridProjection: false 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 f41bb573a..027549283 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04007\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04007\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 275dc3 Grid: true GridProjection: false 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 6651090b5..d7facf07f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"startsInPlay\": true,\r\n \"traits\": \"Job.\",\r\n \"permanent\": true,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": \"Bounty\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06010\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Job.\",\n \"permanent\": true,\n \"uses\": + [\n {\n \"count\": 6,\n \"type\": \"Bounty\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 4d9b32 Grid: true GridProjection: false 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 7b370bd54..4ef0efcee 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60127\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60127\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Weapon.\",\n \"combatIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 54293e Grid: true GridProjection: false 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 71013937f..30085d8df 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60105\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60105\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon.\",\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: db4a43 Grid: true GridProjection: false 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 7d776a260..b9d13fabb 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08090\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08090\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian|Mystic\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": + \"Spell.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 6,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 0fff60 Grid: true GridProjection: false 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 2392c5b13..e93929b0d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08092\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 9,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08092\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian|Mystic\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 9,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 200b64 Grid: true GridProjection: false 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 09691b3ce..25e66e219 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09026\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Tactic. Police.\",\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09026\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Tactic. Police.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 74969c Grid: true GridProjection: false 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 c9e0842bf..c8c348f39 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09074\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09074\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 3411dd Grid: true GridProjection: false 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 964ec2bb1..dac66c728 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07114\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07114\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 31cfbf Grid: true GridProjection: false 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 afb6ce989..94c2a4d07 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Pure of Spirit DragSelectable: true -GMNotes: "{\r\n \"id\": \"02106\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 5,\r\n \"level\": 1,\r\n \"traits\": \"Ally. \",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02106\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 5,\n \"level\": 1,\n \"traits\": \"Ally. + \",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 3c9617 Grid: true GridProjection: false 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 cda2f6b7b..1fc8abbd8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08122\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Rogue|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08122\",\n \"type\": \"Asset\",\n \"class\": \"Guardian|Rogue|Survivor\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": 2,\n \"type\": + \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 8ec9cb Grid: true GridProjection: false 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 1321ba0b0..c0a0e7413 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06166\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Developed.\",\r\n \"combatIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06166\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Developed.\",\n \"combatIcons\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: fb9b7e Grid: true GridProjection: false 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 961a04885..1f6a81812 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01094\",\r\n \"alternate_ids\": [\r\n \"01594\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 2,\r\n - \ \"level\": 3,\r\n \"traits\": \"Item. Armor.\",\r\n \"combatIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01094\",\n \"alternate_ids\": [\n \"01594\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Body\",\n \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": + 3,\n \"traits\": \"Item. Armor.\",\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n + \ \"cycle\": \"Core\"\n}" GUID: c4cf62 Grid: true GridProjection: false 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 10a632e2d..ddf2f5a0d 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 45c19e Grid: true GridProjection: false 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 791d2032d..4a924497b 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09020\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09020\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 22e624 Grid: true GridProjection: false 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 eaa3ae781..1c137e69c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06200\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Talent. Illicit.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06200\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Talent. Illicit.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 2aeb8a Grid: true GridProjection: false 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 7d0ad94c9..cce9284ca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary 5d04a1.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01545\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Talent. Illicit.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01545\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent. Illicit.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 5d04a1 Grid: true GridProjection: false 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 aaf286b3a..b3abbaaca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Burglary bc3451.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01045\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Talent. Illicit.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01045\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent. Illicit.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: bc3451 Grid: true GridProjection: false 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 c300a7bd3..405b3ab17 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 @@ -17,11 +17,10 @@ CustomDeck: NumWidth: 10 Type: 0 UniqueBack: false -Description: Weakness +Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08009\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Mystery.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08009\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Mystery.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 28080d Grid: true GridProjection: false 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 23d5e9a1c..1dde1b39b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08076\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08076\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: eedd0b Grid: true GridProjection: false 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 658ca2f9d..ccac8690c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60214\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60214\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 0d29be Grid: true GridProjection: false 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 20bd93b19..fa23b090a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03016\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Task.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"victory\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03016\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Task.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"victory\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: e6efe6 Grid: true GridProjection: false 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 bca9e7273..594390a2c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07160\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Paradox. Blessed. Cursed.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07160\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Paradox. Blessed. Cursed.\",\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 22fc6c Grid: true GridProjection: false 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 1e5c8ea97..6a360fffb 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08025\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08025\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: 5779d3 Grid: true GridProjection: false 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 5916f41d0..b23433839 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08030\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0a312f Grid: true GridProjection: false 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 76e02cd40..95f56c164 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09070\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Gambit. Fated.\",\r\n \"dynamicIcons\": true,\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09070\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Gambit. Fated.\",\n \"dynamicIcons\": true,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: dfbed9 Grid: true GridProjection: false 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 ed5739dca..88b5a6a90 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08129\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Favor. Synergy.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08129\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Favor. Synergy.\",\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 1d1901 Grid: true GridProjection: false 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 f1f5d38a6..55d140ab2 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04009\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04009\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 86feae Grid: true GridProjection: false 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 483a2b5cb..d705c5bed 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60503\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60503\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"Investigator Packs\"\n}" GUID: e628de Grid: true GridProjection: false 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 40b4e3bdb..9d77395ec 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03158\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Favor.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03158\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Favor.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 9b9e8b Grid: true GridProjection: false 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 d174f7834..156a4baf1 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Haunted DragSelectable: true -GMNotes: "{\r\n \"id\": \"04005\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Cursed. Drifter.\",\r\n \"willpowerIcons\": 0,\r\n - \ \"intellectIcons\": 0,\r\n \"combatIcons\": 0,\r\n \"agilityIcons\": 0,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +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}" 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 8621c4e43..c5cd2f72f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09047\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09047\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 498bc8 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern 30614e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern 30614e.yaml index 1eca40029..2f01839ce 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern 30614e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Carolyn Fern 30614e.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05001-m\",\r\n \"alternate_ids\": [\r\n \"98010-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"05001-m\",\n \"alternate_ids\": [\n \"98010-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 30614e Grid: true GridProjection: false 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 24e75abfb..efae00ff4 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Psychologist DragSelectable: true -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" +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}" GUID: b03b12 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 2271f889b..fd650c3ee 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Butler DragSelectable: true -GMNotes: "{\r\n \"id\": \"09001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Assistant.\",\r\n \"willpowerIcons\": 2,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +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}" 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 97d511a2b..54d1e8615 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01055\",\r\n \"alternate_ids\": [\r\n \"01555\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 4,\r\n - \ \"level\": 1,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01055\",\n \"alternate_ids\": [\n \"01555\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": + 1,\n \"traits\": \"Ally. Criminal.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 2fe723 Grid: true GridProjection: false 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 274570629..52d526558 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04012\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Blunder.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04012\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Blunder.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten + Age\"\n}" GUID: ecd087 Grid: true GridProjection: false 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 943f0b521..384a01459 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Book of Books DragSelectable: true -GMNotes: "{\r\n \"id\": \"60206\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60206\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: d287bc Grid: true GridProjection: false 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 3949a8dd0..d95e7acdc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09096\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Charm. Weapon. Melee.\",\r\n - \ \"combatIcons\": 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09096\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Charm. Weapon. Melee.\",\n \"combatIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 4a6a9f Grid: true GridProjection: false 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 9aa87749e..ca17423c0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09082\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09082\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: b5e78c Grid: true GridProjection: false 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 3d7709406..88618fa7c 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60529\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Item. Tool. Weapon. Melee.\",\r\n - \ \"combatIcons\": 3,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60529\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Item. + Tool. Weapon. Melee.\",\n \"combatIcons\": 3,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: d40f4e Grid: true GridProjection: false 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 1a1a1197b..29a2e684f 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02158\",\r\n \"alternate_ids\": [\r\n \"01694\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"level\": 3,\r\n - \ \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02158\",\n \"alternate_ids\": [\n \"01694\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Neutral\",\n \"level\": 3,\n \"traits\": \"Talent.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 9e6c55 Grid: true GridProjection: false 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 5d413c499..1d38487d4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Acquisitions and Solicitation DragSelectable: true -GMNotes: "{\r\n \"id\": \"03149\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Patron.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03149\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Patron.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 4a2a36 Grid: true GridProjection: false 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 bc3c281ff..f3c7f5b48 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Politician DragSelectable: true -GMNotes: "{\r\n \"id\": \"09018\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Civic. Socialite.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +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}" 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 08c2a9617..afd4208f7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Ferryman's Pay DragSelectable: true -GMNotes: "{\r\n \"id\": \"03308\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03308\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Item. Relic.\",\n \"permanent\": true,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 1dbc95 Grid: true GridProjection: false 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 bfcb30dad..0d3739302 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60323\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Trick.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60323\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Trick.\",\n \"combatIcons\": 1,\n + \ \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 0b963c Grid: true GridProjection: false 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 b402caa58..2a98bb0fa 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03194\",\r\n \"alternate_ids\": [\r\n \"60312\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03194\",\n \"alternate_ids\": [\n \"60312\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Trick.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path + to Carcosa\"\n}" GUID: b8c93a Grid: true GridProjection: false 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 342ac7be3..9a020b880 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03310\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 5,\r\n \"traits\": \"Trick. Fated.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03310\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Trick. Fated.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 3add54 Grid: true GridProjection: false 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 4f2c72e13..2a8cff945 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08050\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Trick. Synergy.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08050\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Trick. Synergy.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: f6d572 Grid: true GridProjection: false 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 a15a4fe56..a5d86af65 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 102 +CardID: 12102 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"10040\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tool. Science.\",\n \"intellectIcons\": - 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10040\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Science.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" GUID: da9727 Grid: true GridProjection: false 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 7dfb7022a..be9b194a0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60520\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60520\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 5a2b49 Grid: true GridProjection: false 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 e82d1d668..fe59d50d3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03114\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03114\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 215cec Grid: true GridProjection: false 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 0639b6603..a2a71727d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02304\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 5,\r\n \"level\": 4,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02304\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Rogue\",\n \"cost\": 5,\n \"level\": 4,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: ecfa42 Grid: true GridProjection: false 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 9887b3c99..22dae9557 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Chronophobia eeb330.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"02039\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02039\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: eeb330 Grid: true GridProjection: false 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 d6679e163..29c8fcb0f 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: O'Bannion Driver DragSelectable: true -GMNotes: "{\r\n \"id\": \"09072\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09072\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Ally. + Criminal.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: ea31c2 Grid: true GridProjection: false 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 d91fb1d8a..815f41f4d 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: O'Bannion Driver DragSelectable: true -GMNotes: "{\r\n \"id\": \"60332\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60332\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Ally. + Criminal.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 0e72b6 Grid: true GridProjection: false 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 c0e11b9ad..1c9788b47 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60426\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60426\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: f5d382 Grid: true GridProjection: false 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 f15f4542a..6c46707e2 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60431\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60431\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: e21200 Grid: true GridProjection: false 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 75755846c..5c3f2d8d9 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Clairvoyance b67371.yaml @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60408\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60408\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: b67371 Grid: true GridProjection: false 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 8384055d1..aa5719e2a 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51008\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Return to + The Dunwich Legacy\"\n}" GUID: a53344 Grid: true GridProjection: false 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 113d31aa9..c945cfe94 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02030\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 8e57b8 Grid: true GridProjection: false 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 d348b490b..8eb9121f3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: A Gift Unlooked For DragSelectable: true -GMNotes: "{\r\n \"id\": \"03142\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03142\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"weakness\": true,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: f295d9 Grid: true GridProjection: false 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 08319e625..5ced7c5a5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08730\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Clothing.\",\r\n \"combatIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08730\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Clothing.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: c1f999 Grid: true GridProjection: false 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 0d181e050..701d48f8b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09078\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 4,\r\n \"traits\": \"Gambit. Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09078\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 4,\n \"traits\": \"Gambit. Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '537171' Grid: true GridProjection: false 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 374f4c9a7..f071f9b8d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60111\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60111\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 3319be Grid: true GridProjection: false 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 1ab01cdaa..aa42ca9d7 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Interwoven Distortion DragSelectable: true -GMNotes: "{\r\n \"id\": \"86051\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic. Clothing.\",\r\n \"agilityIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"86051\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic. Clothing.\",\n \"agilityIcons\": 2,\n + \ \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: e4ab48 Grid: true GridProjection: false 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 aeb4d244d..cf064af59 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01083\",\r\n \"alternate_ids\": [\r\n \"01583\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 2,\r\n - \ \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01083\",\n \"alternate_ids\": [\n \"01583\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": + \"Fortune.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 6aae86 Grid: true GridProjection: false 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 590495bc5..7833cce38 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08062\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Ritual. Synergy.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 1,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08062\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Ritual. + Synergy.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 1,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: d02825 Grid: true GridProjection: false 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 f2eaeae09..38cacd478 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08731\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08731\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Tome.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: d6f719 Grid: true GridProjection: false 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 1fbf311e7..9f04de07d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 5,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53006\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 8dda2d Grid: true GridProjection: false 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 3df152a40..128fce9f9 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04268\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04268\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 5a305e Grid: true GridProjection: false 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 0583e6f64..3f66b2119 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03107\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Talent. Composure.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03107\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Talent. Composure.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: bd3ecc Grid: true GridProjection: false 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 db2cced62..8a61db632 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Composure.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08027\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Talent. Composure.\",\n \"combatIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 36efa2 Grid: true GridProjection: false 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 f0f6ad6c2..df5341556 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05025\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05025\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 13413d Grid: true GridProjection: false 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 48153c2ce..0c9b7b703 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51005\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Supply. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51005\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Supply. Illicit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 2,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 620b6e Grid: true GridProjection: false 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 d6c5aac84..39d4b736e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Contraband b4ad29.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02109\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Supply. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02109\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Supply. Illicit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: b4ad29 Grid: true GridProjection: false 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 2c60ec740..e90799daa 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08732\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08732\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Weapon. Firearm.\",\n \"combatIcons\": 1,\n + \ \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of the + Earth\"\n}" GUID: 34e723 Grid: true GridProjection: false 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 c2a60cdb3..c1bef3adf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60330\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Gambit.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60330\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 3,\n \"traits\": \"Gambit.\",\n \"wildIcons\": 1,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: de40c8 Grid: true GridProjection: false 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 5a40f4732..fc9395044 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04160\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04160\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: c6c260 Grid: true GridProjection: false 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 c32ee47ea..5dc37afbd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08049\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Favor. Service.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08049\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Favor. Service.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: fad52a Grid: true GridProjection: false 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 4342744c3..ff1ee76fc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60122\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60122\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit. Tactic.\",\n \"combatIcons\": + 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 92436b Grid: true GridProjection: false 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 1b2b0b47d..f5b9edc08 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Counterpunch 20645e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60112\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60112\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 20645e Grid: true GridProjection: false 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 b36636f87..16a096855 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04110\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04110\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell. Blessed.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 2236f6 Grid: true GridProjection: false 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 7786cefb0..9391abd41 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04269\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Fated.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04269\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic. Fated.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 2240f9 Grid: true GridProjection: false 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 a837c21f4..27228c71f 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01007\",\r\n \"alternate_ids\": [\r\n \"01507\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Task.\",\r\n \"weakness\": true,\r\n \"uses\": [\r\n {\r\n \"count\": - 3,\r\n \"type\": \"Clue\",\r\n \"token\": \"clue\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01007\",\n \"alternate_ids\": [\n \"01507\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Task.\",\n \"weakness\": + true,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Clue\",\n \"token\": + \"clue\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: ca25bc Grid: true GridProjection: false 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 138f34f08..858299c6d 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90031\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task.\",\r\n \"weakness\": true,\r\n \"uses\": - [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Clue\",\r\n \"token\": - \"clue\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90031\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Clue\",\n \"token\": \"clue\"\n }\n ],\n \"cycle\": + \"Standalone\"\n}" GUID: f802e3 Grid: true GridProjection: false 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 7efff69ea..ca4a6c543 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05110\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05110\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 8dce44 Grid: true GridProjection: false 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 6f05d6d01..301f64a05 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08123\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08123\",\n \"type\": \"Asset\",\n \"class\": \"Seeker|Rogue|Survivor\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": 2,\n \"type\": + \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: fa994a Grid: true GridProjection: false 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 ba45188e8..58066f180 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07007\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07007\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 8b68f4 Grid: true GridProjection: false 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 2ce65157a..98611a7a3 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03019\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03019\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 367aac Grid: true GridProjection: false 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 aaaf060e9..bdf908f89 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Text of the Elder Guardian DragSelectable: true -GMNotes: "{\n \"id\": \"07192\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. Tome. Blessed.\",\n \"willpowerIcons\": - 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": - \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" +GMNotes: "{\n \"id\": \"07192\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Tome. Blessed.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 416f12 Grid: true GridProjection: false 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 b0ff1ccaa..94fb2ffbf 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Text of the Elder Herald DragSelectable: true -GMNotes: "{\n \"id\": \"07191\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. Tome. Cursed.\",\n \"intellectIcons\": - 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": - \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Innsmouth - Conspiracy\"\n}" +GMNotes: "{\n \"id\": \"07191\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Tome. Cursed.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 0,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e8b179 Grid: true GridProjection: false 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 0d0f5202c..7b73be8d6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Untranslated DragSelectable: true -GMNotes: "{\r\n \"id\": \"07022\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome. Occult.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07022\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Occult.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: fbfa24 Grid: true GridProjection: false 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 9ad370460..a5594c6c0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01043\",\r\n \"alternate_ids\": [\r\n \"01543\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 0,\r\n - \ \"level\": 4,\r\n \"traits\": \"Insight.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01043\",\n \"alternate_ids\": [\n \"01543\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Seeker\",\n \"cost\": 0,\n \"level\": 4,\n \"traits\": + \"Insight.\",\n \"cycle\": \"Core\"\n}" GUID: 5d25b1 Grid: true GridProjection: false 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 8fa92da4f..2ebe06f8a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60224\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60224\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 870bdc Grid: true GridProjection: false 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 96c1f76ce..fa3cf9051 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60215\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60215\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: ff2776 Grid: true GridProjection: false 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 4ff99b5e4..5f35f18a7 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07021\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 4f3142 Grid: true GridProjection: false 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 4c40881e5..554c686b7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60411\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60411\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 6c3156 Grid: true GridProjection: false 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 27433a4df..d9e069527 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,6 +41,133 @@ 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("playercards/cards/CrystallineElderSign3", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["+1"] = true, @@ -74,6 +201,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -148,6 +280,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -191,6 +328,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -263,6 +404,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -276,6 +429,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -293,7 +458,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -338,6 +503,11 @@ do 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) @@ -350,122 +520,14 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/CrystallineElderSign3") -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 1033c8eee..72892a10b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04235\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Blessed.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04235\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Blessed.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 949ca2 Grid: true GridProjection: false 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 561fd5422..3ec029305 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06025\"\r\n }\r\n ],\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06024\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Relic.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06025\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 6692de Grid: true GridProjection: false 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 2230bf3dd..e102e759f 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01078\",\r\n \"alternate_ids\": [\r\n \"01578\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 5,\r\n - \ \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01078\",\n \"alternate_ids\": [\n \"01578\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 5,\n \"level\": 0,\n \"traits\": + \"Tactic.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: e8ea95 Grid: true GridProjection: false 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 01505a84f..327b8947a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Cunning e2767a.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05030\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05030\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: e2767a Grid: true GridProjection: false 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 d16c065d2..deb10a2bc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Curiosity 9e5cd2.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05026\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05026\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 9e5cd2 Grid: true GridProjection: false 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 121bd7cb3..26bf612f5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07195\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Ritual. Cursed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07195\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Ritual. Cursed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 3199f2 Grid: true GridProjection: false 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 56bcaf9b6..728333df2 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Curse. DragSelectable: true -GMNotes: "{\r\n \"id\": \"81029\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"81029\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 2e33f7 Grid: true GridProjection: false 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 05f436730..55dbb3c51 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 @@ -19,23 +19,23 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Upgrade. Supply.\",\r\n \"customizations\": - [\r\n {\r\n \"name\": \"Notched Sight\",\r\n \"xp\": 1,\r\n \"text\": +GMNotes: "{\n \"id\": \"09023\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Upgrade. Supply.\",\n \"customizations\": + [\n {\n \"name\": \"Notched Sight\",\n \"xp\": 1,\n \"text\": \"If you perform an attack with attached asset against an enemy engaged with another - investigator and fail, you deal no damage.\"\r\n },\r\n {\r\n \"name\": - \"Extended Stock\",\r\n \"xp\": 2,\r\n \"text\": \"You get +2 Fight while - attacking with attached asset.\"\r\n },\r\n {\r\n \"name\": \"Counterbalance\",\r\n - \ \"xp\": 2,\r\n \"text\": \"After you attach an Upgrade card other than - Custom Modifications to attached asset, draw 1 card.\"\r\n },\r\n {\r\n \"name\": - \"Leather Grip\",\r\n \"xp\": 3,\r\n \"text\": \"Custom Modifications - gets \u20131 cost and gains \u201CFast. Play only during your turn.\u201D\",\r\n - \ \"replaces\": {\r\n \"cost\": 2\r\n }\r\n },\r\n {\r\n \"name\": - \"Extended Magazine\",\r\n \"xp\": 3,\r\n \"text\": \"After ammo is spent - from or placed on attached asset by another event, place 1 ammo on attached asset.\"\r\n - \ },\r\n {\r\n \"name\": \"Quicksilver Bullets\",\r\n \"xp\": 4,\r\n - \ \"text\": \"If you succeed by 3 or more while attacking with attached asset, - this attack deals +1 damage.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" + investigator and fail, you deal no damage.\"\n },\n {\n \"name\": \"Extended + Stock\",\n \"xp\": 2,\n \"text\": \"You get +2 Fight while attacking with + attached asset.\"\n },\n {\n \"name\": \"Counterbalance\",\n \"xp\": + 2,\n \"text\": \"After you attach an Upgrade card other than Custom Modifications + to attached asset, draw 1 card.\"\n },\n {\n \"name\": \"Leather Grip\",\n + \ \"xp\": 3,\n \"text\": \"Custom Modifications gets \u20131 cost and gains + \u201CFast. Play only during your turn.\u201D\",\n \"replaces\": {\n \"cost\": + 2\n }\n },\n {\n \"name\": \"Extended Magazine\",\n \"xp\": + 3,\n \"text\": \"After ammo is spent from or placed on attached asset by another + event, place 1 ammo on attached asset.\"\n },\n {\n \"name\": \"Quicksilver + Bullets\",\n \"xp\": 4,\n \"text\": \"If you succeed by 3 or more while + attacking with attached asset, this attack deals +1 damage.\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: d2252d Grid: true GridProjection: false 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 0f9cf1be1..3634bfd73 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08093\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic\",\r\n - \ \"cost\": 5,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"willpowerIcons\": 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Edge of the - Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08093\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian|Mystic\",\n \"cost\": 5,\n \"level\": 5,\n \"traits\": + \"Item. Relic. Weapon. Melee.\",\n \"willpowerIcons\": 2,\n \"combatIcons\": 2,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 4df3b9 Grid: true GridProjection: false 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 c3eaf69c3..a371b16f3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Librarian DragSelectable: true -GMNotes: "{\r\n \"id\": \"01002-pb\",\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" +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}" 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 75aedc57a..840dab32e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Librarian DragSelectable: true -GMNotes: "{\r\n \"id\": \"01002-pf\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Miskatonic.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 5,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +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}" 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 eac7f107e..abfd62c34 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Librarian DragSelectable: true -GMNotes: "{\r\n \"id\": \"01002-p\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Miskatonic.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 5,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +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}" 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 b6964f124..2a8497553 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Librarian DragSelectable: true -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" +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}" GUID: 6938eb Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker bce6a5.yaml b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker bce6a5.yaml index a15335c68..549710e66 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker bce6a5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daisy Walker bce6a5.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01002-m\",\r\n \"alternate_ids\": [\r\n \"01502-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"01002-m\",\n \"alternate_ids\": [\n \"01502-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: bce6a5 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 3c2ae08dc..b7ddbc626 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Signature DragSelectable: true -GMNotes: "{\r\n \"id\": \"01008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01008\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 96c9be Grid: true GridProjection: false 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 d213f4e65..5cdc1999d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01508\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01508\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: d72b97 Grid: true GridProjection: false 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 ec68ab793..798f4b0db 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Damned bad8cb.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"54014\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse. Omen.\",\r\n \"permanent\": true,\r\n \"weakness\": - true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54014\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse. Omen.\",\n \"permanent\": true,\n \"weakness\": true,\n + \ \"basicWeaknessCount\": 1,\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: bad8cb Grid: true GridProjection: false 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 a7980bcda..31927363b 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 @@ -19,28 +19,28 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09059\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Illicit.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Evidence\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"customizations\": [\r\n {\r\n - \ \"name\": \"Search Warrant\",\r\n \"xp\": 1,\r\n \"text\": \"While - investigating using Damning Testimony, you may ignore any effect or keyword on the - investigated location that would trigger.\"\r\n },\r\n {\r\n \"name\": - \"Fabricated Evidence\",\r\n \"xp\": 2,\r\n \"text\": \"Damning Testimony - enters play with 2 additional evidence on it.\",\r\n \"replaces\": {\r\n \"uses\": - [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Evidence\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ]\r\n }\r\n },\r\n - \ {\r\n \"name\": \"Blackmail\",\r\n \"xp\": 2,\r\n \"text\": \"You - get +2 Intellect while investigating using Damning Testimony.\"\r\n },\r\n {\r\n - \ \"name\": \"Extort\",\r\n \"xp\": 3,\r\n \"text\": \"When you successfully - investigate using Damning Testimony, you may spend 1 evidence to automatically evade - the chosen enemy.\"\r\n },\r\n {\r\n \"name\": \"Surveil\",\r\n \"xp\": - 3,\r\n \"text\": \"You may use Damning Testimony\u2019s ability to investigate - the chosen enemy\u2019s location instead of your location.\"\r\n },\r\n {\r\n - \ \"name\": \"Expose\",\r\n \"xp\": 4,\r\n \"text\": \"When you successfully - investigate using Damning Testimony, you may spend X evidence to discard the chosen - enemy if it is non-Elite. X is that enemy\u2019s remaining health.\"\r\n }\r\n - \ ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09059\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Illicit.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n \"customizations\": + [\n {\n \"name\": \"Search Warrant\",\n \"xp\": 1,\n \"text\": + \"While investigating using Damning Testimony, you may ignore any effect or keyword + on the investigated location that would trigger.\"\n },\n {\n \"name\": + \"Fabricated Evidence\",\n \"xp\": 2,\n \"text\": \"Damning Testimony + enters play with 2 additional evidence on it.\",\n \"replaces\": {\n \"uses\": + [\n {\n \"count\": 5,\n \"type\": \"Evidence\",\n + \ \"token\": \"resource\"\n }\n ]\n }\n },\n {\n + \ \"name\": \"Blackmail\",\n \"xp\": 2,\n \"text\": \"You get +2 Intellect + while investigating using Damning Testimony.\"\n },\n {\n \"name\": \"Extort\",\n + \ \"xp\": 3,\n \"text\": \"When you successfully investigate using Damning + Testimony, you may spend 1 evidence to automatically evade the chosen enemy.\"\n + \ },\n {\n \"name\": \"Surveil\",\n \"xp\": 3,\n \"text\": \"You + may use Damning Testimony\u2019s ability to investigate the chosen enemy\u2019s + location instead of your location.\"\n },\n {\n \"name\": \"Expose\",\n + \ \"xp\": 4,\n \"text\": \"When you successfully investigate using Damning + Testimony, you may spend X evidence to discard the chosen enemy if it is non-Elite. + X is that enemy\u2019s remaining health.\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 3369a5 Grid: true GridProjection: false 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 e4cf69f6f..47c7a0ff0 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Mechanic DragSelectable: true -GMNotes: "{\r\n \"id\": \"08001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Entrepreneur.\",\r\n \"willpowerIcons\": 4,\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 5,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +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}" 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 8a7906d7d..a7b059a5e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06240\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Fortune. Practiced.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06240\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 2,\n \"traits\": \"Fortune. Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: b3cad4 Grid: true GridProjection: false 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 b4a14ed2b..4e1d83580 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daredevil e4688b.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60318\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune. Practiced.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60318\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Fortune. Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: e4688b Grid: true GridProjection: false 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 dc3285afe..31aca458c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Daring 91e53c.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06111\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06111\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 3,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: 91e53c Grid: true GridProjection: false 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 e1b7a4f10..6c0bea09e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60322\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Gambit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60322\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Gambit.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: fc82a5 Grid: true GridProjection: false 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 5fe3fcbf9..2666b0bad 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03030\",\r\n \"alternate_ids\": [\r\n \"60313\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Gambit.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03030\",\n \"alternate_ids\": [\n \"60313\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Gambit.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: cc6b14 Grid: true GridProjection: false 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 cce626c1e..8f6ae7299 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Unscrupulous Investor DragSelectable: true -GMNotes: "{\r\n \"id\": \"03151\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Patron.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03151\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Patron.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 5ec1a2 Grid: true GridProjection: false 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 d9fd00747..caa4fecc6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60403\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Omen. Endtimes.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60403\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Omen. Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 3aa40e Grid: true GridProjection: false 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 742b5c22b..a61cb683b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02234\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Condition.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02234\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Condition.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 1b4434 Grid: true GridProjection: false 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 d106d3050..485f493ea 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05014\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"startsInHand\": true,\r\n \"cost\": 2,\r\n \"traits\": \"Insight.\",\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05014\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"startsInHand\": true,\n \"cost\": 2,\n \"traits\": \"Insight.\",\n \"cycle\": + \"The Circle Undone\"\n}" GUID: f08934 Grid: true GridProjection: false 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 6c0b2ac3f..80e48ece8 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90019\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Spell.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90019\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 580a4d Grid: true GridProjection: false 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 fe2f4ad85..083206249 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01513\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Spell.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01513\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Spell.\",\n \"cycle\": \"Core\"\n}" GUID: 98c8d8 Grid: true GridProjection: false 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 6f5a252e5..1ca81ff0a 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Signature DragSelectable: true -GMNotes: "{\r\n \"id\": \"01013\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Spell.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01013\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Spell.\",\n \"weakness\": true,\n \"cycle\": \"Core\"\n}" GUID: c025bf Grid: true GridProjection: false 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 10819ac2b..4df40ed54 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"04038\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04038\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: dd3d09 Grid: true GridProjection: false 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 7baea99ad..06d41da97 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04032\",\r\n \"alternate_ids\": [\r\n \"60417\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Augury.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04032\",\n \"alternate_ids\": [\n \"60417\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Augury.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: da7613 Grid: true GridProjection: false 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 dda4e6ff6..a2c391b0e 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,115 +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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/DarkRitual") -end) __bundle_register("playercards/cards/DarkRitual", function(require, _LOADED, __bundle_register, __bundle_modules) VALID_TOKENS = { ["Curse"] = true @@ -184,6 +75,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -258,6 +154,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -301,6 +202,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -373,6 +278,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -386,6 +303,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -403,7 +332,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -448,6 +377,11 @@ do 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) @@ -460,13 +394,141 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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/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 ee8814620..4812fdb04 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07026\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Ritual. Cursed.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07026\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Ritual. + Cursed.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 272e6c Grid: true GridProjection: false 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 365880259..2c02a355f 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Photographer DragSelectable: true -GMNotes: "{\r\n \"id\": \"09015\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Reporter.\",\r\n \"willpowerIcons\": 2,\r\n \"intellectIcons\": - 5,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +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}" GUID: 5d3d67 Grid: true GridProjection: false 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 8b25515e1..21d85c681 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08078\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Developed.\",\r\n \"dynamicIcons\": - true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08078\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Developed.\",\n \"dynamicIcons\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: adc8b6 Grid: true GridProjection: false 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 755258176..6f81beabb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Esteemed Eschatologist DragSelectable: true -GMNotes: "{\r\n \"id\": \"03112\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Patron.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03112\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Patron.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 1f8539 Grid: true GridProjection: false 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 821bb672e..495cc3f55 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,58 @@ 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("playercards/cards/DayofReckoning") +end) +__bundle_register("playercards/cards/DayofReckoning", function(require, _LOADED, __bundle_register, __bundle_modules) +VALID_TOKENS = { + ["Elder Sign"] = 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. @@ -66,6 +118,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -140,6 +197,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -183,6 +245,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -255,6 +321,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -268,6 +346,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -285,7 +375,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -330,6 +420,11 @@ do 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) @@ -342,9 +437,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -379,7 +475,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -398,6 +494,12 @@ do 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) @@ -414,8 +516,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -427,44 +529,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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/DayofReckoning") -end) -__bundle_register("playercards/cards/DayofReckoning", function(require, _LOADED, __bundle_register, __bundle_modules) -VALID_TOKENS = { - ["Elder Sign"] = 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 Day of Reckoning e701af.yaml b/unpacked/Bag All Player Cards 15bb07/Card Day of Reckoning e701af.yaml index 5c6853936..b0e54cfd2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07040\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Endtimes.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e701af Grid: true GridProjection: false 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 3620755f7..39597b9a9 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Deals with "Devils" DragSelectable: true -GMNotes: "{\r\n \"id\": \"05279\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Witch.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05279\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Ally. + Witch.\",\n \"willpowerIcons\": 2,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 4f2489 Grid: true GridProjection: false 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 a09d133fd..e7c99dfed 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Signs of the Black Stars DragSelectable: true -GMNotes: "{\r\n \"id\": \"05235\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05235\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: b40b98 Grid: true GridProjection: false 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 de7499195..ff8957bcd 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09014\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Omen.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09014\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Omen.\",\n \"weakness\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 0821d4 Grid: true GridProjection: false 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 9ab845951..986bdeced 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Free from the Past DragSelectable: true -GMNotes: "{\r\n \"id\": \"05027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05027\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: 2e5b03 Grid: true GridProjection: false 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 4ffeebe69..8e07e432f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02303\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02303\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 8b0193 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Deck of Possibilities fefdfa.yaml b/unpacked/Bag All Player Cards 15bb07/Card Deck of Possibilities fefdfa.yaml index a71634382..f799f7176 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deck of Possibilities fefdfa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deck of Possibilities fefdfa.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: Tychokinetic Implement DragSelectable: true -GMNotes: "{\r\n \"id\": \"88043\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"traits\": \"Item. Relic.\",\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"88043\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"permanent\": true,\n \"traits\": \"Item. Relic.\",\n \"cycle\": \"Standalone\"\n}" GUID: fefdfa Grid: true GridProjection: false 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 8b769c642..57d4daf6d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Doom Begets Doom DragSelectable: true -GMNotes: "{\r\n \"id\": \"53005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 0,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53005\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Cursed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": + [\n {\n \"count\": 0,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 946a58 Grid: true GridProjection: false 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 9b8a7971e..4966996fb 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Doom Begets Doom DragSelectable: true -GMNotes: "{\r\n \"id\": \"04026\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Cursed.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04026\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Cursed.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 07350b Grid: true GridProjection: false 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 3323d8c16..83c68bbbe 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Decoy 2ee50e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05234\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Favor. Service.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05234\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Favor. Service.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 2ee50e Grid: true GridProjection: false 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 bb50760b7..4aa6dd2c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02150\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02150\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 2,\n \"traits\": \"Practiced. Expert.\",\n \"intellectIcons\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 95272b Grid: true GridProjection: false 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 82f0b732a..f61e06ad0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction b265c4.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01039\",\r\n \"alternate_ids\": [\r\n \"60219\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Practiced.\",\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01039\",\n \"alternate_ids\": [\n \"60219\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Seeker\",\n \"level\": 0,\n \"traits\": \"Practiced.\",\n + \ \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: b265c4 Grid: true GridProjection: false 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 d4c06bf09..a90b5e904 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Deduction bc4a4c.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01539\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01539\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: bc4a4c Grid: true GridProjection: false 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 09541bee0..d7cc3f847 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07023\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Cursed.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: b176fc Grid: true GridProjection: false 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 fe95aed22..658c52835 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08024\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"dynamicIcons\": - true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08024\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 1,\n \"traits\": \"Practiced. Expert.\",\n \"dynamicIcons\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 62e4f4 Grid: true GridProjection: false 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 9cfc29962..f78ed1fa8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04198\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04198\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: bf3dd1 Grid: true GridProjection: false 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 5d9910ba2..f73933c0e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Defiance 59b24f.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02190\",\r\n \"alternate_ids\": [\r\n \"60418\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02190\",\n \"alternate_ids\": [\n \"60418\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Mystic\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 59b24f Grid: true GridProjection: false 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 f6e3f162f..0dc3f3137 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05021\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Spirit. Tactic.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05021\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Spirit. Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: '683937' Grid: true GridProjection: false 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 e91234e23..24fe39ca4 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Syndicate Assassin DragSelectable: true -GMNotes: "{\r\n \"id\": \"06281\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Criminal. Syndicate.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06281\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. + Criminal. Syndicate.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 97a795 Grid: true GridProjection: false 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 88842345a..3b32643ec 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02111\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"victory\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02111\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"victory\": 1,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 14e212 Grid: true GridProjection: false 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 e017f4e9d..a999df1b5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dendromorphosis 121b2d.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"53012\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Curse. Flora.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53012\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Curse. Flora.\",\n \"weakness\": true,\n + \ \"basicWeaknessCount\": 1,\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 121b2d Grid: true GridProjection: false 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 e254a3a3b..88befc0cd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05280\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 5,\r\n \"traits\": \"Spell. Paradox.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05280\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 5,\n \"traits\": \"Spell. Paradox.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d24531 Grid: true GridProjection: false 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 d1057cff8..40646300e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05032\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Paradox.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05032\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spell. Paradox.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 8aa0c3 Grid: true GridProjection: false 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 18c313931..cac272834 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03117\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Desperate.\",\r\n \"intellectIcons\": 4,\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03117\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Desperate.\",\n \"intellectIcons\": 4,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 45bdf0 Grid: true GridProjection: false 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 b8747108a..63e6ee1d6 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06014\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06014\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: d12359 Grid: true GridProjection: false 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 79f0e46c3..dc319bf71 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 4,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05009\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Neutral\",\n \"cost\": 4,\n \"traits\": \"Item. Weapon. Firearm.\",\n + \ \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: f4bac6 Grid: true GridProjection: false 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 16cecabb1..8fc0c3aed 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03157\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Fortune.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03157\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Fortune.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: '812685' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake 57668a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake 57668a.yaml index bbad8ac30..9ea92b132 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake 57668a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dexter Drake 57668a.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07004-m\",\r\n \"alternate_ids\": [\r\n \"98016-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"07004-m\",\n \"alternate_ids\": [\n \"98016-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 57668a Grid: true GridProjection: false 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 0b0629415..2e6f3d5af 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: true Description: The Magician DragSelectable: true -GMNotes: "{\r\n \"id\": \"07004\",\r\n \"alternate_ids\": [\r\n \"98016\"\r\n - \ ],\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" +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}" GUID: e015f8 Grid: true GridProjection: false 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 8d9ff4496..e076560f1 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Redeemed Cultist DragSelectable: true -GMNotes: "{\r\n \"id\": \"05004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Cultist. Silver Twilight.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +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}" 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 e15af1fab..1b096fdb8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50009\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: 0414b4 Grid: true GridProjection: false 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 8a111c324..8f0add130 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07270\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"replenish\": 2,\r\n \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07270\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"agilityIcons\": 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": + 2,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 734b45 Grid: true GridProjection: false 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 894887233..27684f84a 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01077\",\r\n \"alternate_ids\": [\r\n \"01577\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01077\",\n \"alternate_ids\": [\n \"01577\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Talent.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: fc9e1b Grid: true GridProjection: false 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 3c4e7b5b2..1a59ad67a 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"87032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Science. Tool. Future.\",\r\n \"wildIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"87032\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Science. Tool. Future.\",\n \"wildIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: fb4fff Grid: true GridProjection: false 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 6b1943b1a..3f85bbc97 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 07e7bd.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Leave No Doubt DragSelectable: true -GMNotes: "{\r\n \"id\": \"90029\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90029\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 07e7bd Grid: true GridProjection: false 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 448b16ca4..ffef6be68 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 0994c9.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Seek the Truth DragSelectable: true -GMNotes: "{\r\n \"id\": \"90028\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90028\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 0994c9 Grid: true GridProjection: false 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 23918d2f4..b85d48156 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 133521.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Due Diligence DragSelectable: true -GMNotes: "{\r\n \"id\": \"90025\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90025\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: '133521' Grid: true GridProjection: false 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 91d2aa2f1..a250fe822 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 2d9256.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Consult Experts DragSelectable: true -GMNotes: "{\r\n \"id\": \"90027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90027\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 2d9256 Grid: true GridProjection: false 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 692ff2709..061c8810f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Directive 706176.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Red Tape DragSelectable: true -GMNotes: "{\r\n \"id\": \"90026\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90026\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: '706176' Grid: true GridProjection: false 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 2f73eca5b..f3ec913f9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09073\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Talent. Trick. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09073\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Talent. Trick. Illicit.\",\n \"combatIcons\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: fa1be0 Grid: true GridProjection: false 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 64d17adf6..a31867e54 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Protective Amulet DragSelectable: true -GMNotes: "{\r\n \"id\": \"01041\",\r\n \"alternate_ids\": [\r\n \"01541\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 3,\r\n - \ \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01041\",\n \"alternate_ids\": [\n \"01541\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Seeker\",\n \"cost\": 3,\n + \ \"level\": 2,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: b00b76 Grid: true GridProjection: false 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 5f6b3829b..d7a1253d1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Protective Amulet DragSelectable: true -GMNotes: "{\r\n \"id\": \"60207\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60207\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: d6c44a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Discipline 081db4.yaml b/unpacked/Bag All Player Cards 15bb07/Card Discipline 081db4.yaml index 2a53e8048..5ac68e7b8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Discipline 081db4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Discipline 081db4.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Quiescence of Thought DragSelectable: true -GMNotes: "{\r\n \"id\": \"08012a\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Unbroken.\",\r\n \"permanent\": true,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08012a\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Unbroken.\",\n \"permanent\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 081db4 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Discipline 3247da.yaml b/unpacked/Bag All Player Cards 15bb07/Card Discipline 3247da.yaml index 13c286488..8756aec6c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Discipline 3247da.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Discipline 3247da.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Balance of Body DragSelectable: true -GMNotes: "{\r\n \"id\": \"08014a\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Unbroken.\",\r\n \"permanent\": true,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08014a\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Unbroken.\",\n \"permanent\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 3247da Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Discipline 5ff3bd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Discipline 5ff3bd.yaml index c9055f629..f9a0b4c4a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Discipline 5ff3bd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Discipline 5ff3bd.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Alignment of Spirit DragSelectable: true -GMNotes: "{\r\n \"id\": \"08011a\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Unbroken.\",\r\n \"permanent\": true,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08011a\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Unbroken.\",\n \"permanent\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 5ff3bd Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Discipline e8d38d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Discipline e8d38d.yaml index a565c20d7..859846b0d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Discipline e8d38d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Discipline e8d38d.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Prescience of Fate DragSelectable: true -GMNotes: "{\r\n \"id\": \"08013a\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Unbroken.\",\r\n \"permanent\": true,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08013a\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Unbroken.\",\n \"permanent\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: e8d38d Grid: true GridProjection: false 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 930308ff0..51dba6253 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Disguise f170fc.yaml @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09062\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Talent. Trick. Illicit.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09062\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Talent. Trick. Illicit.\",\n \"agilityIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: f170fc Grid: true GridProjection: false 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 5cfaef23a..001606088 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"09043\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tool. Science.\",\n \"agilityIcons\": - 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Evidence\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" +GMNotes: "{\n \"id\": \"09043\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Science.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: 95ca5d Grid: true GridProjection: false 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 56f60f4a8..f008e80a4 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08101\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Augury.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08101\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker|Mystic\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": + \"Spell. Augury.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: '658588' Grid: true GridProjection: false 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 0fcf56c06..0c08b27d0 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08103\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell. Augury.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08103\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker|Mystic\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": + \"Spell. Augury.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 6,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 58f2af Grid: true GridProjection: false 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 f47332460..346cd3d5c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08026\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08026\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 9ab750 Grid: true GridProjection: false 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 00995cc99..d27d06d33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dodge e0dff3.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01023\",\r\n \"alternate_ids\": [\r\n \"60113\",\r\n - \ \"01523\"\r\n ],\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01023\",\n \"alternate_ids\": [\n \"60113\",\n \"01523\"\n + \ ],\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": + 0,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n + \ \"cycle\": \"Core\"\n}" GUID: e0dff3 Grid: true GridProjection: false 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 2549c8c5f..b179d07c4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Doomed ba2ae1.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"04040\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"The Forgotten Age\"\n}" GUID: ba2ae1 Grid: true GridProjection: false 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 59fade4c3..1950fd3b5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02026\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02026\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Fortune.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: efb09b Grid: true GridProjection: false 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 b14d22c29..f7e87168c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05320\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05320\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 0e0530 Grid: true GridProjection: false 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 b9c6f4044..de8bd8d1e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08059\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08059\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: b925fc Grid: true GridProjection: false 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 af271360f..badf50220 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09097\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Item. Charm.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09097\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Item. + Charm.\",\n \"intellectIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: bcb13d Grid: true GridProjection: false 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 325207628..45b24d739 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09083\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09083\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 851e3a Grid: true GridProjection: false 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 89c9ef792..991c7ca1f 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 105 +CardID: 12105 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Knows His Purpose DragSelectable: true -GMNotes: "{\n \"id\": \"10041\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. Science.\",\n \"intellectIcons\": - 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10041\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Science.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The + Feast of Hemlock Vale\"\n}" GUID: 72efed Grid: true GridProjection: false 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 796619c57..6cea830ef 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '"Cryptozoologist"' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09764\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Scholar.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09764\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Scholar.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: c76a06 Grid: true GridProjection: false 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 72a680208..91783c583 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Assistant Curator DragSelectable: true -GMNotes: "{\r\n \"id\": \"04021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Assistant.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04021\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Assistant.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 27e7b3 Grid: true GridProjection: false 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 94bd6b317..07b8d1113 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Professor of Archaeology DragSelectable: true -GMNotes: "{\r\n \"id\": \"02080\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"combatIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02080\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Miskatonic.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: f03306 Grid: true GridProjection: false 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 138d60822..add91b840 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Head Librarian DragSelectable: true -GMNotes: "{\r\n \"id\": \"02040\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"wildIcons\": 2,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02040\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Miskatonic.\",\n \"wildIcons\": 2,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 9229a8 Grid: true GridProjection: false 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 bee22d5cf..f420a8850 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Professor of Entomology DragSelectable: true -GMNotes: "{\r\n \"id\": \"01033\",\r\n \"alternate_ids\": [\r\n \"01533\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 4,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01033\",\n \"alternate_ids\": [\n \"01533\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": + 0,\n \"traits\": \"Ally. Miskatonic.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 9934d2 Grid: true GridProjection: false 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 6e4c76108..cc67a17f7 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Working on Something Bigger DragSelectable: true -GMNotes: "{\r\n \"id\": \"09054\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09054\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Ally. + Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 3ee7a5 Grid: true GridProjection: false 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 c657ec7c6..d24c95a14 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Working on Something Big DragSelectable: true -GMNotes: "{\r\n \"id\": \"02302\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02302\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 14d04f Grid: true GridProjection: false 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 6ba152b7a..d19b7177d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08060\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08060\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 331b58 Grid: true GridProjection: false 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 7a4103602..f63b30370 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05159\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05159\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 6d9881 Grid: true GridProjection: false 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 a8db91212..47de6c231 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"03041\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact. Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03041\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact. Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 438cca Grid: true GridProjection: false 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 9223dfa2e..4a23c65a2 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01064\",\r\n \"alternate_ids\": [\r\n \"01564\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01064\",\n \"alternate_ids\": [\n \"01564\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Insight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: a8298f Grid: true GridProjection: false 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 94319bf48..737f17807 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07039\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07039\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 2,\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: c54d7e Grid: true GridProjection: false 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 b385dd710..f36437386 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Gift of the Void DragSelectable: true -GMNotes: "{\r\n \"id\": \"86053\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 2,\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"86053\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": 2,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: 1a94ad Grid: true GridProjection: false 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 24f592ce4..579563eed 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Dreams of an Explorer DragSelectable: true -GMNotes: "{\r\n \"id\": \"06236\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome. Charm.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06113\"\r\n }\r\n ],\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06236\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: 5f9a10 Grid: true GridProjection: false 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 ebdd78c8f..3df303483 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Dreams of a Madman DragSelectable: true -GMNotes: "{\r\n \"id\": \"06237\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome. Charm.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06113\"\r\n }\r\n ],\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06237\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: e5f9cb Grid: true GridProjection: false 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 6baf8359b..fad480ae5 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Dreams of a Child DragSelectable: true -GMNotes: "{\r\n \"id\": \"06238\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome. Charm.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06113\"\r\n }\r\n ],\r\n - \ \"willpowerIcons\": 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06238\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: ea40f6 Grid: true GridProjection: false 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 1662cba17..98f7b04e0 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Untranslated DragSelectable: true -GMNotes: "{\r\n \"id\": \"06112\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome. Charm.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06113\"\r\n }\r\n ],\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06112\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Charm.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06113\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b81dcf Grid: true GridProjection: false 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 2f8db23d9..7d725a185 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06331\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"wildIcons\": 2,\r\n \"negativeIcons\": - true,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06331\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"wildIcons\": 2,\n \"negativeIcons\": + true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ae16e8 Grid: true GridProjection: false 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 ebffb3e16..3b66ac9cf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06159\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Science.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06159\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Science.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 98c5af Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml index 4758ec56f..6f242b76e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dream-Gate fa4c1e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06015a\",\r\n \"alternate_ids\": [\r\n \"06015b\"\r\n - \ ],\r\n \"type\": \"Location\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Dreamlands.\",\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06015a\",\n \"alternate_ids\": [\n \"06015b\"\n ],\n + \ \"type\": \"Location\",\n \"class\": \"Neutral\",\n \"traits\": \"Dreamlands.\",\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: fa4c1e Grid: true GridProjection: false 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 8526200b5..6257c07c1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98015\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"wildIcons\": 2,\r\n \"negativeIcons\": - true,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98015\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"wildIcons\": 2,\n \"negativeIcons\": + true,\n \"cycle\": \"Promo\"\n}" GUID: 13eaf0 Grid: true GridProjection: false 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 78de9e0dc..b1ed6bd4a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Duke 876557.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02014\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Creature.\",\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02014\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Creature.\",\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: '876557' Grid: true GridProjection: false 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 08ab92c5e..3f9d926d4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60525\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60525\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Fortune.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 0c433b Grid: true GridProjection: false 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 ad31042e8..790917457 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04034\",\r\n \"alternate_ids\": [\r\n \"60514\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"agilityIcons\": 2,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04034\",\n \"alternate_ids\": [\n \"60514\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Fortune.\",\n \"agilityIcons\": 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: f0e425 Grid: true GridProjection: false 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 5c23f2c9e..a4ab2443e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08733\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08733\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Insight.\",\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: b12d89 Grid: true GridProjection: false 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 b11894768..2fc30d0f1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Dynamite 793df5.yaml @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08616\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Expedition.\",\r\n \"combatIcons\": 2,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08616\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Expedition.\",\n \"combatIcons\": 2,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 793df5 Grid: true GridProjection: false 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 608446ed7..5316a66e7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50002\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50002\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: e35bc2 Grid: true GridProjection: false 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 350c5959d..d02055c9f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60129\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60129\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 14dcc4 Grid: true GridProjection: false 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 1898adb56..d88df7b0e 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01024\",\r\n \"alternate_ids\": [\r\n \"01524\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 5,\r\n - \ \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01024\",\n \"alternate_ids\": [\n \"01524\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Guardian\",\n \"cost\": 5,\n \"level\": 0,\n \"traits\": + \"Tactic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 97986a Grid: true GridProjection: false 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 14adfcf17..b68f7a20f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60531\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 5,\r\n \"traits\": \"Talent. Cursed.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60531\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"level\": 5,\n \"traits\": \"Talent. Cursed.\",\n \"permanent\": true,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 719a45 Grid: true GridProjection: false 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 e93190522..4aade2321 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Smarter Than He Lets On DragSelectable: true -GMNotes: "{\r\n \"id\": \"02218\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Dunwich.\",\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02218\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Dunwich.\",\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: f14dce Grid: true GridProjection: false 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 eb77bb5e1..f9b03e8b0 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic|Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08117\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic|Survivor\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 1d6d47 Grid: true GridProjection: false 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 da2466336..120b139a1 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08119\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic|Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08119\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic|Survivor\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 2,\n \"uses\": [\n {\n \"count\": 6,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 57f037 Grid: true GridProjection: false 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 e73a2c49a..db53524c2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06026\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06026\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: cdbb37 Grid: true GridProjection: false 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 07807da76..2e347d43b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03304\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03304\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: fc2629 Grid: true GridProjection: false 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 d2c243c1f..0f5a121a1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52002\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52002\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: a2c7ef Grid: true GridProjection: false 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 f78d580b2..e36be7c8b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eavesdrop 256da2.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04027\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04027\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight. Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 256da2 Grid: true GridProjection: false 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 086661c9a..6262bf7b9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"09127\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Geist.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09127\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Geist.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '379582' Grid: true GridProjection: false 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 4472f9b9f..ca01948f0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03306\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03306\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"level\": 3,\n \"traits\": \"Spirit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 814ce2 Grid: true GridProjection: false 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 6f4b8df8d..1b99cba86 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01095\",\r\n \"alternate_ids\": [\r\n \"01595\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 2,\r\n - \ \"level\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01095\",\n \"alternate_ids\": [\n \"01595\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Neutral\",\n \"cost\": 2,\n + \ \"level\": 3,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 324e49 Grid: true GridProjection: false 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 9e1f3c698..633f864b1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09086\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09086\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 223eb2 Grid: true GridProjection: false 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 5b151a9c6..852de8f22 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60420\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60420\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Spell. Spirit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: e84eff Grid: true GridProjection: false 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 a782a8fb8..bd71d7b03 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05033\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05033\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spell. Spirit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 24eb36 Grid: true GridProjection: false 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 246830662..2b600c373 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Knows Too Much DragSelectable: true -GMNotes: "{\r\n \"id\": \"07083\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Agency. Detective.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07083\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Agency. Detective.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 7e2896 Grid: true GridProjection: false 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 8a871d3d3..11109bd18 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Purifying Purpose DragSelectable: true -GMNotes: "{\r\n \"id\": \"09092\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Witch.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09092\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ally. + Witch.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: 43c3e0 Grid: true GridProjection: false 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 09fe0c66a..aad9b7529 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08734\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Clothing. Footwear.\",\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08734\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Clothing. Footwear.\",\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 1c751d Grid: true GridProjection: false 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 c8e27a5e2..92723b648 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Elusive 833305.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01050\",\r\n \"alternate_ids\": [\r\n \"01550\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01050\",\n \"alternate_ids\": [\n \"01550\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Tactic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: '833305' Grid: true GridProjection: false 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 369fcb1c0..d4207ccb9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02105\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Science.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02105\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Science.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 9c46da Grid: true GridProjection: false 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 b62ea2476..dc4dcb469 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02194\",\r\n \"alternate_ids\": [\r\n \"01693\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 0,\r\n - \ \"level\": 2,\r\n \"traits\": \"Supply.\",\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02194\",\n \"alternate_ids\": [\n \"01693\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Neutral\",\n \"cost\": 0,\n \"level\": 2,\n \"traits\": + \"Supply.\",\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 8948c4 Grid: true GridProjection: false 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 86a572755..56d6ddce6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01088\",\r\n \"alternate_ids\": [\r\n \"01588\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Supply.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01088\",\n \"alternate_ids\": [\n \"01588\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Neutral\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Supply.\",\n \"cycle\": \"Core\"\n}" GUID: 510c0d Grid: true GridProjection: false 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 new file mode 100644 index 000000000..087ae4f02 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.ttslua @@ -0,0 +1,999 @@ +-- 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("__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) +local playmatApi = require("playermat/PlaymatApi") +local upgradeSheetLibrary = require("playercards/customizable/UpgradeSheetLibrary") + +-- common button parameters +local buttonParameters = {} +buttonParameters.function_owner = self +buttonParameters.height = 160 +buttonParameters.width = 1000 +buttonParameters.font_size = 84 +buttonParameters.font_color = { 1.0, 1.0, 1.0 } +buttonParameters.color = Color.Black +buttonParameters.position = {} +buttonParameters.position.x = 0 +buttonParameters.position.y = 0.6 +buttonParameters.position.z = -1.05 +initialButtonPosition = buttonParameters.position.z + +-- vertical offset between buttons +local verticalOffset = 0.325 + +-- list of customizable labels +local customizableList = { + 'Run out of cards in hand', + 'Take damage/horror', + 'Discard treachery/enemy', + 'Enter 3 or more shroud' +} + +-- index of the currently selected button (0-indexed from the top) +local activeButtonIndex + +function onSave() + return JSON.encode(activeButtonIndex) +end + +function onLoad(savedData) + self.addContextMenuItem("Enable Helper", createButtons) + self.addContextMenuItem("Clear Helper", deleteButtons) + + activeButtonIndex = JSON.decode(savedData) + if activeButtonIndex and activeButtonIndex ~= "" then + local tempButtonIndex = activeButtonIndex + createButtons() + if tempButtonIndex >= 0 then + selectButton(tempButtonIndex) + end + end +end + +-- marks a button as active +---@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 + local color = Color.Black + if i == index then + color = Color.Red + activeButtonIndex = i + end + self.editButton({ index = i, color = color }) + end +end + +function deleteButtons() + self.clearButtons() + self.clearContextMenu() + self.addContextMenuItem("Enable Helper", createButtons) + buttonParameters.position.z = initialButtonPosition -- reset the z position +end + +-- Create buttons based on the button parameters +function createButtons() + self.clearContextMenu() + self.addContextMenuItem("Clear Helper", deleteButtons) + + -- reset the list in case of addition of checkboxes or Refine + hypothesisList = { + 'Succeed by 3 or more', + 'Fail by 2 or more' + } + + -- set activeButtonIndex to restore state onLoad ("-1" -> nothing selected) + activeButtonIndex = -1 + + -- get the upgradesheet and check for more conditions + local upgradeSheet = findUpgradeSheet() + if upgradeSheet then + for i = 1, 4 do + if upgradeSheet.call("isUpgradeActive", i) then + table.insert(hypothesisList, customizableList[i]) + end + end + end + + for i, label in ipairs(hypothesisList) do + buttonParameters.click_function = "selectButton" .. i + self.setVar(buttonParameters.click_function, function() selectButton(i - 1) end) + buttonParameters.label = label + self.createButton(buttonParameters) + buttonParameters.position.z = buttonParameters.position.z + verticalOffset + end +end + +function findUpgradeSheet() + local matColor = playmatApi.getMatColorByPosition(self.getPosition()) + local result = playmatApi.searchAroundPlaymat(matColor, "isCard") + for j, card in ipairs(result) do + local metadata = JSON.decode(card.getGMNotes()) or {} + if metadata.id == "09041-c" then + return card + end + end +end +end) +__bundle_register("playercards/customizable/UpgradeSheetLibrary", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Common code for handling customizable card upgrade sheets +-- Define UI elements in the base card file, then include this +-- UI element definition is an array of tables, each with this structure. A row may include +-- checkboxes (number defined by count), a text field, both, or neither (if the row has custom +-- handling, as Living Ink does) +-- { +-- checkboxes = { +-- posZ = -0.71, +-- count = 1, +-- }, +-- textField = { +-- position = { 0.005, 0.25, -0.58 }, +-- width = 875 +-- } +-- } +-- Fields should also be defined for xInitial (left edge of the checkboxes) and xOffset (amount to +-- shift X from one box to the next) as well as boxSize (checkboxes) and inputFontSize. +-- +-- selectedUpgrades holds the state of checkboxes and text input, each element being: +-- selectedUpgrades[row] = { xp = #, text = "" } + +local playmatApi = require("playermat/PlaymatApi") + +-- Y position for UI elements. Visibility of checkboxes moves the checkbox inside the card object +-- when not selected. +local Y_VISIBLE = 0.25 +local Y_INVISIBLE = -0.5 + +-- Used for Summoned Servitor and Living Ink +local VECTOR_COLOR = { + unselected = { 0.5, 0.5, 0.5, 0.75 }, + mystic = { 0.597, 0.195, 0.796 } +} + +-- These match with ArkhamDB's way of storing the data in the dropdown menu +local SUMMONED_SERVITOR_SLOT_INDICES = { arcane = "1", ally = "0", none = "" } + +local rowCheckboxFirstIndex = { } +local rowInputIndex = { } +local selectedUpgrades = { } + +-- save state when going into bags / decks +function onDestroy() self.script_state = onSave() end + +function onSave() + return JSON.encode({ + selections = selectedUpgrades + }) +end + +-- Startup procedure +function onLoad(savedData) + if savedData ~= "" then + local loadedData = JSON.decode(savedData) + if loadedData.selections ~= nil then + selectedUpgrades = loadedData.selections + end + end + + selfId = getSelfId() + + maybeLoadLivingInkSkills() + createUi() + maybeUpdateLivingInkSkillDisplay() + maybeUpdateServitorSlotDisplay() + + self.addContextMenuItem("Clear Selections", function() resetSelections() end) + self.addContextMenuItem("Scale: 1x", function() self.setScale({ 1, 1, 1 }) end) + self.addContextMenuItem("Scale: 2x", function() self.setScale({ 2, 1, 2 }) end) + self.addContextMenuItem("Scale: 3x", function() self.setScale({ 3, 1, 3 }) end) +end + +-- Grabs the ID from the metadata for special functions (Living Ink, Summoned Servitor) +function getSelfId() + local metadata = JSON.decode(self.getGMNotes()) + return metadata.id +end + +function isUpgradeActive(row) + return customizations[row] ~= nil + and customizations[row].checkboxes ~= nil + and customizations[row].checkboxes.count ~= nil + and customizations[row].checkboxes.count > 0 + and selectedUpgrades[row] ~= nil + and selectedUpgrades[row].xp ~= nil + and selectedUpgrades[row].xp >= customizations[row].checkboxes.count +end + +function resetSelections() + selectedUpgrades = { } + updateDisplay() +end + +function createUi() + if customizations == nil then + return + end + for i = 1, #customizations do + if customizations[i].checkboxes ~= nil then + createRowCheckboxes(i) + end + if customizations[i].textField ~= nil then + createRowTextField(i) + end + end + maybeMakeLivingInkSkillSelectionButtons() + maybeMakeServitorSlotSelectionButtons() + updateDisplay() +end + +function createRowCheckboxes(rowIndex) + local checkboxes = customizations[rowIndex].checkboxes + rowCheckboxFirstIndex[rowIndex] = 0 + local previousButtons = self.getButtons() + if previousButtons ~= nil then + rowCheckboxFirstIndex[rowIndex] = #previousButtons + end + for col = 1, checkboxes.count do + local funcName = "checkboxRow" .. rowIndex .. "Col" .. col + local func = function() clickCheckbox(rowIndex, col) end + self.setVar(funcName, func) + local checkboxPos = getCheckboxPosition(rowIndex, col) + + self.createButton({ + click_function = funcName, + function_owner = self, + position = checkboxPos, + height = boxSize * 10, + width = boxSize * 10, + font_size = 1000, + scale = { 0.1, 0.1, 0.1 }, + color = { 0, 0, 0 }, + font_color = { 0, 0, 0 } + }) + end +end + +function getCheckboxPosition(row, col) + return { + x = xInitial + col * xOffset, + y = Y_VISIBLE, + z = customizations[row].checkboxes.posZ + } +end + +function createRowTextField(rowIndex) + local textField = customizations[rowIndex].textField + + rowInputIndex[rowIndex] = 0 + local previousInputs = self.getInputs() + if previousInputs ~= nil then + rowInputIndex[rowIndex] = #previousInputs + end + local funcName = "textbox" .. rowIndex + local func = function(_, _, val, sel) clickTextbox(rowIndex, val, sel) end + self.setVar(funcName, func) + + self.createInput({ + input_function = funcName, + function_owner = self, + label = "Click to type", + alignment = 2, + position = textField.position, + scale = { 0.1, 0.1, 0.1 }, + width = textField.width * 10, + height = inputFontsize * 10 + 75, + font_size = inputFontsize * 10.5, + color = "White", + value = "" + }) +end + +function updateDisplay() + for i = 1, #customizations do + updateRowDisplay(i) + end + maybeUpdateLivingInkSkillDisplay() + maybeUpdateServitorSlotDisplay() +end + +function updateRowDisplay(rowIndex) + if customizations[rowIndex].checkboxes ~= nil then + updateCheckboxes(rowIndex) + end + if customizations[rowIndex].textField ~= nil then + updateTextField(rowIndex) + end +end + +function updateCheckboxes(rowIndex) + local checkboxCount = customizations[rowIndex].checkboxes.count + local selected = 0 + if selectedUpgrades[rowIndex] ~= nil and selectedUpgrades[rowIndex].xp ~= nil then + selected = selectedUpgrades[rowIndex].xp + end + local checkboxIndex = rowCheckboxFirstIndex[rowIndex] + for col = 1, checkboxCount do + local pos = getCheckboxPosition(rowIndex, col) + if col <= selected then + pos.y = Y_VISIBLE + else + pos.y = Y_INVISIBLE + end + self.editButton({ + index = checkboxIndex, + position = pos + }) + checkboxIndex = checkboxIndex + 1 + end +end + +function updateTextField(rowIndex) + local inputIndex = rowInputIndex[rowIndex] + if selectedUpgrades[rowIndex] ~= nil and selectedUpgrades[rowIndex].text ~= nil then + self.editInput({ + index = inputIndex, + value = " " .. selectedUpgrades[rowIndex].text + }) + end +end + +function clickCheckbox(row, col, buttonIndex) + if selectedUpgrades[row] == nil then + selectedUpgrades[row] = { } + selectedUpgrades[row].xp = 0 + end + if selectedUpgrades[row].xp == col then + selectedUpgrades[row].xp = col - 1 + else + selectedUpgrades[row].xp = col + end + updateCheckboxes(row) + playmatApi.syncAllCustomizableCards() +end + +-- Updates saved value for given text box when it loses focus +function clickTextbox(rowIndex, value, selected) + if selected == false then + if selectedUpgrades[rowIndex] == nil then + selectedUpgrades[rowIndex] = { } + end + selectedUpgrades[rowIndex].text = value:gsub("^%s*(.-)%s*$", "%1") + -- Editing isn't actually done yet, and will block the update. Wait a frame so it's finished + Wait.frames(function() updateRowDisplay(rowIndex) end, 1) + end +end + +--------------------------------------------------------- +-- Living Ink related functions +--------------------------------------------------------- + +-- Builds the list of boolean skill selections from the Row 1 text field +function maybeLoadLivingInkSkills() + if selfId ~= "09079-c" then return end + selectedSkills = { + willpower = false, + intellect = false, + combat = false, + agility = false + } + if selectedUpgrades[1] ~= nil and selectedUpgrades[1].text ~= nil then + for skill in string.gmatch(selectedUpgrades[1].text, "([^,]+)") do + selectedSkills[skill] = true + end + end +end + +function clickSkill(skillname) + selectedSkills[skillname] = not selectedSkills[skillname] + maybeUpdateLivingInkSkillDisplay() + updateSelectedLivingInkSkillText() +end + +-- Creates the invisible buttons overlaying the skill icons +function maybeMakeLivingInkSkillSelectionButtons() + if selfId ~= "09079-c" then return end + + local buttonData = { + function_owner = self, + position = { y = 0.2 }, + height = 130, + width = 130, + color = { 0, 0, 0, 0 }, + } + + for skillname, _ in pairs(selectedSkills) do + local funcName = "clickSkill" .. skillname + self.setVar(funcName, function() clickSkill(skillname) end) + + buttonData.click_function = funcName + buttonData.position.x = -1 * SKILL_ICON_POSITIONS[skillname].x + buttonData.position.z = SKILL_ICON_POSITIONS[skillname].z + self.createButton(buttonData) + end +end + +-- Builds a comma-delimited string of skills and places it in the Row 1 text field +function updateSelectedLivingInkSkillText() + local skillString = "" + if selectedSkills.willpower then + skillString = skillString .. "willpower" .. "," + end + if selectedSkills.intellect then + skillString = skillString .. "intellect" .. "," + end + if selectedSkills.combat then + skillString = skillString .. "combat" .. "," + end + if selectedSkills.agility then + skillString = skillString .. "agility" .. "," + end + if selectedUpgrades[1] == nil then + selectedUpgrades[1] = { } + end + selectedUpgrades[1].text = skillString +end + +-- Refresh the vector circles indicating a skill is selected. Since we can only have one table of +-- vectors set, have to refresh all 4 at once +function maybeUpdateLivingInkSkillDisplay() + if selfId ~= "09079-c" then return end + local circles = {} + for skill, isSelected in pairs(selectedSkills) do + if isSelected then + local circle = getCircleVector(SKILL_ICON_POSITIONS[skill]) + if circle ~= nil then + table.insert(circles, circle) + end + end + end + self.setVectorLines(circles) +end + +function getCircleVector(center) + local diameter = Vector(0, 0, 0.1) + local pointOfOrigin = Vector(center.x, Y_VISIBLE, center.z) + local vec + local vecList = {} + local arcStep = 5 + for i = 0, 360, arcStep do + diameter:rotateOver('y', arcStep) + vec = pointOfOrigin + diameter + vec.y = pointOfOrigin.y + table.insert(vecList, vec) + end + + return { + points = vecList, + color = VECTOR_COLOR.mystic, + thickness = 0.02, + } +end + +--------------------------------------------------------- +-- Summoned Servitor related functions +--------------------------------------------------------- + +-- Creates the invisible buttons overlaying the slot words +function maybeMakeServitorSlotSelectionButtons() + if selfId ~= "09080-c" then return end + + local buttonData = { + click_function = "clickArcane", + function_owner = self, + position = { x = -1 * SLOT_ICON_POSITIONS.arcane.x, y = 0.2, z = SLOT_ICON_POSITIONS.arcane.z }, + height = 130, + width = 130, + color = { 0, 0, 0, 0 }, + } + self.createButton(buttonData) + + buttonData.click_function = "clickAlly" + buttonData.position.x = -1 * SLOT_ICON_POSITIONS.ally.x + self.createButton(buttonData) +end + +-- toggles the clicked slot +function clickArcane() + if selectedUpgrades[6] == nil then + selectedUpgrades[6] = { } + end + if selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.arcane then + selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.none + else + selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.arcane + end + maybeUpdateServitorSlotDisplay() +end + +-- toggles the clicked slot +function clickAlly() + if selectedUpgrades[6] == nil then + selectedUpgrades[6] = { } + end + if selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.ally then + selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.none + else + selectedUpgrades[6].text = SUMMONED_SERVITOR_SLOT_INDICES.ally + end + maybeUpdateServitorSlotDisplay() +end + +-- Refresh the vector circles indicating a slot is selected. +function maybeUpdateServitorSlotDisplay() + if selfId ~= "09080-c" then return end + + local center = SLOT_ICON_POSITIONS["arcane"] + local arcaneVecList = { + Vector(center.x + 0.12, Y_VISIBLE, center.z + 0.05), + Vector(center.x - 0.12, Y_VISIBLE, center.z + 0.05), + Vector(center.x - 0.12, Y_VISIBLE, center.z - 0.05), + Vector(center.x + 0.12, Y_VISIBLE, center.z - 0.05), + Vector(center.x + 0.12, Y_VISIBLE, center.z + 0.05), + } + + center = SLOT_ICON_POSITIONS["ally"] + local allyVecList = { + Vector(center.x + 0.07, Y_VISIBLE, center.z + 0.05), + Vector(center.x - 0.07, Y_VISIBLE, center.z + 0.05), + Vector(center.x - 0.07, Y_VISIBLE, center.z - 0.05), + Vector(center.x + 0.07, Y_VISIBLE, center.z - 0.05), + Vector(center.x + 0.07, Y_VISIBLE, center.z + 0.05), + } + + local arcaneVecColor = VECTOR_COLOR.unselected + local allyVecColor = VECTOR_COLOR.unselected + + if selectedUpgrades[6] ~= nil and selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.arcane then + arcaneVecColor = VECTOR_COLOR.mystic + elseif selectedUpgrades[6] ~= nil and selectedUpgrades[6].text == SUMMONED_SERVITOR_SLOT_INDICES.ally then + allyVecColor = VECTOR_COLOR.mystic + end + + self.setVectorLines({ + { + points = arcaneVecList, + color = arcaneVecColor, + thickness = 0.02, + }, + { + points = allyVecList, + color = allyVecColor, + thickness = 0.02, + } + }) +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/Card Empirical Hypothesis 62c67d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Empirical Hypothesis 62c67d.yaml index 660b0f230..12f4c2f51 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 @@ -51,7 +51,7 @@ HideWhenFaceDown: true IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false -LuaScript: '' +LuaScript: !include 'Card Empirical Hypothesis 62c67d.ttslua' LuaScriptState: '' MeasureMovement: false Name: Card 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 4704c72e3..74fa1e3ca 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Acuity DragSelectable: true -GMNotes: "{\r\n \"id\": \"06243\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06243\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"intellectIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 3d22c4 Grid: true GridProjection: false 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 6175ebd16..67fecd194 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Alacrity DragSelectable: true -GMNotes: "{\r\n \"id\": \"06242\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06242\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"agilityIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 4c0f00 Grid: true GridProjection: false 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 2652e2b86..989421a02 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Stamina DragSelectable: true -GMNotes: "{\r\n \"id\": \"06241\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06241\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"combatIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ffe4dd Grid: true GridProjection: false 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 ce97735a9..a03b16699 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 @@ -19,12 +19,12 @@ CustomDeck: UniqueBack: false Description: Abandoned by the Gods DragSelectable: true -GMNotes: "{\r\n \"id\": \"06276\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Relic. Blessed.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06277\"\r\n }\r\n - \ ],\r\n \"willpowerIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 0,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06276\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. + Relic. Blessed.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06277\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 0,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: c0d236 Grid: true GridProjection: false 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 1f9ad9386..738b805ed 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07261\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell. Upgrade.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07261\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell. Upgrade.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 33455f Grid: true GridProjection: false 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 8eee8286b..db380fb9a 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07189\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Ritual. Armor.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07189\",\n \"type\": \"Asset\",\n \"slot\": \"Body|Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Ritual. + Armor.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: 9509e3 Grid: true GridProjection: false 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 fbdc8c5bf..c980bcbd3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Guardian DragSelectable: true -GMNotes: "{\r\n \"id\": \"05192\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05192\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Weapon. Melee.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: 84b918 Grid: true GridProjection: false 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 e0c856ad2..1482c02db 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Mystic DragSelectable: true -GMNotes: "{\r\n \"id\": \"05193\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 4,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05193\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Weapon. Melee.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: d0de54 Grid: true GridProjection: false 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 80317e597..0c14bbf06 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05118\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic|Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05118\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Mystic|Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Item. Relic. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: c7d9b5 Grid: true GridProjection: false 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 01609935e..aac555435 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08118\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Blessed. Weapon. Ranged.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08118\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2|Arcane\",\n + \ \"class\": \"Mystic|Survivor\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": + \"Spell. Blessed. Weapon. Ranged.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: f85d4e Grid: true GridProjection: false 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 960a04596..d88c7b7e1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Mask of the Burning Pit DragSelectable: true -GMNotes: "{\r\n \"id\": \"86055\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": 2,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"86055\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"intellectIcons\": 2,\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: a4775a Grid: true GridProjection: false 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 aae936db7..7f04f6d00 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01042\",\r\n \"alternate_ids\": [\r\n \"01542\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01042\",\n \"alternate_ids\": [\n \"01542\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": + 2,\n \"traits\": \"Item. Tome.\",\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: f5bcec Grid: true GridProjection: false 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 2388cee1e..fe5f7492a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Encyclopedia dbb0e0.yaml @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60208\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60208\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 5,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: dbb0e0 Grid: true GridProjection: false 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 8bd819348..5839fd83a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09104\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Spirit.\",\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09104\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: a3d041 Grid: true GridProjection: false 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 0fd890cbd..02bc5d654 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Enraptured a5c780.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04157\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04157\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: a5c780 Grid: true GridProjection: false 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 e2559a03c..cb84ae425 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08098\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08098\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker|Rogue\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: be4332 Grid: true GridProjection: false 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 4ef9276ad..26edb83d8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08100\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08100\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker|Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n + \ \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: d3ad2d Grid: true GridProjection: false 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 f598246e0..29fb24973 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: Devoted Enchantress DragSelectable: true -GMNotes: "{\r\n \"id\": \"54041\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Witch.\",\r\n \"willpowerIcons\": 2,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to the Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54041\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Witch.\",\n \"willpowerIcons\": 2,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 6abfbc Grid: true GridProjection: false 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 e6ffc242d..24b0785c1 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05232\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Item. Tome.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05232\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item. + Tome.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Circle + Undone\"\n}" GUID: 0ce005 Grid: true GridProjection: false 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 b1002d3c0..cc1a9d47b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60222\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60222\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 4,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Investigator Packs\"\n}" GUID: 2172e2 Grid: true GridProjection: false 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 7d7c40e81..a5f5d0f94 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06113\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"traits\": \"Practiced. Expert.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06113\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"traits\": \"Practiced. Expert.\",\n \"wildIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 6ad46b Grid: true GridProjection: false 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 a2c82a436..82fb1bdae 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06164\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06164\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: db90e2 Grid: true GridProjection: false 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 39dc7a7e2..74c3223e2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08110\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue|Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Trick.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08110\",\n \"type\": \"Event\",\n \"class\": \"Rogue|Mystic\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spell. Trick.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 39cb5b Grid: true GridProjection: false 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 155a7f822..ebc22ec9b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08108\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue|Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Trick.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08108\",\n \"type\": \"Event\",\n \"class\": \"Rogue|Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell. Trick.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 31539a Grid: true GridProjection: false 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 1427b98fe..6601026c2 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05324\",\r\n \"alternate_ids\": [\r\n \"01692\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 2,\r\n - \ \"level\": 3,\r\n \"traits\": \"Fortune. Blessed.\",\r\n \"wildIcons\": 2,\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05324\",\n \"alternate_ids\": [\n \"01692\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": + \"Fortune. Blessed.\",\n \"wildIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: eaaee9 Grid: true GridProjection: false 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 5f5c85b8b..d0c477c1d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Eureka! ffa4f9.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03231\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03231\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: ffa4f9 Grid: true GridProjection: false 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 24f4fae50..7186f1e32 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03023\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: bb640d Grid: true GridProjection: false 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 cc0039c53..7a54da930 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09039\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 4,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09039\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 4,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: ac910a Grid: true GridProjection: false 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 d5e8f90c4..3c80a5c6d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60120\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60120\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 3df5fb Grid: true GridProjection: false 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 3e81a6dd7..9ec267d86 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Evidence! 2db518.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01022\",\r\n \"alternate_ids\": [\r\n \"01522\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01022\",\n \"alternate_ids\": [\n \"01522\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Insight.\",\n \"intellectIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: 2db518 Grid: true GridProjection: false 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 1c502d378..5859cdd9f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09052\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Paradox.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09052\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight. Paradox.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 38a30a Grid: true GridProjection: false 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 76b5f976c..515924123 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09765\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Item.\",\r\n \"permanent\": true,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09765\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Item.\",\n \"permanent\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 8fbd1b Grid: true GridProjection: false 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 9af3595e1..bde7edc6f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04148\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": 2,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04148\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 2,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 9dc3d4 Grid: true GridProjection: false 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 3220e42f2..bd67dc8eb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06246\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Developed.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06246\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Developed.\",\n \"agilityIcons\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: ea8324 Grid: true GridProjection: false 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 c278f41fa..92fb0336b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09105\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Trick.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09105\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic. Trick.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: b6857b Grid: true GridProjection: false 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 21b5d7621..aabde5dca 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09087\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": 2,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09087\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Spell.\",\n \"combatIcons\": 2,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: f86c67 Grid: true GridProjection: false 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 bcd01a03c..3172be56b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02228\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02228\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 2e93fd Grid: true GridProjection: false 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 5c1b979b5..d89ce8743 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04195\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04195\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 77f92c Grid: true GridProjection: false 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 12cca9aee..74544b06d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06198\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 10,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06198\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 10,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 3dc25c Grid: true GridProjection: false 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 a6d88984c..f78155519 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60216\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 12,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60216\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 12,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: '013446' Grid: true GridProjection: false 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 e97e8ce74..c55318dd9 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01026\",\r\n \"alternate_ids\": [\r\n \"01526\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 2,\r\n - \ \"level\": 1,\r\n \"traits\": \"Supply.\",\r\n \"intellectIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Ammo\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01026\",\n \"alternate_ids\": [\n \"01526\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": + \"Supply.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Core\"\n}" GUID: f60263 Grid: true GridProjection: false 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 1310fe4fa..cee2f2b11 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07227\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 5,\r\n \"level\": 4,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07227\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 5,\n \"level\": 4,\n \"traits\": \"Spell. + Cursed.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n + \ {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: f68105 Grid: true GridProjection: false 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 0903a8965..836cc11eb 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07118\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 5,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07118\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 5,\n \"level\": 0,\n \"traits\": \"Spell. + Cursed.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 9a5782 Grid: true GridProjection: false 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 c15e957ea..cee70c1eb 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Vessel of Good and Evil DragSelectable: true -GMNotes: "{\r\n \"id\": \"07225\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic. Blessed. Cursed.\",\r\n - \ \"intellectIcons\": 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07225\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic. Blessed. Cursed.\",\n \"intellectIcons\": 2,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: df182a Grid: true GridProjection: false 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 163c53b6b..57821cbe6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Professor of the Arcane DragSelectable: true -GMNotes: "{\r\n \"id\": \"87023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Scientist. Ally. Present.\",\r\n \"intellectIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"87023\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Scientist. Ally. Present.\",\n \"intellectIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: efe0dd Grid: true GridProjection: false 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 e731c8630..af160444d 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06275\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06275\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 3bf831 Grid: true GridProjection: false 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 db4fd3b38..e14fe36e2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07116\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Covenant. Cursed.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07116\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Cursed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 3442f5 Grid: true GridProjection: false 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 951edd5f9..bf3440188 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60410\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Creature. Summon.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60410\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Ally. + Creature. Summon.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 971d52 Grid: true GridProjection: false 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 06784874e..74b4f587e 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,288 +41,12 @@ 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 - - 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 = {} - 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 - - -- 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 matchTypes 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("playercards/cards/FamilyInheritance") -end) -__bundle_register("playercards/cards/FamilyInheritance", function(require, _LOADED, __bundle_register, __bundle_modules) -local playmatApi = require("playermat/PlaymatApi") -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(searchArea(self.getPosition(), { 2.5, 0.5, 3.5 })) do - local obj = obj.hit_object - 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 - -function searchArea(origin, size) - return Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = PLAY_ZONE_ROTATION, - type = 3, - size = size, - max_distance = 1 - }) -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 = { @@ -477,7 +201,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -519,7 +243,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -728,7 +452,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -808,12 +532,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -845,28 +567,370 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, + return TokenManager +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 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 = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false + 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/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 TokenManager + 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 = {} + 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("__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 @@ -961,6 +1025,26 @@ do 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) @@ -1046,6 +1130,15 @@ do 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 @@ -1055,6 +1148,22 @@ do 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) @@ -1065,7 +1174,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 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 1b6a83c98..680789afc 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 @@ -20,9 +20,9 @@ CustomDeck: Description: '' DragSelectable: true GMNotes: "{\n \"id\": \"05011\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n - \ \"traits\": \"Boon.\",\n \"permanent\": true,\n \"uses\": [\n {\n \"count\": - 0,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n - \ \"cycle\": \"The Circle Undone\"\n}" + \ \"startsInPlay\": true,\n \"traits\": \"Boon.\",\n \"permanent\": true,\n \"uses\": + [\n {\n \"count\": 0,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: '394603' Grid: true GridProjection: false 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 119291236..361dd1c04 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08029\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08029\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Spell.\",\n \"combatIcons\": 2,\n + \ \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: e2dc13 Grid: true GridProjection: false 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 cf15cecc9..53238754e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60231\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60231\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: b4121c Grid: true GridProjection: false 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 933402ab0..69cc601d2 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Priest DragSelectable: true -GMNotes: "{\r\n \"id\": \"04004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Believer. Warden.\",\r\n \"willpowerIcons\": 4,\r\n - \ \"intellectIcons\": 3,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +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}" 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 b91bbc690..034e95061 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07028\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Pact. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07028\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Pact. Cursed.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 17d34b Grid: true GridProjection: false 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 21e3565e1..2ad027651 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,197 @@ 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/FavoroftheMoon1") +end) +__bundle_register("playercards/cards/FavoroftheMoon1", 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. @@ -66,6 +257,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -140,6 +336,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -183,6 +384,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -255,6 +460,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -268,6 +485,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -285,7 +514,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -303,171 +532,4 @@ 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/FavoroftheMoon1") -end) -__bundle_register("playercards/cards/FavoroftheMoon1", 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 Favor of the Moon (1) 542a70.yaml b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Moon (1) 542a70.yaml index 61d2e7b1f..5c06a3f57 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07271\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Pact. Cursed.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07271\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Pact. Cursed.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 542a70 Grid: true GridProjection: false 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 9e543b480..cca3f2310 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,6 +41,60 @@ 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 = {} @@ -69,7 +123,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -88,6 +142,12 @@ do 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) @@ -104,8 +164,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -144,6 +204,18 @@ do 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) @@ -185,6 +257,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -259,6 +336,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -302,6 +384,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -374,6 +460,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -387,6 +485,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -404,7 +514,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -422,52 +532,4 @@ 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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 Favor of the Sun (1) 1e6a06.yaml b/unpacked/Bag All Player Cards 15bb07/Card Favor of the Sun (1) 1e6a06.yaml index 9f5912ac3..bb52c7813 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07272\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Pact. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07272\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Pact. Blessed.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 1e6a06 Grid: true GridProjection: false 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 7472ac3d6..d11476b55 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02268\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02268\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"willpowerIcons\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: b2e27e Grid: true GridProjection: false 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 46d06d483..11711afde 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fearless cd0ac1.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01067\",\r\n \"alternate_ids\": [\r\n \"01567\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01067\",\n \"alternate_ids\": [\n \"01567\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Mystic\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"willpowerIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: cd0ac1 Grid: true GridProjection: false 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 c32730766..59f45ef59 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04267\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04267\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten + Age\"\n}" GUID: bc4788 Grid: true GridProjection: false 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 7ed776bfc..6cd4b5762 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60209\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60209\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: a614de Grid: true GridProjection: false 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 09f4af7c0..69368f953 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04108\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Connection. Illicit.\",\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04108\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Connection. Illicit.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 2423e7 Grid: true GridProjection: false 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 19b191651..f81a49c42 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08082\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Gambit. Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08082\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Gambit. Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0c2449 Grid: true GridProjection: false 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 6cd0d4be9..19075f28a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07222\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Cursed.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07222\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Cursed.\",\n \"willpowerIcons\": 1,\n + \ \"wildIcons\": 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: f10690 Grid: true GridProjection: false 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 964b5b1bf..7a7fe4f37 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09118\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Dilemma. Fortune.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09118\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 3,\n \"traits\": \"Dilemma. Fortune.\",\n \"intellectIcons\": 2,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: 1b4684 Grid: true GridProjection: false 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 fb5092a4f..79346f472 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09033\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Agency.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09033\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Ally. + Agency.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: babfb6 Grid: true GridProjection: false 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 fb4a9e9af..5a46ae6fd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Fieldwork d6771f.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03024\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: d6771f Grid: true GridProjection: false 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 6b75b5454..45b966df2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03155\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03155\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 00af4f Grid: true GridProjection: false 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 a0f345e1d..aaf313657 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09030\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09030\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: fc2432 Grid: true GridProjection: false 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 df8aab537..9282d044f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02013\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Endtimes.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02013\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 2c901b Grid: true GridProjection: false 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 d560af6ec..a375b649f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02272\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02272\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Clothing.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 5cb973 Grid: true GridProjection: false 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 1c6d1f92d..ece526fa8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"53014\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53014\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact.\",\n \"weakness\": true,\n \"cycle\": \"Return to the Forgotten + Age\"\n}" GUID: 39452d Grid: true GridProjection: false 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 new file mode 100644 index 000000000..17bf185a9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Fine Tuning (1) 103fbd.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '25': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447674651244793/501B12FC5970ACC35866C564F2AF1635D23377CD/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10054\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Insight. Upgrade.\",\n \"agilityIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 103fbd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Fine Tuning (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.17 + posY: 2.93 + posZ: -16.73 + 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 Fingerprint Kit (4) 33b09e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Fingerprint Kit (4) 33b09e.yaml index b259e038b..03b67a7b7 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09057\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 5,\r\n \"level\": 4,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09057\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 5,\n \"level\": 4,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 33b09e Grid: true GridProjection: false 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 4fadefa9e..fa7b732be 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05024\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\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 Circle Undone\"\n}" GUID: b9bb2a Grid: true GridProjection: false 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 3544b38b9..d6d4f07ff 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Bootlegger DragSelectable: true -GMNotes: "{\r\n \"id\": \"04003\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Criminal.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +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}" 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 02111567e..4876d4bb8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04011\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Weapon. Firearm. + Illicit.\",\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 848d9c Grid: true GridProjection: false 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 9fdce50ea..ff52ef854 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02032\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 9da37c Grid: true GridProjection: false 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 5d3c874b8..acc793daf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02114\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02114\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Tool. Melee.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 8a4673 Grid: true GridProjection: false 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 749c40d87..13a339806 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08080\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08080\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Tool. Melee.\",\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: fb019d Grid: true GridProjection: false 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 1a96a3e3f..aeb1e5738 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01683\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Science.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01683\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent. Science.\",\n \"willpowerIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: 3c7eb1 Grid: true GridProjection: false 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 eb16e24df..2df243f27 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03230\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Science.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03230\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent. Science.\",\n \"willpowerIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: bc80ab Grid: true GridProjection: false 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 31c161cd5..a9b74263a 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01519\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent. Science.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01519\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent. Science.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: 56b8ad Grid: true GridProjection: false 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 43b94e640..5d3362af7 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01019\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent. Science.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01019\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent. Science.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: 5cd622 Grid: true GridProjection: false 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 4ab529338..f6c6cecec 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06110\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06110\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 0bb3da Grid: true GridProjection: false 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 7d04d75a8..5cfed161a 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Trap. DragSelectable: true -GMNotes: "{\r\n \"id\": \"81021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Trap.\",\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"81021\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Trap.\",\n \"cycle\": \"Standalone\"\n}" GUID: c7b748 Grid: true GridProjection: false 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 cab7450d7..786232386 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: From the Brink DragSelectable: true -GMNotes: "{\r\n \"id\": \"05039\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05039\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: 46187b Grid: true GridProjection: false 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 b8ee2f49b..abf830cd6 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04305\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 4,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04305\",\n \"type\": \"Asset\",\n \"slot\": \"Body|Hand + x2\",\n \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": + \"Item. Weapon. Firearm.\",\n \"combatIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": + [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: cf4f15 Grid: true GridProjection: false 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 5b378766f..24ca70b5b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02115\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Tactic.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02115\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Tactic.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 017821 Grid: true GridProjection: false 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 d52c8c6cd..8c0d579fe 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09122\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09122\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\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 Scarlet Keys\"\n}" GUID: 2b3301 Grid: true GridProjection: false 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 91fad1aca..d46ff226e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Flashlight bb1cce.yaml @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01087\",\r\n \"alternate_ids\": [\r\n \"01587\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": 1,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01087\",\n \"alternate_ids\": [\n \"01587\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Neutral\",\n \"cost\": 2,\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\": \"Core\"\n}" GUID: bb1cce Grid: true GridProjection: false 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 baec9c2cf..43e423eaa 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60106\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60106\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 52c686 Grid: true GridProjection: false 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 d08d3b16b..9d4e129af 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 @@ -76,6 +76,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -150,6 +155,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -193,6 +203,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -265,6 +279,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -278,6 +304,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -295,7 +333,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -340,6 +378,11 @@ do 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) @@ -352,9 +395,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -389,7 +433,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -408,6 +452,12 @@ do 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) @@ -424,8 +474,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -464,6 +514,18 @@ do 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) 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 536914556..1bbec6962 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,173 +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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - 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) __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. @@ -233,6 +66,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -307,6 +145,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -350,6 +193,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -422,6 +269,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -435,6 +294,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -452,7 +323,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -470,4 +341,195 @@ 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 + 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 300908501..dcee023e2 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07268\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 4,\r\n \"traits\": \"Item. Instrument. Relic. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07268\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"level\": 4,\n \"traits\": \"Item. Instrument. Relic. + Cursed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 3cc1e2 Grid: true GridProjection: false 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 a575a47fe..222b6ffe8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Followed 0cc3e7.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06114\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06114\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 0cc3e7 Grid: true GridProjection: false 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 509f70fed..ab5167cc0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06156\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06156\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight. Tactic.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b6506d Grid: true GridProjection: false 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 3a78af8d4..685605b80 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Foolishness fa777f.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Creature. Dreamlands.\",\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98011\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 4,\n \"traits\": \"Ally. Creature. Dreamlands.\",\n + \ \"wildIcons\": 2,\n \"cycle\": \"Promo\"\n}" GUID: fa777f Grid: true GridProjection: false 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 702550f18..02554d3b3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01058\",\r\n \"alternate_ids\": [\r\n \"01558\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01058\",\n \"alternate_ids\": [\n \"01558\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Mystic\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Talent.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Core\"\n}" GUID: 80acd2 Grid: true GridProjection: false 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 779155d21..16804895b 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Dark Knowledge DragSelectable: true -GMNotes: "{\r\n \"id\": \"60229\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60229\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Tome.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 2f4507 Grid: true GridProjection: false 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 42ab9d591..ea02f96fa 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Secrets Revealed DragSelectable: true -GMNotes: "{\r\n \"id\": \"60230\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60230\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Tome.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: f375bf Grid: true GridProjection: false 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 d6bf31387..bf2a01247 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Untranslated DragSelectable: true -GMNotes: "{\r\n \"id\": \"60210\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60210\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Tome.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 5,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 0a4d22 Grid: true GridProjection: false 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 7c15f4e28..290bebf97 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08031\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent. Ritual.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08031\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Talent. Ritual.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: fa06f9 Grid: true GridProjection: false 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 1c2599c6c..582176002 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08064\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Augury.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08064\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Augury.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: c09a15 Grid: true GridProjection: false 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 4c6617300..5ef5d6f7d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03150\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03150\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: c17f2c Grid: true GridProjection: false 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 6b5b7755f..93ccb01f5 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06034\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune. Insight.\",\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06034\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Fortune. Insight.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: dacbf0 Grid: true GridProjection: false 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 c4230b65b..85681cccf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05237\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Fortune. Blessed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05237\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Fortune. Blessed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: e674e8 Grid: true GridProjection: false 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 37c136611..f8a33e572 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09766\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Item. Evidence.\",\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09766\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Item. Evidence.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: a72f6f Grid: true GridProjection: false 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 7371cc155..65243bc25 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Chalice of the Heart DragSelectable: true -GMNotes: "{\r\n \"id\": \"05035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05035\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: dd4e2a Grid: true GridProjection: false 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 327fdc644..c48357420 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 @@ -19,26 +19,25 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09060\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Favor.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"customizations\": [\r\n {\r\n \"name\": - \"Helpful\",\r\n \"xp\": 1,\r\n \"text\": \"When you play Friends in Low - Places, you may choose another investigator at your location to resolve its effects.\"\r\n - \ },\r\n {\r\n \"name\": \"Versatile\",\r\n \"xp\": 2,\r\n \"text\": - \"Choose another Trait. When you play Friends in Low Places, you may choose one - of the looked-at cards with both chosen Traits to add to your hand without spending - 1 resource.\"\r\n },\r\n {\r\n \"name\": \"Bolstering\",\r\n \"xp\": - 2,\r\n \"text\": \"Each card added to your hand by Friends in Low Places gains - a ? icon until the end of the phase.\"\r\n },\r\n {\r\n \"name\": \"Clever\",\r\n - \ \"xp\": 2,\r\n \"text\": \"Instead of shuffling the remaining cards into - your deck, you may place each of them on the top of your deck, in any order.\"\r\n - \ },\r\n {\r\n \"name\": \"Prompt\",\r\n \"xp\": 2,\r\n \"text\": - \"Friends in Low Places gains fast and \u201Cplay during any \U0001F5F2 window.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Experienced\",\r\n \"xp\": 3,\r\n \"text\": - \"Increase the number of cards looked at by 3.\"\r\n },\r\n {\r\n \"name\": - \"Swift\",\r\n \"xp\": 3,\r\n \"text\": \"You may play one of the cards - added to your hand (paying its cost).\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09060\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Favor.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"customizations\": [\n {\n \"name\": \"Helpful\",\n + \ \"xp\": 1,\n \"text\": \"When you play Friends in Low Places, you may + choose another investigator at your location to resolve its effects.\"\n },\n + \ {\n \"name\": \"Versatile\",\n \"xp\": 2,\n \"text\": \"Choose + another Trait. When you play Friends in Low Places, you may choose one of the looked-at + cards with both chosen Traits to add to your hand without spending 1 resource.\"\n + \ },\n {\n \"name\": \"Bolstering\",\n \"xp\": 2,\n \"text\": + \"Each card added to your hand by Friends in Low Places gains a ? icon until the + end of the phase.\"\n },\n {\n \"name\": \"Clever\",\n \"xp\": 2,\n + \ \"text\": \"Instead of shuffling the remaining cards into your deck, you may + place each of them on the top of your deck, in any order.\"\n },\n {\n \"name\": + \"Prompt\",\n \"xp\": 2,\n \"text\": \"Friends in Low Places gains fast + and \u201Cplay during any \U0001F5F2 window.\u201D\"\n },\n {\n \"name\": + \"Experienced\",\n \"xp\": 3,\n \"text\": \"Increase the number of cards + looked at by 3.\"\n },\n {\n \"name\": \"Swift\",\n \"xp\": 3,\n + \ \"text\": \"You may play one of the cards added to your hand (paying its cost).\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: c332af Grid: true GridProjection: false 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 e44fc703e..0b86a2c64 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Frostbitten 8abd77.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness. DragSelectable: true -GMNotes: "{\r\n \"id\": \"08646\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Injury.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08646\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 8abd77 Grid: true GridProjection: false 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 5d78d057b..f5147b1f5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60121\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60121\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 9e7f6a Grid: true GridProjection: false 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 4232145a2..140a3d83a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08022\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Spirit. Synergy.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08022\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Spirit. Synergy.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 09cc35 Grid: true GridProjection: false 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 035adc32f..f01cf383a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06280\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06280\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b45c82 Grid: true GridProjection: false 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 bafe819e0..f0a71181e 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 @@ -19,12 +19,11 @@ CustomDeck: UniqueBack: false Description: Worlds within Worlds DragSelectable: true -GMNotes: "{\r\n \"id\": \"06013\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"startsInPlay\": true,\r\n \"cost\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06015a\"\r\n - \ }\r\n ],\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"bonded\": + [\n {\n \"count\": 1,\n \"id\": \"06015a\"\n }\n ],\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b8c891 Grid: true GridProjection: false 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 d48d98f07..5ba26f74d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Not Going Down That Easily DragSelectable: true -GMNotes: "{\r\n \"id\": \"05258\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Veteran.\",\r\n \"combatIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05258\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Veteran.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 2237f4 Grid: true GridProjection: false 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 b580b862a..4b298bf98 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07155\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07155\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell. Cursed.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: b7c316 Grid: true GridProjection: false 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 e0f11789a..4de46fa13 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08019\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08019\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 028cf7 Grid: true GridProjection: false 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 8979e2100..b4b28b9dd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07265\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Pact.\",\r\n \"cycle\": \"The - Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07265\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Pact.\",\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: b7223c Grid: true GridProjection: false 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 50b45f0f8..c597aac06 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Intrepid Explorer DragSelectable: true -GMNotes: "{\r\n \"id\": \"08099\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue\",\r\n - \ \"cost\": 5,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08099\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker|Rogue\",\n \"cost\": 5,\n \"level\": 3,\n \"traits\": \"Ally. + Wayfarer.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: 255aa3 Grid: true GridProjection: false 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 8cbe9cc35..76d864e1e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08021\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08021\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 76270e Grid: true GridProjection: false 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 c1312e907..10f3af895 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60123\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60123\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 415ca2 Grid: true GridProjection: false 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 db33d8e32..d1a66b6f9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60114\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60114\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 5b0f86 Grid: true GridProjection: false 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 702bc8b5b..9817ad73c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09090\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Spell.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09090\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Spell.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 63282f Grid: true GridProjection: false 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 179723a91..c8ccbc7e1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05275\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05275\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: b7c503 Grid: true GridProjection: false 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 7cdb8a3bc..82734d605 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"82026\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Mask.\",\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"82026\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Mask.\",\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: d0e108 Grid: true GridProjection: false 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 e0a934cb9..a7e7ae0cc 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: ICPC Punjab Detective DragSelectable: true -GMNotes: "{\r\n \"id\": \"09038\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Ally. Police.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09038\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Ally. + Police.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: bdd70d Grid: true GridProjection: false 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 8fd5020ba..e2d1fb50d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60221\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60221\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 6e4d54 Grid: true GridProjection: false 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 bbebd8324..7cf0e07ce 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05318\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 5,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 3,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05318\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 3,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 090fcf Grid: true GridProjection: false 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 4af5051ed..ce1c759b6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Writer DragSelectable: true -GMNotes: "{\r\n \"id\": \"98019\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Clairvoyant.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +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}" 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 216516cf4..41696358e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Glory 273584.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60115\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60115\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: '273584' Grid: true GridProjection: false 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 60cf63bc2..d6a667fdf 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Tough Old Bird DragSelectable: true -GMNotes: "{\r\n \"id\": \"60527\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Ally.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60527\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Ally.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 52a66f Grid: true GridProjection: false 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 4d5a2df9e..b96c8b914 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Tough Old Bird DragSelectable: true -GMNotes: "{\r\n \"id\": \"60508\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60508\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally.\",\n + \ \"willpowerIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 1cccfe Grid: true GridProjection: false 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 7dbe9c850..68f9dc7e0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09009\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Tool.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 09f1a2 Grid: true GridProjection: false 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 74ca7f4d5..9a451e5e6 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tool. Weapon. Melee.\",\r\n - \ \"combatIcons\": 2,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52010\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item. + Tool. Weapon. Melee.\",\n \"combatIcons\": 2,\n \"cycle\": \"Return to the Path + to Carcosa\"\n}" GUID: 96a440 Grid: true GridProjection: false 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 189ec6bae..8d3935522 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03037\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03037\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 3fe6de Grid: true GridProjection: false 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 e56aed454..0ff541ed8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03017\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Monster. Ghoul.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03017\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Monster. Ghoul.\",\n \"weakness\": true,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 80b7c6 Grid: true GridProjection: false 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 43bb1b431..7c19ad6c5 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: The Doctors' Bible DragSelectable: true -GMNotes: "{\r\n \"id\": \"09058\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09058\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: f4e7f3 Grid: true GridProjection: false 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 b757bf0cc..3d46173c4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Greed 0ca36f.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08018\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08018\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0ca36f Grid: true GridProjection: false 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 110325d9c..0766a6346 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Hour of the Huntress DragSelectable: true -GMNotes: "{\n \"id\": \"98002\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n - \ \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 2,\n \"uses\": - [\n {\n \"count\": 0,\n \"type\": \"Offering\",\n \"token\": \"resource\"\n - \ }\n ],\n \"cycle\": \"Promo\"\n}" +GMNotes: "{\n \"id\": \"98002\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": + 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Offering\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Promo\"\n}" GUID: c729ab Grid: true GridProjection: false 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 01d80af89..21badb325 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: Jinxed Idol DragSelectable: true -GMNotes: "{\r\n \"id\": \"08614\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Expedition.\",\r\n \"combatIcons\": 2,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08614\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Expedition.\",\n \"combatIcons\": 2,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: d36d80 Grid: true GridProjection: false 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 f39aea8ad..d5e2eb98e 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Muckraker DragSelectable: true -GMNotes: "{\r\n \"id\": \"06162\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Criminal. Dreamer.\",\r\n - \ \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 9,\r\n \"type\": - \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06162\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Criminal. Dreamer.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 9,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: 90bf93 Grid: true GridProjection: false 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 2d66a0886..9274fdd72 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: The Purifier DragSelectable: true -GMNotes: "{\r\n \"id\": \"60128\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 5,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Hunter.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60128\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 5,\n \"level\": 3,\n \"traits\": \"Ally. + Hunter.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: b39b78 Grid: true GridProjection: false 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 c8e637e04..bee881bb3 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: The Purifier DragSelectable: true -GMNotes: "{\r\n \"id\": \"60107\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 5,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Hunter.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60107\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 5,\n \"level\": 0,\n \"traits\": \"Ally. + Hunter.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: f6dfe5 Grid: true GridProjection: false 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 b5e126aba..86def5a29 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09027\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09027\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: d7c63c Grid: true GridProjection: false 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 5d41b1f03..bb8b5fa6a 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09044\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09044\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: d1f1d9 Grid: true GridProjection: false 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 ba8334a75..b0e747082 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60506\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60506\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 1d75d0 Grid: true GridProjection: false 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 15b46ee57..335c72bde 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Seeker DragSelectable: true -GMNotes: "{\r\n \"id\": \"05194\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05194\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Charm. Cursed.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 1433eb Grid: true GridProjection: false 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 c994c6242..931123ba9 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Survivor DragSelectable: true -GMNotes: "{\r\n \"id\": \"05195\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm. Blessed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05195\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Charm. Blessed.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 5fae20 Grid: true GridProjection: false 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 0d1e90be8..d674dbf9c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05119\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor|Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05119\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor|Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Item. Charm.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: a20887 Grid: true GridProjection: false 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 3046b868a..2838da68b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60515\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60515\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: a92a90 Grid: true GridProjection: false 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 e374a8f00..254a7be4d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Grizzled 9417a7.yaml @@ -19,21 +19,21 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09101\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 1,\r\n - \ \"customizations\": [\r\n {\r\n \"name\": \"Specialist\",\r\n \"xp\": - 1,\r\n \"text\": \"Choose another trait.\"\r\n },\r\n {\r\n \"name\": - \"Specialist\",\r\n \"xp\": 2,\r\n \"text\": \"Choose another trait.\"\r\n - \ },\r\n {\r\n \"name\": \"Nemesis\",\r\n \"xp\": 3,\r\n \"text\": - \"If this is a skill test on or against an enemy with a chosen trait and the test - is successful, you may attach Grizzled to that enemy. Reduce the difficulty of tests - on or against the attached enemy by 1.\"\r\n },\r\n {\r\n \"name\": \"Mythos-Hardened\",\r\n - \ \"xp\": 4,\r\n \"text\": \"If this skill test is on a treachery with - a chosen trait and the test is successful, you may add both Grizzled and that treachery - to the victory display.\"\r\n },\r\n {\r\n \"name\": \"Always Prepared\",\r\n - \ \"xp\": 5,\r\n \"text\": \"After you draw an encounter card with a chosen - trait, return one copy of Grizzled from your discard pile to your hand. (Max once - per round.)\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09101\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 1,\n \"customizations\": + [\n {\n \"name\": \"Specialist\",\n \"xp\": 1,\n \"text\": \"Choose + another trait.\"\n },\n {\n \"name\": \"Specialist\",\n \"xp\": + 2,\n \"text\": \"Choose another trait.\"\n },\n {\n \"name\": \"Nemesis\",\n + \ \"xp\": 3,\n \"text\": \"If this is a skill test on or against an enemy + with a chosen trait and the test is successful, you may attach Grizzled to that + enemy. Reduce the difficulty of tests on or against the attached enemy by 1.\"\n + \ },\n {\n \"name\": \"Mythos-Hardened\",\n \"xp\": 4,\n \"text\": + \"If this skill test is on a treachery with a chosen trait and the test is successful, + you may add both Grizzled and that treachery to the victory display.\"\n },\n + \ {\n \"name\": \"Always Prepared\",\n \"xp\": 5,\n \"text\": \"After + you draw an encounter card with a chosen trait, return one copy of Grizzled from + your discard pile to your hand. (Max once per round.)\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 9417a7 Grid: true GridProjection: false 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 e0248fe5a..c827f5823 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60421\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60421\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Investigator Packs\"\n}" GUID: 6b2e97 Grid: true GridProjection: false 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 7a7c7e0b1..b7c16a0f6 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01071\",\r\n \"alternate_ids\": [\r\n \"01571\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 2,\r\n - \ \"level\": 4,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01071\",\n \"alternate_ids\": [\n \"01571\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": + 4,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Core\"\n}" GUID: 07bc04 Grid: true GridProjection: false 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 afc537c2f..9c1d2f096 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03113\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Talent. Composure.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03113\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Talent. Composure.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 98fc57 Grid: true GridProjection: false 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 efad2908e..30979b2c8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08069\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Composure.\",\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08069\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Talent. Composure.\",\n \"wildIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: edb064 Grid: true GridProjection: false 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 8e4cfef3b..cc6348724 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09034\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Creature.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09034\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ally. + Creature.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: 9009db Grid: true GridProjection: false 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 b036e944a..1f20ee593 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01521\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Creature.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01521\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Creature.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 001ae8 Grid: true GridProjection: false 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 441daf453..6841d3650 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Creature.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01021\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Creature.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 08bdf1 Grid: true GridProjection: false 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 c05c1cd28..61f2d715d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ritual. Blessed.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07006\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ritual. Blessed.\",\n \"willpowerIcons\": 1,\n + \ \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 3c0249 Grid: true GridProjection: false 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 e078252bd..1ea8bbf82 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06025\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06025\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster.\",\n \"weakness\": true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: aec357 Grid: true GridProjection: false 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 501c8e1b1..1233beb23 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09053\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09053\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '425841' Grid: true GridProjection: false 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 0d19b6f20..e0d5bf90a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guidance bbfe9b.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03265\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03265\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Path to Carcosa\"\n}" GUID: bbfe9b Grid: true GridProjection: false 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 baffde72e..a7bb12376 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07223\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07223\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 477e79 Grid: true GridProjection: false 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 9e03f434b..379c898f6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05236\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Geist.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05236\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ally. + Geist.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 9375f4 Grid: true GridProjection: false 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 c6ebe8154..a56182711 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09112\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate.\",\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09112\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 4cb0c9 Grid: true GridProjection: false 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 9888d84cc..b8e9a593f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60424\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"willpowerIcons\": - 3,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60424\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"willpowerIcons\": 3,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 219c78 Grid: true GridProjection: false 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 e8add518b..d2dea0260 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Guts 8f7289.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01089\",\r\n \"alternate_ids\": [\r\n \"01589\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01089\",\n \"alternate_ids\": [\n \"01589\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Neutral\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"willpowerIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: 8f7289 Grid: true GridProjection: false 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 941424066..722b9d38b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07301\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07301\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell. Blessed.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e40802 Grid: true GridProjection: false 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 babee4c73..9a15cb69d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09084\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09084\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 3fa5b8 Grid: true GridProjection: false 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 80c73976e..a7026fca2 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Occult. Blessed.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 3,\r\n \"id\": \"05314\"\r\n }\r\n - \ ],\r\n \"willpowerIcons\": 2,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54002\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": + \"05314\"\n }\n ],\n \"willpowerIcons\": 2,\n \"cycle\": \"Return to the Circle + Undone\"\n}" GUID: 78858f Grid: true GridProjection: false 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 41888a946..0191d3035 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05313\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Occult. Blessed.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 3,\r\n \"id\": \"05314\"\r\n }\r\n - \ ],\r\n \"willpowerIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05313\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Occult. Blessed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": + \"05314\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 312d38 Grid: true GridProjection: false 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 2e2502d8e..60e86b884 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07020\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07020\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell. Blessed.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 1ad931 Grid: true GridProjection: false 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 new file mode 100644 index 000000000..e6b067bf8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Hand-Eye Coordination (1) 102fcd.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '21': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279446315725170600/22FCF4406C090610E507C757FAEECC820E7F1E23/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10030\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight.\",\n \"combatIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 102fcd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Hand-Eye Coordination (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.17 + posY: 2.93 + posZ: -16.73 + 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 Handcuffs (2) 07c480.yaml b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs (2) 07c480.yaml index 1b6cf19cb..ab7b6f78a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item. Police.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09035\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item. Police.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 07c480 Grid: true GridProjection: false 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 5817bb626..d89de96f6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Handcuffs 5f33be.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04265\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Police.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04265\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Police.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 5f33be Grid: true GridProjection: false 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 801ae0072..3869b67d0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50005\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: 15643b Grid: true GridProjection: false 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 7dd1b73ff..eb8bafbbd 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07266\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"replenish\": 2,\r\n \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07266\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 2,\n \"agilityIcons\": 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": + 2,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 9565f0 Grid: true GridProjection: false 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 b9a069dbf..de2c47e32 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01549\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01549\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: '132069' Grid: true GridProjection: false 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 29c19a6c8..92fa1b5e5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01049\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01049\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 68744b Grid: true GridProjection: false 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 131c9e0a3..63078e9be 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"90048\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Hardship.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"90048\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Hardship.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: '876557' Grid: true GridProjection: false 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 b4840cde0..b5e26cabe 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07230\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Fortune. Blessed.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07230\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Fortune. Blessed.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 7885cf Grid: true GridProjection: false 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 bd035fb67..36af8beb9 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Professor DragSelectable: true -GMNotes: "{\r\n \"id\": \"60201\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Miskatonic.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 5,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +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}" 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 9f61d3a89..6107731e8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06239\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06239\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 1bd139 Grid: true GridProjection: false 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 2e5178f40..1a842aa07 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04155\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"agilityIcons\": 1,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04155\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"agilityIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: '857238' Grid: true GridProjection: false 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 24f8f8d63..cec522d44 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Haunted 249d83.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01098\",\r\n \"alternate_ids\": [\r\n \"01598\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Curse.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01098\",\n \"alternate_ids\": [\n \"01598\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Curse.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 1,\n \"cycle\": \"Core\"\n}" GUID: 249d83 Grid: true GridProjection: false 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 cd0010a25..ea73caefe 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"05154\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tool.\",\n \"willpowerIcons\": - 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Evidence\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Circle Undone\"\n}" +GMNotes: "{\n \"id\": \"05154\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n + \ \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 5ada0a Grid: true GridProjection: false 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 489dd4190..daeb5677f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07181\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07181\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e44c96 Grid: true GridProjection: false 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 027839edd..1448aac06 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08068\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08068\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: f2726b Grid: true GridProjection: false 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 c9b1dc550..e72a39ff0 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06163\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06163\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: bba97a Grid: true GridProjection: false 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 b1cd33d77..7ea510bab 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08126\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Armor.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08126\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Armor.\",\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '275450' Grid: true GridProjection: false 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 325329437..98f45bddb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09115\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Augury. Dilemma.\",\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09115\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Augury. Dilemma.\",\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 3b7419 Grid: true GridProjection: false 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 63a3f9e30..f168bf439 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Artifact from Another Life (Advanced) DragSelectable: true -GMNotes: "{\r\n \"id\": \"90018\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"combatIcons\": 1,\r\n \"wildIcons\": 2,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90018\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" GUID: bf151d Grid: true GridProjection: false 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 abbd39e82..486bd1830 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Artifact from Another Life DragSelectable: true -GMNotes: "{\r\n \"id\": \"01012\",\r\n \"alternate_ids\": [\r\n \"01512\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 3,\r\n - \ \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01012\",\n \"alternate_ids\": [\n \"01512\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Neutral\",\n \"cost\": 3,\n + \ \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: e929f9 Grid: true GridProjection: false 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 f31fa4c70..0943c410b 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09031\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09031\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 7d93b4 Grid: true GridProjection: false 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 c713c2545..470d99922 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04275\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04275\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: d2663c Grid: true GridProjection: false 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 6ea794984..f24813b26 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Aspiring Actor DragSelectable: true -GMNotes: "{\r\n \"id\": \"05155\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05155\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Criminal.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 9df9df Grid: true GridProjection: false 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 ab6bc8aee..1618392c7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06234\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06234\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 93381d Grid: true GridProjection: false 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 f87f1833b..fbe7fb146 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03106\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03106\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: bb0f6a Grid: true GridProjection: false 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 655b4e7c5..d5409c568 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09065\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Upgrade. Illicit.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09065\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Upgrade. Illicit.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 9bef61 Grid: true GridProjection: false 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 95153ead4..c29547ad0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03038\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03038\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: dd130e Grid: true GridProjection: false 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 b3c204fe5..55cc84eb9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04156\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04156\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: ce1b89 Grid: true GridProjection: false 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 68494ffa1..0fef297fc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02187\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02187\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d48b25 Grid: true GridProjection: false 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 74d7f25be..251b3cfcd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60211\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60211\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 8595fb Grid: true GridProjection: false 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 8cec372d3..c6e98f85a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Clothing. Footwear.\",\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08035\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. Clothing. Footwear.\",\n + \ \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: b03e83 Grid: true GridProjection: false 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 7aadab729..7b8c9d28a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02027\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ally. + Criminal.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: cdd6aa Grid: true GridProjection: false 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 fc54ec7e3..646f7bebe 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09066\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Trick.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09066\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Trick.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 408bce Grid: true GridProjection: false 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 515e7ff48..02cbb801c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08112\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue|Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Fortune. Gambit.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08112\",\n \"type\": \"Event\",\n \"class\": \"Rogue|Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Fortune. Gambit.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 431c15 Grid: true GridProjection: false 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 d70461a09..cea6a84dd 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07220\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Charm. Blessed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07220\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Charm. Blessed.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 2d2246 Grid: true GridProjection: false 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 575ba97af..1772c99e8 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01059\",\r\n \"alternate_ids\": [\r\n \"01559\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01059\",\n \"alternate_ids\": [\n \"01559\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Mystic\",\n \"cost\": 2,\n + \ \"level\": 0,\n \"traits\": \"Item. Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: fa1d67 Grid: true GridProjection: false 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 c30c1e04e..8d91ee556 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 @@ -68,6 +68,11 @@ do 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) @@ -80,9 +85,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -117,7 +123,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -136,6 +142,12 @@ do 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) @@ -152,8 +164,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -192,6 +204,18 @@ do 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) @@ -233,6 +257,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -307,6 +336,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -350,6 +384,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -422,6 +460,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -435,6 +485,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -452,7 +514,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData 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 Holy Spear (5) 28289a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Holy Spear (5) 28289a.yaml index c476f37e9..952dc65ba 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07302\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Item. Weapon. Melee. Blessed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07302\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Item. + Weapon. Melee. Blessed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 2,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 28289a Grid: true GridProjection: false 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 af4b74b67..e576d83e7 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 @@ -19,28 +19,27 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09061\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Gambit.\",\r\n \"agilityIcons\": - 1,\r\n \"customizations\": [\r\n {\r\n \"name\": \"Reflex Response\",\r\n - \ \"xp\": 1,\r\n \"text\": \"Add the following play condition: \u201C\\u003d - You take damage or horror.\u201D\"\r\n },\r\n {\r\n \"name\": \"Situational - Awareness\",\r\n \"xp\": 1,\r\n \"text\": \"Add the following play condition: - \u201C\\u003d A location enters play or is revealed.\u201D\"\r\n },\r\n {\r\n - \ \"name\": \"Killer Instinct\",\r\n \"xp\": 1,\r\n \"text\": \"Add - the following play condition: \u201C\\u003d An enemy engages you.\u201D\"\r\n },\r\n - \ {\r\n \"name\": \"Gut Reaction\",\r\n \"xp\": 1,\r\n \"text\": - \"Add the following play condition: \u201C\\u003d A treachery enters your threat - area .\u201D\"\r\n },\r\n {\r\n \"name\": \"Muscle Memory\",\r\n \"xp\": - 1,\r\n \"text\": \"Add the following play condition: \u201C\\u003d You play - an asset.\u201D\"\r\n },\r\n {\r\n \"name\": \"Sharpened Talent\",\r\n - \ \"xp\": 2,\r\n \"text\": \"During the action granted by Honed Instinct, - you get +2 to each of your skills.\"\r\n },\r\n {\r\n \"name\": \"Impulse - Control\",\r\n \"xp\": 3,\r\n \"text\": \"You may include up to three - copies of Honed Instinct in your deck. Honed Instinct gets \u20131 cost.\",\r\n - \ \"replaces\": {\r\n \"cost\": 0\r\n }\r\n },\r\n {\r\n \"name\": - \"Force of Habit\",\r\n \"xp\": 5,\r\n \"text\": \"When you play Honed - Instinct, you may take 2 actions instead of 1 (one at a time). Then, remove it from - the game.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09061\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Gambit.\",\n \"agilityIcons\": + 1,\n \"customizations\": [\n {\n \"name\": \"Reflex Response\",\n \"xp\": + 1,\n \"text\": \"Add the following play condition: \u201C\\u003d You take damage + or horror.\u201D\"\n },\n {\n \"name\": \"Situational Awareness\",\n + \ \"xp\": 1,\n \"text\": \"Add the following play condition: \u201C\\u003d + A location enters play or is revealed.\u201D\"\n },\n {\n \"name\": \"Killer + Instinct\",\n \"xp\": 1,\n \"text\": \"Add the following play condition: + \u201C\\u003d An enemy engages you.\u201D\"\n },\n {\n \"name\": \"Gut + Reaction\",\n \"xp\": 1,\n \"text\": \"Add the following play condition: + \u201C\\u003d A treachery enters your threat area .\u201D\"\n },\n {\n \"name\": + \"Muscle Memory\",\n \"xp\": 1,\n \"text\": \"Add the following play condition: + \u201C\\u003d You play an asset.\u201D\"\n },\n {\n \"name\": \"Sharpened + Talent\",\n \"xp\": 2,\n \"text\": \"During the action granted by Honed + Instinct, you get +2 to each of your skills.\"\n },\n {\n \"name\": \"Impulse + Control\",\n \"xp\": 3,\n \"text\": \"You may include up to three copies + of Honed Instinct in your deck. Honed Instinct gets \u20131 cost.\",\n \"replaces\": + {\n \"cost\": 0\n }\n },\n {\n \"name\": \"Force of Habit\",\n + \ \"xp\": 5,\n \"text\": \"When you play Honed Instinct, you may take 2 + actions instead of 1 (one at a time). Then, remove it from the game.\"\n }\n + \ ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 1cde62 Grid: true GridProjection: false 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 43b332199..51136ecc7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hoods 785f68.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05017\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Cultist.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05017\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Cultist.\",\n \"weakness\": true,\n \"cycle\": \"The + Circle Undone\"\n}" GUID: 785f68 Grid: true GridProjection: false 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 870fb7d83..362c48918 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hope 45c582.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06031\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Ally. Creature. Dreamlands.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06031\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"traits\": \"Ally. Creature. Dreamlands.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 45c582 Grid: true GridProjection: false 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 9d60ef826..d80cc2967 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50006\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 5,\r\n \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50006\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 5,\n \"level\": 2,\n \"traits\": \"Fortune.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: f2508d Grid: true GridProjection: false 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 491fc0b49..ed2b9e285 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01057\",\r\n \"alternate_ids\": [\r\n \"01557\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 3,\r\n - \ \"level\": 4,\r\n \"traits\": \"Fortune.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01057\",\n \"alternate_ids\": [\n \"01557\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": + \"Fortune.\",\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 4eb231 Grid: true GridProjection: false 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 d6efc7dce..631505812 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 @@ -19,27 +19,26 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Armor.\",\r\n \"willpowerIcons\": - 1,\r\n \"customizations\": [\r\n {\r\n \"name\": \"Enchanted\",\r\n \"xp\": - 1,\r\n \"text\": \"Hunter\u2019s Armor gains the Relic trait and takes up an - arcane slot instead of a body slot.\",\r\n \"replaces\": {\r\n \"traits\": - \"Item. Armor. Relic.\"\r\n }\r\n },\r\n {\r\n \"name\": \"Protective - Runes\",\r\n \"xp\": 2,\r\n \"text\": \"Hunter\u2019s Armor may be assigned - damage and/or horror dealt to other investigators at your location.\"\r\n },\r\n - \ {\r\n \"name\": \"Durable\",\r\n \"xp\": 2,\r\n \"text\": \"Hunter\u2019s - Armor gets +2 health.\"\r\n },\r\n {\r\n \"name\": \"Hallowed\",\r\n - \ \"xp\": 2,\r\n \"text\": \"Hunter\u2019s Armor gets +2 sanity.\"\r\n - \ },\r\n {\r\n \"name\": \"Lightweight\",\r\n \"xp\": 2,\r\n \"text\": - \"Hunter\u2019s Armor gets \u20131 cost and playing it does not provoke attacks - of opportunity.\",\r\n \"replaces\": {\r\n \"cost\": 3\r\n }\r\n - \ },\r\n {\r\n \"name\": \"Hexdrinker\",\r\n \"xp\": 3,\r\n \"text\": - \"After 1 or more damage or horror is assigned to Hunter\u2019s Armor from a treachery - effect, you may exhaust it to draw 1 card.\"\r\n },\r\n {\r\n \"name\": - \"Armor of Thorns\",\r\n \"xp\": 3,\r\n \"text\": \"After 1 or more damage - or horror is assigned to Hunter\u2019s Armor from an enemy attack, you may exhaust - it to deal 1 damage to that enemy.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09021\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Armor.\",\n \"willpowerIcons\": 1,\n \"customizations\": [\n {\n \"name\": + \"Enchanted\",\n \"xp\": 1,\n \"text\": \"Hunter\u2019s Armor gains the + Relic trait and takes up an arcane slot instead of a body slot.\",\n \"replaces\": + {\n \"traits\": \"Item. Armor. Relic.\"\n }\n },\n {\n \"name\": + \"Protective Runes\",\n \"xp\": 2,\n \"text\": \"Hunter\u2019s Armor may + be assigned damage and/or horror dealt to other investigators at your location.\"\n + \ },\n {\n \"name\": \"Durable\",\n \"xp\": 2,\n \"text\": \"Hunter\u2019s + Armor gets +2 health.\"\n },\n {\n \"name\": \"Hallowed\",\n \"xp\": + 2,\n \"text\": \"Hunter\u2019s Armor gets +2 sanity.\"\n },\n {\n \"name\": + \"Lightweight\",\n \"xp\": 2,\n \"text\": \"Hunter\u2019s Armor gets \u20131 + cost and playing it does not provoke attacks of opportunity.\",\n \"replaces\": + {\n \"cost\": 3\n }\n },\n {\n \"name\": \"Hexdrinker\",\n + \ \"xp\": 3,\n \"text\": \"After 1 or more damage or horror is assigned + to Hunter\u2019s Armor from a treachery effect, you may exhaust it to draw 1 card.\"\n + \ },\n {\n \"name\": \"Armor of Thorns\",\n \"xp\": 3,\n \"text\": + \"After 1 or more damage or horror is assigned to Hunter\u2019s Armor from an enemy + attack, you may exhaust it to deal 1 damage to that enemy.\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: a85f1d Grid: true GridProjection: false 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 30ebc5476..5e9448a9e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50003\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50003\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: 23c3e5 Grid: true GridProjection: false 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 f86a32a7d..57003c43a 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07264\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"replenish\": 2,\r\n \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07264\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 2,\n \"agilityIcons\": 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": + 2,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 78adda Grid: true GridProjection: false 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 a34b22ec0..9cff9de01 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hyperawareness e5dd39.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01034\",\r\n \"alternate_ids\": [\r\n \"01534\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01034\",\n \"alternate_ids\": [\n \"01534\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Talent.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: e5dd39 Grid: true GridProjection: false 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 c7c83eecd..2c1320b9c 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 @@ -19,34 +19,33 @@ CustomDeck: UniqueBack: false Description: Theoretical Device DragSelectable: true -GMNotes: "{\r\n \"id\": \"09119\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Weapon. Firearm.\",\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Aether\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"customizations\": - [\r\n {\r\n \"name\": \"Railshooter\",\r\n \"xp\": 2,\r\n \"text\": - \"Hyperphysical Shotcaster has this form: \u201CManifest \u2013 Fight. Fight with - any skill. This attack deals +1 damage.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Telescanner\",\r\n \"xp\": 2,\r\n \"text\": \"Hyperphysical Shotcaster - has this form: \u201CManifest \u2013 Investigate. Investigate with any skill. If - you succeed, discover a clue at any revealed location instead of your location.\"\r\n - \ },\r\n {\r\n \"name\": \"Translocator\",\r\n \"xp\": 2,\r\n \"text\": - \"Hyperphysical Shotcaster has this form: \u201CManifest \u2013 Evade. Attempt to - evade with any skill. Before or after this attempt, you may move an investigator - or a non-Elite enemy at your location to a connecting location, or vice versa.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Realitycollapser\",\r\n \"xp\": 2,\r\n - \ \"text\": \"Hyperphysical Shotcaster has this form: \u201CManifest \u2013 - Test any skill (3). If you succeed, discard from play a non\u2011weakness treachery - that is not attached to an Elite enemy.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Matterweaver\",\r\n \"xp\": 2,\r\n \"text\": \"Hyperphysical Shotcaster - has this form: \u201CManifest \u2013 Choose an asset in your hand and test any skill - (X), where X is that asset\u2019s cost. If you succeed, play that asset at no cost.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Aetheric Link\",\r\n \"xp\": 4,\r\n \"text\": - \"Hyperphysical Shotcaster enters play with 2 additional aether.\",\r\n \"replaces\": - {\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": - \"Aether\",\r\n \"token\": \"resource\"\r\n }\r\n ]\r\n - \ }\r\n },\r\n {\r\n \"name\": \"Empowered Configuration\",\r\n \"xp\": - 4,\r\n \"text\": \"While using a Manifest ability, you get +2 skill value.\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09119\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Weapon. Firearm.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Aether\",\n \"token\": \"resource\"\n }\n ],\n \"customizations\": + [\n {\n \"name\": \"Railshooter\",\n \"xp\": 2,\n \"text\": \"Hyperphysical + Shotcaster has this form: \u201CManifest \u2013 Fight. Fight with any skill. This + attack deals +1 damage.\u201D\"\n },\n {\n \"name\": \"Telescanner\",\n + \ \"xp\": 2,\n \"text\": \"Hyperphysical Shotcaster has this form: \u201CManifest + \u2013 Investigate. Investigate with any skill. If you succeed, discover a clue + at any revealed location instead of your location.\"\n },\n {\n \"name\": + \"Translocator\",\n \"xp\": 2,\n \"text\": \"Hyperphysical Shotcaster + has this form: \u201CManifest \u2013 Evade. Attempt to evade with any skill. Before + or after this attempt, you may move an investigator or a non-Elite enemy at your + location to a connecting location, or vice versa.\u201D\"\n },\n {\n \"name\": + \"Realitycollapser\",\n \"xp\": 2,\n \"text\": \"Hyperphysical Shotcaster + has this form: \u201CManifest \u2013 Test any skill (3). If you succeed, discard + from play a non\u2011weakness treachery that is not attached to an Elite enemy.\u201D\"\n + \ },\n {\n \"name\": \"Matterweaver\",\n \"xp\": 2,\n \"text\": + \"Hyperphysical Shotcaster has this form: \u201CManifest \u2013 Choose an asset + in your hand and test any skill (X), where X is that asset\u2019s cost. If you succeed, + play that asset at no cost.\u201D\"\n },\n {\n \"name\": \"Aetheric Link\",\n + \ \"xp\": 4,\n \"text\": \"Hyperphysical Shotcaster enters play with 2 + additional aether.\",\n \"replaces\": {\n \"uses\": [\n {\n + \ \"count\": 6,\n \"type\": \"Aether\",\n \"token\": + \"resource\"\n }\n ]\n }\n },\n {\n \"name\": \"Empowered + Configuration\",\n \"xp\": 4,\n \"text\": \"While using a Manifest ability, + you get +2 skill value.\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 2a6e0d Grid: true GridProjection: false 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 bdcbd89f3..b9e938790 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60423\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60423\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"combatIcons\": 1,\n + \ \"agilityIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: e2bc49 Grid: true GridProjection: false 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 8e579ae93..502fa76ce 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02153\",\r\n \"alternate_ids\": [\r\n \"60414\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02153\",\n \"alternate_ids\": [\n \"60414\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Spell.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 8f3c8e Grid: true GridProjection: false 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 2a01c4ba1..f08ddbc4c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05007\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 7f1b48 Grid: true GridProjection: false 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 8d9376ec3..8df0049e6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Hypochondria 88ee43.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01100\",\r\n \"alternate_ids\": [\r\n \"01600\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01100\",\n \"alternate_ids\": [\n \"01600\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Madness.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 1,\n \"cycle\": \"Core\"\n}" GUID: 88ee43 Grid: true GridProjection: false 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 8d9142520..81951e206 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03189\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03189\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 84ba9d Grid: true GridProjection: false 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 78fe32550..66a7b8122 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09067\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Trick. Upgrade. Illicit.\",\r\n - \ \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09067\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Trick. Upgrade. Illicit.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '691652' Grid: true GridProjection: false 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 37aa5b5b4..85557f271 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05016\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05016\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Spirit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d8a324 Grid: true GridProjection: false 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 b996581c2..960afc0b5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02151\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Trick. Spirit.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02151\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Trick. Spirit.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 62cf25 Grid: true GridProjection: false 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 dd3c7d74c..d18f9b916 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60225\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60225\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Insight. Tactic.\",\n \"intellectIcons\": + 2,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 344e90 Grid: true GridProjection: false 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 a2441b153..1bdbf1645 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02107\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02107\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Insight. Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: acd0da Grid: true GridProjection: false 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 d7017052e..f6589e14e 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02261\",\r\n \"alternate_ids\": [\r\n \"01684\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 0,\r\n - \ \"level\": 4,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": 2,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02261\",\n \"alternate_ids\": [\n \"01684\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Guardian\",\n \"cost\": 0,\n \"level\": 4,\n \"traits\": + \"Spirit.\",\n \"willpowerIcons\": 2,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: 3b6834 Grid: true GridProjection: false 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 7b2197e03..48ae6816d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05315\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05315\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 76147b Grid: true GridProjection: false 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 391b0e8dc..23e17d35d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08105\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08105\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker|Survivor\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": + \"Item. Tool. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 8b065c Grid: true GridProjection: false 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 84046f0e3..b878db798 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08107\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08107\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker|Survivor\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": + \"Item. Tool. Melee.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 70f9f7 Grid: true GridProjection: false 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 f284cb4da..6aca83a28 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ichtaca 29fc24.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: The Forgotten Guardian DragSelectable: true -GMNotes: "{\r\n \"id\": \"04147\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Eztli. Wayfarer.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04147\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Eztli. Wayfarer.\",\n \"combatIcons\": 1,\n + \ \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 29fc24 Grid: true GridProjection: false 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 cac7969e2..bc71cb632 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Watcher Beyond Time DragSelectable: true -GMNotes: "{\r\n \"id\": \"09102\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09102\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 8f6f39 Grid: true GridProjection: false 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 8bf25f413..1dfa99783 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02225\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02225\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: acf2b0 Grid: true GridProjection: false 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 835418b99..8f95a3242 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: The Council's Chosen DragSelectable: true -GMNotes: "{\r\n \"id\": \"07267\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07267\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. + Sorcerer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: 9d7d4a Grid: true GridProjection: false 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 2bd098e3a..990c0648c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04312\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Improvised.\",\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04312\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Improvised.\",\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 9591ac Grid: true GridProjection: false 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 f8a18df68..1df399eb3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Improvisation 9aee7f.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03018\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03018\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 2,\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 9aee7f Grid: true GridProjection: false 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 7ab5a4a76..cc8f7ef19 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09103\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Armor. Improvised.\",\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09103\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Armor. Improvised.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 616c43 Grid: true GridProjection: false 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 b2f333bc4..7d5085fc4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04033\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Improvised.\",\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04033\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Improvised.\",\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 30f90b Grid: true GridProjection: false 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 5d047af3f..71040bbaf 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03027\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 7b42b6 Grid: true GridProjection: false 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 c8eacb4e0..6f7cd2d3e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07010\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"agilityIcons\": 2,\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07010\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Tactic.\",\n \"agilityIcons\": 2,\n \"wildIcons\": + 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 2561b9 Grid: true GridProjection: false 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 64ddeafe7..25f803f70 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08125\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Curse.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08125\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Curse.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: bdd102 Grid: true GridProjection: false 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 6e2a43d20..0e55f6635 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Indebted b2ef43.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"02037\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"permanent\": true,\r\n \"weakness\": - true,\r\n \"basicWeaknessCount\": 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02037\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"permanent\": true,\n \"weakness\": true,\n \"basicWeaknessCount\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: b2ef43 Grid: true GridProjection: false 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 753229cab..a8da7b6bd 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60427\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60427\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: '943332' Grid: true GridProjection: false 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 727742a63..e27e17fb4 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60432\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60432\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 2,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: f00301 Grid: true GridProjection: false 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 41f79443b..2639f2286 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60409\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60409\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Investigator + Packs\"\n}" GUID: c6caf6 Grid: true GridProjection: false 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 3f4cc4bb6..791de7148 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03314\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03314\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: c803ba Grid: true GridProjection: false 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 42a42c8e2..c7027e203 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02227\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02227\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 3,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: 5c3aea Grid: true GridProjection: false 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 62987b49b..75f14f508 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: With Pride and Care DragSelectable: true -GMNotes: "{\r\n \"id\": \"09762\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Agency. Detective.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09762\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Agency. Detective.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: 8247a5 Grid: true GridProjection: false 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 731cd8e99..7106e5ab9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03228\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03228\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 80628f Grid: true GridProjection: false 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 25c76a825..e40999fe0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05111\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Favor. Service.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05111\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Favor. Service.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 5115d9 Grid: true GridProjection: false 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 c1650bd04..17a38a202 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"02038\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Injury.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02038\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 4fb446 Grid: true GridProjection: false 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 504f8a8d6..e42ae36f3 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Interrogate c70ad8.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05020\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05020\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic. Insight.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: c70ad8 Grid: true GridProjection: false 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 8474a3eae..6a7166214 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Intrepid 99d061.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04192\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04192\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 99d061 Grid: true GridProjection: false 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 072a535b0..b4f11f254 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Investments b65011.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05233\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Connection.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05233\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Connection.\",\n \"intellectIcons\": + 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: b65011 Grid: true GridProjection: false 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 f03f93c67..c69e27113 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Torch Singer DragSelectable: true -GMNotes: "{\r\n \"id\": \"88044\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Performer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"88044\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Performer.\",\n \"willpowerIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 860cd7 Grid: true GridProjection: false 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 a1d160562..3f961b539 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Coast Guard Captain DragSelectable: true -GMNotes: "{\r\n \"id\": \"07309\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Blessed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07309\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. + Blessed.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: aa38d0 Grid: true GridProjection: false 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 60589eb39..92a568f75 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Psychic DragSelectable: true -GMNotes: "{\r\n \"id\": \"60401\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Clairvoyant.\",\r\n \"willpowerIcons\": 5,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +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}" 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 5ca9b8f4f..5e6298594 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04008\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Ally. Wayfarer.\",\n + \ \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 7c958e Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 48b174.yaml b/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 48b174.yaml index b7d3580f5..921cc1ac8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 48b174.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Jenny Barnes 48b174.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02003-m\",\r\n \"alternate_ids\": [\r\n \"98001-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"02003-m\",\n \"alternate_ids\": [\n \"98001-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 48b174 Grid: true GridProjection: false 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 9ea4b594d..53ebb10b8 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 @@ -19,10 +19,10 @@ CustomDeck: 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}" GUID: 9058d3 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 a0845577a..6a58d1e0f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Item. Weapon. Firearm.\",\r\n \"agilityIcons\": 2,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02010\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Item. Weapon. Firearm.\",\n \"agilityIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d87128 Grid: true GridProjection: false 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 53dab002c..a0a1c30dc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Arctic Archaeologist DragSelectable: true -GMNotes: "{\r\n \"id\": \"08032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic. Wayfarer.\",\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08032\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic. Wayfarer.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 98e5f5 Grid: true GridProjection: false 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 bf2a8acc0..a1ce590a9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: In Way Over His Head DragSelectable: true -GMNotes: "{\r\n \"id\": \"05259\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Assistant.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05259\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Assistant.\",\n \"intellectIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d99735 Grid: true GridProjection: false 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 b82ed6c23..476e48042 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Wrong Place, Wrong Time DragSelectable: true -GMNotes: "{\r\n \"id\": \"06118\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Wayfarer. Cursed.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Damage\",\r\n \"token\": \"damage\"\r\n }\r\n ],\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06118\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Ally. + Wayfarer. Cursed.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 2,\n \"type\": \"Damage\",\n \"token\": \"damage\"\n }\n ],\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: b8380d Grid: true GridProjection: false 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 f14e3b0ab..77a05b0bb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Gift of the Homunculi DragSelectable: true -GMNotes: "{\r\n \"id\": \"02269\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02269\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Relic.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 6bae15 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 62430ef91..1e0a3e782 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Musician DragSelectable: true -GMNotes: "{\r\n \"id\": \"02004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Performer.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 d85c1974a..1c833738b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Dead Listen DragSelectable: true -GMNotes: "{\r\n \"id\": \"02012\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Instrument. Relic.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02012\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Instrument. Relic.\",\n + \ \"willpowerIcons\": 2,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 03c6a7 Grid: true GridProjection: false 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 f6ccc0899..bed1b465c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Dead Speak (Advanced) DragSelectable: true -GMNotes: "{\n \"id\": \"90050\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n - \ \"cost\": 2,\n \"traits\": \"Item. Instrument. Relic.\",\n \"willpowerIcons\": - 2,\n \"wildIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" +GMNotes: "{\n \"id\": \"90050\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Instrument. Relic.\",\n + \ \"willpowerIcons\": 2,\n \"wildIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 7dfd5f Grid: true GridProjection: false 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 d1948a122..12c1e9e62 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Private Investigator DragSelectable: true -GMNotes: "{\r\n \"id\": \"05002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Detective.\",\r\n \"willpowerIcons\": 2,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +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}" 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 0a84ee5fe..3c5d274b7 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: 'Lookin'' Out For #1' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06326\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06326\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Ally. + Criminal.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: 48c9ff Grid: true GridProjection: false 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 3d44e1fb1..4882ba8cf 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: 'Lookin'' Out For #1' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02265\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02265\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Criminal.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: b51688 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml b/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml index 247415ea6..fc3f3e046 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card John & Jessie Burke cfb393.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Ally. Government. DragSelectable: true -GMNotes: "{\r\n \"id\": \"83055\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Government.\",\r\n \"combatIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"83055\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Government.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: cfb393 Grid: true GridProjection: false 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 6faa60757..d7a4bb73e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08036\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 5,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Synergy.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08036\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 5,\n \"level\": 1,\n \"traits\": \"Insight. Synergy.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 6367dd Grid: true GridProjection: false 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 27bdc5c13..779ca2758 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08074\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Upgrade.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Durability\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08074\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Upgrade.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Durability\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: 29d06d Grid: true GridProjection: false 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 0666b1a03..4acc6af5f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07306\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Practiced. Cursed.\",\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07306\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 3,\n \"traits\": \"Practiced. Cursed.\",\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 025ed2 Grid: true GridProjection: false 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 f88c8103b..424b5cd40 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Keeper of Esoteric Lore DragSelectable: true -GMNotes: "{\r\n \"id\": \"09114\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Scholar.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09114\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ally. + Scholar.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: 2f100c Grid: true GridProjection: false 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 00730e7dc..4f203bb9b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02185\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02185\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 2f9de4 Grid: true GridProjection: false 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 bbb674bfc..1b3eb63fc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07152\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07152\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 0dc75e Grid: true GridProjection: false 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 f0d6e5c45..eb1ea0df5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07034\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Fortune. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07034\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Fortune. Blessed.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 8b46b2 Grid: true GridProjection: false 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 a2f5f8d99..5382fe427 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08735\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08735\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 8d5c12 Grid: true GridProjection: false 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 4eff5a46f..f556ab8ba 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04304\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04304\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 25ad44 Grid: true GridProjection: false 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 9a512a67c..a281be64a 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Let the Storm Rage DragSelectable: true -GMNotes: "{\r\n \"id\": \"03315\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03315\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Path + to Carcosa\"\n}" GUID: 1c98ff Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml index a686bf938..29c1b4972 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Khopesh of the Abyss dc674e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: Item. Weapon. Relic. Melee. DragSelectable: true -GMNotes: "{\r\n \"id\": \"83057\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Item. Weapon. Relic. Melee.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"83057\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Item. Weapon. Relic. Melee.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: dc674e Grid: true GridProjection: false 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 5b070f6b0..72cba9d5b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09068\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Gambit. Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09068\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Gambit. Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 4d6da5 Grid: true GridProjection: false 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 1490b2d83..81febde55 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kleptomania 447a08.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06036\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Madness. Talent.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06036\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Talent.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 447a08 Grid: true GridProjection: false 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 9645aa14e..31ab5ad62 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knife 0ab3f1.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01086\",\r\n \"alternate_ids\": [\r\n \"01586\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01086\",\n \"alternate_ids\": [\n \"01586\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Neutral\",\n \"cost\": 1,\n \"level\": + 0,\n \"traits\": \"Item. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 0ab3f1 Grid: true GridProjection: false 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 640d8e721..e1272c7f6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Charge Ever Onward DragSelectable: true -GMNotes: "{\r\n \"id\": \"54005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54005\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 159f82 Grid: true GridProjection: false 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 5acbac924..d5cce020a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05231\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05231\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 6de21b Grid: true GridProjection: false 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 67747484e..243574d4a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Knuckleduster 5690d1.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03110\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03110\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee. Illicit.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 5690d1 Grid: true GridProjection: false 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 48e82e1de..a5c32a345 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Kukri 756a35.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02036\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02036\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 756a35 Grid: true GridProjection: false 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 22928b79d..a9fb4dd12 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Security Consultant DragSelectable: true -GMNotes: "{\r\n \"id\": \"09008\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Criminal.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 5,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +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}" 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 5eb383a46..4b813a1f7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09050\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Clothing. Science.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09050\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Clothing. Science.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: a825ad Grid: true GridProjection: false 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 a501a3ecc..294068ffd 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02020\",\r\n \"alternate_ids\": [\r\n \"60212\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic. Science.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02020\",\n \"alternate_ids\": [\n \"60212\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": + 0,\n \"traits\": \"Ally. Miskatonic. Science.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 147cb2 Grid: true GridProjection: false 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 4ab713f4c..75ba39e37 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Dangerous Bokor DragSelectable: true -GMNotes: "{\r\n \"id\": \"81019\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"81019\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Sorcerer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: ab24a6 Grid: true GridProjection: false 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 fc1dca44f..1564901ef 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52009\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 2,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: bda4fd Grid: true GridProjection: false 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 26aa16338..d0ff7895d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lantern e66002.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03036\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03036\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: e66002 Grid: true GridProjection: false 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 5508d1caa..f3f0f7750 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04036\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Gambit.\",\r\n \"wildIcons\": 5,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04036\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Gambit.\",\n \"wildIcons\": 5,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: 1fe462 Grid: true GridProjection: false 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 fca4062d7..3e835dca6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06235\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06235\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 2,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 80fafa Grid: true GridProjection: false 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 1390c2da2..80ade8e15 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Leadership 83d8d7.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02260\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02260\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 83d8d7 Grid: true GridProjection: false 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 306fa1237..e121fafcb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60521\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Item. Armor.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60521\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Survivor\",\n \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Item. + Armor.\",\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 5b1550 Grid: true GridProjection: false 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 725bbacc3..8e0bf42bb 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01072\",\r\n \"alternate_ids\": [\r\n \"01572\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Armor.\",\r\n \"combatIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01072\",\n \"alternate_ids\": [\n \"01572\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Body\",\n \"class\": \"Survivor\",\n \"cost\": 0,\n + \ \"level\": 0,\n \"traits\": \"Item. Armor.\",\n \"combatIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 593deb Grid: true GridProjection: false 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 68a2f1a79..57cb08b7c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60310\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Armor.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60310\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Armor.\",\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: dfbc13 Grid: true GridProjection: false 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 97181609a..9ec3956ba 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08131\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Injury.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08131\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Injury.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 46b4a0 Grid: true GridProjection: false 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 4b37a2a4d..5a2b364a0 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Expedition Leader DragSelectable: true -GMNotes: "{\r\n \"id\": \"04001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Veteran. Wayfarer.\",\r\n \"willpowerIcons\": - 4,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +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}" 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 20f761d20..d9fac3cc6 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: The Louisiana Lion DragSelectable: true -GMNotes: "{\r\n \"id\": \"01054\",\r\n \"alternate_ids\": [\r\n \"01554\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 5,\r\n - \ \"level\": 1,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01054\",\n \"alternate_ids\": [\n \"01554\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Rogue\",\n \"cost\": 5,\n \"level\": + 1,\n \"traits\": \"Ally. Criminal.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 27446e Grid: true GridProjection: false 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 3a2e855c8..35b878969 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: The Louisiana Lion DragSelectable: true -GMNotes: "{\r\n \"id\": \"01048\",\r\n \"alternate_ids\": [\r\n \"01548\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 6,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01048\",\n \"alternate_ids\": [\n \"01548\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Rogue\",\n \"cost\": 6,\n \"level\": + 0,\n \"traits\": \"Ally. Criminal.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: eaa415 Grid: true GridProjection: false 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 3a6a6cc26..7ab7cd798 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60124\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Insight. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60124\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Insight. Spirit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 037b2e Grid: true GridProjection: false 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 2cc6f874e..f9331a4ad 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06160\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Fated.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06160\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Tactic. Fated.\",\n \"combatIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: d3dcf1 Grid: true GridProjection: false 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 75dce55d5..e09d7e515 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03022\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03022\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 36c0cb Grid: true GridProjection: false 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 2c2e0ed95..775e2e50b 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60220\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60220\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ally. + Miskatonic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: fab3a9 Grid: true GridProjection: false 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 bec9c2b6e..d0fa93f12 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09110\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Fortune.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09110\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Fortune.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: '895047' Grid: true GridProjection: false 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 d1b58c533..8377e4d92 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02301\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 6,\r\n \"level\": 5,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02301\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 6,\n \"level\": 5,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 2d362c Grid: true GridProjection: false 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 c5417ef87..7e45483c1 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Martial Artist DragSelectable: true -GMNotes: "{\r\n \"id\": \"08010\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Chosen. Warden.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 2,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +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}" 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 8f7fe1c2d..9948a109d 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60320\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Item. Illicit.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60320\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Item. Illicit.\",\n \"willpowerIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Investigator Packs\"\n}" GUID: 5065a6 Grid: true GridProjection: false 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 f96fdafc2..8c4893805 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02024\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Illicit.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: c33a10 Grid: true GridProjection: false 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 27b13870d..b27d466de 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Ally DragSelectable: true -GMNotes: "{\r\n \"id\": \"01117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Ally.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01117\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Ally.\",\n \"cycle\": \"Core\"\n}" GUID: 3c1944 Grid: true GridProjection: false 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 0859000e4..b2ca0a845 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04200\",\r\n \"alternate_ids\": [\r\n \"60516\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 0,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04200\",\n \"alternate_ids\": [\n \"60516\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": + \"Spirit.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 050ba1 Grid: true GridProjection: false 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 bacca0c95..64ce920fc 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 @@ -19,28 +19,27 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09079\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Ritual.\",\r\n \"uses\": [\r\n - \ {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"customizations\": [\r\n {\r\n },\r\n - \ {\r\n \"name\": \"Shifting Ink\",\r\n \"xp\": 1,\r\n \"text\": - \"You may play Living Ink under the control of another investigator at your location.\"\r\n - \ },\r\n {\r\n \"name\": \"Subtle Depiction\",\r\n \"xp\": 1,\r\n - \ \"text\": \"At the start of your turn, you may choose not to remove 1 charge - from Living Ink and ignore its ability for the remainder of the round.\"\r\n },\r\n - \ {\r\n \"name\": \"Imbued Ink\",\r\n \"xp\": 2,\r\n \"text\": - \"Living Ink enters play with 2 additional charges and takes up an arcane slot instead - of a body slot.\",\r\n \"replaces\": {\r\n \"uses\": [\r\n {\r\n - \ \"count\": 5,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": - \"Eldritch Ink\",\r\n \"xp\": 3,\r\n \"text\": \"Circle another skill.\"\r\n - \ },\r\n {\r\n \"name\": \"Eldritch Ink\",\r\n \"xp\": 3,\r\n \"text\": - \"Circle another skill.\"\r\n },\r\n {\r\n \"name\": \"Macabre Depiction\",\r\n - \ \"xp\": 3,\r\n \"text\": \"Living Ink gains: \u201C\U0001F5F2 After you - reveal a chaos token with a symbol, exhaust Living Ink: Place 1 charge on it.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Vibrancy\",\r\n \"xp\": 3,\r\n \"text\": - \"Living Ink grants an additional +1 to the circled skill(s) and \u20131 to each - other skill.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09079\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Mystic\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n + \ \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": + \"resource\"\n }\n ],\n \"customizations\": [\n {\n },\n {\n \"name\": + \"Shifting Ink\",\n \"xp\": 1,\n \"text\": \"You may play Living Ink under + the control of another investigator at your location.\"\n },\n {\n \"name\": + \"Subtle Depiction\",\n \"xp\": 1,\n \"text\": \"At the start of your + turn, you may choose not to remove 1 charge from Living Ink and ignore its ability + for the remainder of the round.\"\n },\n {\n \"name\": \"Imbued Ink\",\n + \ \"xp\": 2,\n \"text\": \"Living Ink enters play with 2 additional charges + and takes up an arcane slot instead of a body slot.\",\n \"replaces\": {\n + \ \"uses\": [\n {\n \"count\": 5,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ]\n }\n + \ },\n {\n \"name\": \"Eldritch Ink\",\n \"xp\": 3,\n \"text\": + \"Circle another skill.\"\n },\n {\n \"name\": \"Eldritch Ink\",\n \"xp\": + 3,\n \"text\": \"Circle another skill.\"\n },\n {\n \"name\": \"Macabre + Depiction\",\n \"xp\": 3,\n \"text\": \"Living Ink gains: \u201C\U0001F5F2 + After you reveal a chaos token with a symbol, exhaust Living Ink: Place 1 charge + on it.\u201D\"\n },\n {\n \"name\": \"Vibrancy\",\n \"xp\": 3,\n + \ \"text\": \"Living Ink grants an additional +1 to the circled skill(s) and + \u20131 to each other skill.\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 42b36d Grid: true GridProjection: false 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 ab675dbf5..a5c317b87 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Hyperborean Grimoire DragSelectable: true -GMNotes: "{\r\n \"id\": \"08005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08005\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Relic. Tome.\",\n + \ \"willpowerIcons\": 2,\n \"wildIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 55001f Grid: true GridProjection: false 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 9199fe86a..d8abc1ffd 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03031\",\r\n \"alternate_ids\": [\r\n \"01687\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 3,\r\n - \ \"level\": 1,\r\n \"traits\": \"Item. Tool. Illicit.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03031\",\n \"alternate_ids\": [\n \"01687\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": + 1,\n \"traits\": \"Item. Tool. Illicit.\",\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: edd6c4 Grid: true GridProjection: false 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 e6f4dec33..8eb5530ab 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lockpicks cc11e4.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60305\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool. Illicit.\",\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60305\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Illicit.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: cc11e4 Grid: true GridProjection: false 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 247a0276c..3cfaaa6f3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05012\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 10,\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05012\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 10,\n \"traits\": \"Pact.\",\n \"weakness\": true,\n \"cycle\": \"The + Circle Undone\"\n}" GUID: acce72 Grid: true GridProjection: false 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 7b2373b44..2c11057b0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52003\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 3,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52003\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 3,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: 1258c6 Grid: true GridProjection: false 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 1b0296bc1..38e799653 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03191\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03191\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: '812175' Grid: true GridProjection: false 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 a10defe84..bd82e5ef1 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 102 +CardID: 55102 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '551': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907490/4AAE686A793E66311FF78890309D20670A329D16/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907034/013ED775CA50C6FC71731E4FBAEBF1ECA8C68F1E/ 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 411f313c5..76c44a81c 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Actress DragSelectable: true -GMNotes: "{\r\n \"id\": \"03006\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Performer.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" 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 e548463db..cf2a3eaf6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: No-Nonsense Archaeologist DragSelectable: true -GMNotes: "{\r\n \"id\": \"04196\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04196\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. + Wayfarer.\",\n \"intellectIcons\": 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 8bec05 Grid: true GridProjection: false 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 459525601..6936af8d7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02188\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02188\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: dc3b07 Grid: true GridProjection: false 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 e0e38729a..063385fcf 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 106 +CardID: 12106 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 d426044c1..24eb5c8ef 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Feisty Mechanic DragSelectable: true -GMNotes: "{\r\n \"id\": \"60309\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60309\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally.\",\n + \ \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: ad0ef0 Grid: true GridProjection: false 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 7be577ce6..74162c1b5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60524\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"intellectIcons\": - 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60524\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Fortune.\",\n \"intellectIcons\": + 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: fd393b Grid: true GridProjection: false 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 cdc3ad677..5fd3da87e 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01079\",\r\n \"alternate_ids\": [\r\n \"60517\",\r\n - \ \"01579\"\r\n ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01079\",\n \"alternate_ids\": [\n \"60517\",\n \"01579\"\n + \ ],\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": + 0,\n \"traits\": \"Fortune.\",\n \"intellectIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: 88d3c0 Grid: true GridProjection: false 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 47da35713..aa88d5b4e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Madness. Pact. DragSelectable: true -GMNotes: "{\r\n \"id\": \"03227\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness. Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03227\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Pact.\",\n \"weakness\": true,\n \"cycle\": \"The Path + to Carcosa\"\n}" GUID: 4f903e Grid: true GridProjection: false 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 dc0771865..85fbed303 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Logistical Genius DragSelectable: true -GMNotes: "{\r\n \"id\": \"85032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Agency. Veteran.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"85032\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Agency. Veteran.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 4120f3 Grid: true GridProjection: false 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 fa6e7c596..09ec8a741 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06205\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06205\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 122e98 Grid: true GridProjection: false 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 5bc770462..51d7cd5bd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60326\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60326\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 0feb74 Grid: true GridProjection: false 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 dda15a95f..3d2813b57 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04107\",\r\n \"alternate_ids\": [\r\n \"60308\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04107\",\n \"alternate_ids\": [\n \"60308\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n + \ \"level\": 0,\n \"traits\": \"Item. Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: c607c5 Grid: true GridProjection: false 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 56ef7eab2..5edb5c214 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '... Or Are They?' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02230\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02230\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: 07b163 Grid: true GridProjection: false 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 626d06f85..f2551a643 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '... Or Are They?' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07307\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07307\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: c8bb2a Grid: true GridProjection: false 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 2169988c4..92352b775 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Omen of Misfortune DragSelectable: true -GMNotes: "{\r\n \"id\": \"07224\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Charm. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07224\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Charm. Cursed.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: aae31c Grid: true GridProjection: false 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 c1669d59b..a282cbc85 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01084\",\r\n \"alternate_ids\": [\r\n \"01584\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 1,\r\n - \ \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01084\",\n \"alternate_ids\": [\n \"01584\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": + \"Fortune.\",\n \"cycle\": \"Core\"\n}" GUID: 439af2 Grid: true GridProjection: false 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 534569c4d..32dbf27a9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60528\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Fortune.\",\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60528\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Fortune.\",\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 04d33d Grid: true GridProjection: false 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 c86f96da1..a1ebe7188 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Lucky! ce0dd5.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01080\",\r\n \"alternate_ids\": [\r\n \"01580\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01080\",\n \"alternate_ids\": [\n \"01580\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Fortune.\",\n \"cycle\": \"Core\"\n}" GUID: ce0dd5 Grid: true GridProjection: false 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 6fe923d99..16a4279c4 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Dreamer DragSelectable: true -GMNotes: "{\r\n \"id\": \"06004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Mystic\",\r\n \"traits\": \"Dreamer. Drifter. Wayfarer.\",\r\n \"willpowerIcons\": - 4,\r\n \"intellectIcons\": 3,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +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}" 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 2d829c493..d5cba385f 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03309\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03309\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 2,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: a6af13 Grid: true GridProjection: false 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 9c21140fe..3baea5a78 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02156\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02156\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d88407 Grid: true GridProjection: false 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 3f894028b..08151e08c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05323\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05323\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 1a90a4 Grid: true GridProjection: false 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 80108b7a1..0c11b8027 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"09124\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Shoggoth.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09124\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Shoggoth.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 79cc11 Grid: true GridProjection: false 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 8a5872e1a..3081d8fa7 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04229\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 5,\r\n \"level\": 4,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 8,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04229\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 5,\n \"level\": 4,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 8,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: b1ad65 Grid: true GridProjection: false 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 d3a0cd912..c93e36b87 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Machete 86ee68.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01020\",\r\n \"alternate_ids\": [\r\n \"01520\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01020\",\n \"alternate_ids\": [\n \"01520\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Guardian\",\n \"cost\": 3,\n + \ \"level\": 0,\n \"traits\": \"Item. Weapon. Melee.\",\n \"combatIcons\": 1,\n + \ \"cycle\": \"Core\"\n}" GUID: 86ee68 Grid: true GridProjection: false 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 73be7826d..0f288cab9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Mysterious Benefactress DragSelectable: true -GMNotes: "{\r\n \"id\": \"03198\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Patron.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03198\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Patron.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 1ee492 Grid: true GridProjection: false 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 4ec09e1c5..2bf323bbb 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01040\",\r\n \"alternate_ids\": [\r\n \"01540\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 0,\r\n - \ \"level\": 1,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01040\",\n \"alternate_ids\": [\n \"01540\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Seeker\",\n \"cost\": 0,\n \"level\": + 1,\n \"traits\": \"Item. Tool.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 378e84 Grid: true GridProjection: false 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 4c2557182..44b0f3e71 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01030\",\r\n \"alternate_ids\": [\r\n \"01530\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01030\",\n \"alternate_ids\": [\n \"01530\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": + 0,\n \"traits\": \"Item. Tool.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 8cc0a6 Grid: true GridProjection: false 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 caa79d46d..b2d610d5d 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 @@ -19,27 +19,26 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09100\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Improvised. Trap.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"type\": \"Time\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"customizations\": [\r\n {\r\n \"name\": \"Improved Timer\",\r\n \"xp\": - 1,\r\n \"text\": \"When you play Makeshift Trap, you may increase or decrease - its uses by 1.\"\r\n },\r\n {\r\n \"name\": \"Tripwire\",\r\n \"xp\": - 1,\r\n \"text\": \"Only trigger Makeshift Trap\u2019s forced ability if there - are 1 or more enemies at attached location.\"\r\n },\r\n {\r\n \"name\": - \"Simple\",\r\n \"xp\": 2,\r\n \"text\": \"Makeshift Trap gains fast and - \u201Cplay during any \U0001F5F2 window.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Poisonous\",\r\n \"xp\": 2,\r\n \"text\": \"When you remove 1 or more - time from Makeshift Trap, deal 1 damage to an enemy at attached location.\"\r\n - \ },\r\n {\r\n \"name\": \"Remote Configuration\",\r\n \"xp\": 2,\r\n - \ \"text\": \"When you play Makeshift Trap, you may attach it to a revealed - connecting location.\"\r\n },\r\n {\r\n \"name\": \"Net\",\r\n \"xp\": - 3,\r\n \"text\": \"Non-Elite enemies at attached location cannot move or make - attacks of opportunity.\"\r\n },\r\n {\r\n \"name\": \"Explosive Device\",\r\n - \ \"xp\": 4,\r\n \"text\": \"When Makeshift Trap has no time and is discarded, - deal 3 damage to each enemy and investigator at attached location.\"\r\n }\r\n - \ ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09100\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Improvised. Trap.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Time\",\n \"token\": \"resource\"\n }\n ],\n \"customizations\": [\n + \ {\n \"name\": \"Improved Timer\",\n \"xp\": 1,\n \"text\": \"When + you play Makeshift Trap, you may increase or decrease its uses by 1.\"\n },\n + \ {\n \"name\": \"Tripwire\",\n \"xp\": 1,\n \"text\": \"Only trigger + Makeshift Trap\u2019s forced ability if there are 1 or more enemies at attached + location.\"\n },\n {\n \"name\": \"Simple\",\n \"xp\": 2,\n \"text\": + \"Makeshift Trap gains fast and \u201Cplay during any \U0001F5F2 window.\u201D\"\n + \ },\n {\n \"name\": \"Poisonous\",\n \"xp\": 2,\n \"text\": + \"When you remove 1 or more time from Makeshift Trap, deal 1 damage to an enemy + at attached location.\"\n },\n {\n \"name\": \"Remote Configuration\",\n + \ \"xp\": 2,\n \"text\": \"When you play Makeshift Trap, you may attach + it to a revealed connecting location.\"\n },\n {\n \"name\": \"Net\",\n + \ \"xp\": 3,\n \"text\": \"Non-Elite enemies at attached location cannot + move or make attacks of opportunity.\"\n },\n {\n \"name\": \"Explosive + Device\",\n \"xp\": 4,\n \"text\": \"When Makeshift Trap has no time and + is discarded, deal 3 damage to each enemy and investigator at attached location.\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: aa897f Grid: true GridProjection: false 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 614be94f8..c82001b4a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09106\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Dilemma. Tactic.\",\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09106\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Dilemma. Tactic.\",\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 18247d Grid: true GridProjection: false 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 c38d65d5e..aeb23d711 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 101 +CardID: 55101 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '551': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907490/4AAE686A793E66311FF78890309D20670A329D16/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907034/013ED775CA50C6FC71731E4FBAEBF1ECA8C68F1E/ 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 1b1a275ea..40948f2a6 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Researcher DragSelectable: true -GMNotes: "{\r\n \"id\": \"06002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Assistant. Scholar.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 5,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +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}" 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 1ed9e3956..aff2a1433 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07162\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07162\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 5606b3 Grid: true GridProjection: false 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 5ce867cd6..269fd8643 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03229\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Spirit. Bold.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03229\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Spirit. Bold.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: c55160 Grid: true GridProjection: false 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 d8d0eb5a1..351baffec 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60125\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spirit. Bold.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60125\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spirit. Bold.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 14424c Grid: true GridProjection: false 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 233b4803a..f690ac2cc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60325\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"agilityIcons\": - 3,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60325\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"agilityIcons\": 3,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: '982716' Grid: true GridProjection: false 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 25bae4f01..e79df6608 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01092\",\r\n \"alternate_ids\": [\r\n \"01592\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01092\",\n \"alternate_ids\": [\n \"01592\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Neutral\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"agilityIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: 679b13 Grid: true GridProjection: false 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 7ca60cd68..7c6e848db 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09048\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09048\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight. Tactic.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 1760be Grid: true GridProjection: false 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 45119859c..b6d47bf0c 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Entertainer DragSelectable: true -GMNotes: "{\r\n \"id\": \"05006\",\r\n \"alternate_ids\": [\r\n \"99001\"\r\n - \ ],\r\n \"type\": \"Investigator\",\r\n \"class\": \"Mystic\",\r\n \"traits\": - \"Performer. Sorcerer.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": 4,\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +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}" GUID: 11122f Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau b05c03.yaml b/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau b05c03.yaml index 167367cf3..9f0e37802 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau b05c03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Marie Lambeau b05c03.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05006-m\",\r\n \"alternate_ids\": [\r\n \"99001-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"05006-m\",\n \"alternate_ids\": [\n \"99001-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: b05c03 Grid: true GridProjection: false 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 acc06e459..de17860a9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07121\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07121\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 4e2d75 Grid: true GridProjection: false 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 ef2d6c297..dd22c526a 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Soldier DragSelectable: true -GMNotes: "{\r\n \"id\": \"03001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Veteran.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 5,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" 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 8785367e8..ff12f7e5f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04104\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04104\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 6a9021 Grid: true GridProjection: false 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 aba73d850..885f9aeb7 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Remnant of the Unknown DragSelectable: true -GMNotes: "{\r\n \"id\": \"09037\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm. Armor.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09037\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Charm. Armor.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: c795c8 Grid: true GridProjection: false 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 2ba4934ee..c45087c10 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60321\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 5,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60321\",\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\": 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Investigator Packs\"\n}" GUID: '725690' Grid: true GridProjection: false 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 fb60a70bf..1b9967d43 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60306\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60306\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: f32343 Grid: true GridProjection: false 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 421cf0bf7..bf1fc1dc6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05114\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05114\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: a57f19 Grid: true GridProjection: false 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 0b2d99790..f98a694d2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Tool. Melee.\",\r\n \"combatIcons\": 2,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08002\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Tool. Melee.\",\n + \ \"combatIcons\": 2,\n \"wildIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 598ba0 Grid: true GridProjection: false 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 4347c9e78..95bbfe458 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08083\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic. Science.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08083\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian|Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Ally. Miskatonic. Science.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: e419b4 Grid: true GridProjection: false 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 0f5ec09c1..9d8633299 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08038\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08038\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 0d3bfa Grid: true GridProjection: false 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 2696972c1..8adad14d0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01535\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01535\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 85822c Grid: true GridProjection: false 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 af4d8b871..6d2e1e725 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: ba16cb Grid: true GridProjection: false 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 6c4c5fbee..941655bb2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"82024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Mask.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"82024\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Mask.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: 6179d5 Grid: true GridProjection: false 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 afb789bd1..04da9c4d2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08061\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08061\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Spirit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: ef46e9 Grid: true GridProjection: false 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 c607b0249..41ea480a7 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"85031\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Weapon. Science.\",\r\n \"combatIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"85031\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Weapon. Science.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: 2fc31c Grid: true GridProjection: false 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 778e376b9..14cd8d71b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Strange Evidence DragSelectable: true -GMNotes: "{\r\n \"id\": \"08617\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Relic. Expedition.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08617\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Relic. Expedition.\",\n \"willpowerIcons\": + 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: bad631 Grid: true GridProjection: false 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 02d9836a5..60cd54279 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Experienced Hunter DragSelectable: true -GMNotes: "{\n \"id\": \"08086\",\n \"type\": \"Asset\",\n \"class\": \"Guardian|Seeker\",\n - \ \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Ally. Detective.\",\n \"intellectIcons\": - 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": - 0,\n \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n - \ \"cycle\": \"Edge of the Earth\"\n}" +GMNotes: "{\n \"id\": \"08086\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian|Seeker\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": + \"Ally. Detective.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Evidence\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '573765' Grid: true GridProjection: false 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 10e97fb65..b625dbecf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Microscope 48be49.yaml @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 103 +CardID: 12103 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"10042\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tool. Science.\",\n \"intellectIcons\": - 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10042\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Science.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" GUID: 48be49 Grid: true GridProjection: false 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 3385acb60..0d6a6d71d 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01068\",\r\n \"alternate_ids\": [\r\n \"01568\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01068\",\n \"alternate_ids\": [\n \"01568\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": + \"Spell.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 5d6e57 Grid: true GridProjection: false 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 cb17d2955..ba8f88001 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50008\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50008\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: e72762 Grid: true GridProjection: false 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 7372f140c..12e643376 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60226\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60226\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 9b1c5b Grid: true GridProjection: false 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 0fb1c610f..a6443efc2 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01036\",\r\n \"alternate_ids\": [\r\n \"01536\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01036\",\n \"alternate_ids\": [\n \"01536\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Insight.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 8cf335 Grid: true GridProjection: false 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 484e8d44f..3d8d5ca07 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06328\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06328\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane x2\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ad58aa Grid: true GridProjection: false 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 d534542c1..6d668a185 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08618\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Relic. Expedition.\",\r\n \"intellectIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08618\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Relic. Expedition.\",\n \"intellectIcons\": + 2,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 08dd86 Grid: true GridProjection: false 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 8a22a7dce..bcb5f0943 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Secretary DragSelectable: true -GMNotes: "{\r\n \"id\": \"03002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Assistant.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" GUID: 6c4c58 Grid: true GridProjection: false 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 735469e8d..d3fc3fb06 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60232\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 4,\r\n \"traits\": \"Grant.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60232\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"level\": 4,\n \"traits\": \"Grant.\",\n \"permanent\": true,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 1a1b58 Grid: true GridProjection: false 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 c47f65b7b..27d3a373b 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 @@ -19,12 +19,12 @@ CustomDeck: UniqueBack: false Description: Cat General of Ulthar DragSelectable: true -GMNotes: "{\r\n \"id\": \"06030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Creature. Dreamlands.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06031\"\r\n },\r\n - \ {\r\n \"count\": 1,\r\n \"id\": \"06032\"\r\n },\r\n {\r\n \"count\": - 1,\r\n \"id\": \"06033\"\r\n }\r\n ],\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06030\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Ally. + Creature. Dreamlands.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": + \"06031\"\n },\n {\n \"count\": 1,\n \"id\": \"06032\"\n },\n + \ {\n \"count\": 1,\n \"id\": \"06033\"\n }\n ],\n \"wildIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: e1aedf Grid: true GridProjection: false 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 1383e2e07..77b351509 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to the Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53007\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n + \ \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 5,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Return to + the Forgotten Age\"\n}" GUID: 3d57b4 Grid: true GridProjection: false 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 4a2124814..c0c5d3e7b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04271\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04271\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 5,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 68fce2 Grid: true GridProjection: false 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 a0c45f502..d3a9b86f0 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04029\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04029\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten + Age\"\n}" GUID: 5558f1 Grid: true GridProjection: false 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 0972e295d..d59633d52 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"wildIcons\": 2,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04006\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Ally. Wayfarer.\",\n + \ \"wildIcons\": 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: f91fd9 Grid: true GridProjection: false 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 1d0198d95..9e508e1f2 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05273\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Weapon. Ranged.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05273\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. Weapon. Ranged.\",\n \"combatIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: 0ab574 Grid: true GridProjection: false 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 3403257a1..b81d05078 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Enemy DragSelectable: true -GMNotes: "{\r\n \"id\": \"01101\",\r\n \"alternate_ids\": [\r\n \"01601\"\r\n - \ ],\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n \"traits\": \"Humanoid. - Criminal.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01101\",\n \"alternate_ids\": [\n \"01601\"\n ],\n \"type\": + \"Enemy\",\n \"class\": \"Neutral\",\n \"traits\": \"Humanoid. Criminal.\",\n + \ \"weakness\": true,\n \"basicWeaknessCount\": 1,\n \"cycle\": \"Core\"\n}" GUID: b239d7 Grid: true GridProjection: false 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 d71731c47..3dfaaf7da 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08003\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Criminal.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08003\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Criminal.\",\n \"weakness\": true,\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: fc1506 Grid: true GridProjection: false 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 5000ee33f..193594996 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: The Exotic Morgana DragSelectable: true -GMNotes: "{\r\n \"id\": \"98017\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Assistant.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98017\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Ally. Assistant.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": + \"Promo\"\n}" GUID: 692ced Grid: true GridProjection: false 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 5704614f1..d641a9a68 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02273\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02273\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 523b76 Grid: true GridProjection: false 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 ba99c6e20..c016632d2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06115\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06115\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: d753d7 Grid: true GridProjection: false 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 829947c94..0ee07d12c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08054\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Favor. Gambit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08054\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Favor. Gambit.\",\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 67eb69 Grid: true GridProjection: false 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 cadc5626f..17b01e6fb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05029\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Favor. Gambit.\",\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05029\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Favor. Gambit.\",\n \"cycle\": + \"The Circle Undone\"\n}" GUID: '276477' Grid: true GridProjection: false 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 3d5970d26..6dc1a834a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02300\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 5,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02300\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Spirit.\",\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: e21854 Grid: true GridProjection: false 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 0e131ba67..807d7feda 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60116\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60116\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 63b3e5 Grid: true GridProjection: false 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 35aefeb53..483170e91 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"81030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Talent.\",\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"81030\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Talent.\",\n \"cycle\": \"Standalone\"\n}" GUID: a49751 Grid: true GridProjection: false 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 9c014cc8f..40e8e5eb3 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Archeologist DragSelectable: true -GMNotes: "{\r\n \"id\": \"08007\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Wayfarer.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 5,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +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}" 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 086ebcd8f..6d57b3da3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54012\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Charm.\",\r\n \"cycle\": - \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54012\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Charm.\",\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 72deff Grid: true GridProjection: false 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 e098e528b..ca575aa43 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09093\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09093\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spell. Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: ad3efc Grid: true GridProjection: false 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 88c7aac8d..e4209160e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02267\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02267\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spell. Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 1cd2bd Grid: true GridProjection: false 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 f83837e31..8a6dac020 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Moonstone 0d006f.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06203\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Dreamlands.\",\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06203\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Dreamlands.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 0d006f Grid: true GridProjection: false 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 dce1ab0cc..c7604b633 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09028\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09028\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 1b2331 Grid: true GridProjection: false 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 aa41f54ce..cd89d200a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03111\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Talent. Composure.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03111\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Talent. Composure.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 5fe780 Grid: true GridProjection: false 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 48ff15443..da234f154 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08056\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Composure.\",\r\n \"willpowerIcons\": - 2,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08056\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Talent. Composure.\",\n \"willpowerIcons\": + 2,\n \"agilityIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 6b3a27 Grid: true GridProjection: false 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 6d42f8b0c..640189ac2 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05153\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05153\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Circle + Undone\"\n}" GUID: 1339b0 Grid: true GridProjection: false 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 2c96f527b..5525e6672 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98005\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98005\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": 1,\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Promo\"\n}" GUID: 274daa Grid: true GridProjection: false 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 ef2f9c983..135478134 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60509\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Creature.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60509\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Ally. + Creature.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 59e40d Grid: true GridProjection: false 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 d1dcb277a..52970c328 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05018\",\r\n \"alternate_ids\": [\r\n \"99002\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 3,\r\n - \ \"traits\": \"Spell. Song.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05018\",\n \"alternate_ids\": [\n \"99002\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Spell. Song.\",\n + \ \"wildIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 3b8cb7 Grid: true GridProjection: false 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 cf5d36032..924973cf1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Ruthless Tactician DragSelectable: true -GMNotes: "{\r\n \"id\": \"51052\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 5,\r\n \"traits\": \"Ally. Criminal. Syndicate.\",\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51052\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 5,\n \"traits\": \"Ally. Criminal. Syndicate.\",\n \"intellectIcons\": + 2,\n \"combatIcons\": 2,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 7f7ecc Grid: true GridProjection: false 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 d5cab71f1..c7af3daca 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Narcolepsy 57e648.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06037\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06037\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: 57e648 Grid: true GridProjection: false 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 c0d22e5e9..dd18abbb7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03267\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03267\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Fortune.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: f6ff32 Grid: true GridProjection: false 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 d4e215dd0..7570b8c71 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Boxer DragSelectable: true -GMNotes: "{\r\n \"id\": \"60101\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Criminal. Warden.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 2,\r\n \"combatIcons\": 5,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +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}" 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 7d563ba84..c6fb7abcd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09111\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Dilemma. Insight.\",\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09111\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Dilemma. Insight.\",\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 9c4015 Grid: true GridProjection: false 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 41735d750..44719340d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98014\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Innate. Developed.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98014\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Innate. Developed.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Promo\"\n}" GUID: 9d6e9a Grid: true GridProjection: false 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 21117c81e..3354fb84d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60502\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60502\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 3,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 6da7c4 Grid: true GridProjection: false 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 003136164..92beb519a 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 @@ -50,6 +50,7 @@ VALID_TOKENS = { } SHOW_MULTI_RELEASE = 3 +SHOW_MULTI_RETURN = 3 require("playercards/CardsThatSealTokens") end) @@ -78,6 +79,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -152,6 +158,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -195,6 +206,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -267,6 +282,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -280,6 +307,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -297,7 +336,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -342,6 +381,11 @@ do 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) @@ -354,9 +398,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -391,7 +436,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -410,6 +455,12 @@ do 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) @@ -426,8 +477,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -466,6 +517,18 @@ do 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) 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 f16e696fd..a12ba3a03 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Huntress of Bast DragSelectable: true -GMNotes: "{\r\n \"id\": \"07262\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Ally. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07262\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Ally. + Blessed.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 2,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: 5659d1 Grid: true GridProjection: false 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 dffa4bdd0..6d84ecb97 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03313\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03313\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item.\",\n + \ \"intellectIcons\": 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 9bcdee Grid: true GridProjection: false 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 c22e257d7..7d93ce489 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Newspaper ee20c9.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02155\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02155\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item.\",\n + \ \"intellectIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: ee20c9 Grid: true GridProjection: false 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 291201333..eaa5fc5ea 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06330\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm. Cursed.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 3,\r\n \"id\": \"06331\"\r\n }\r\n - \ ],\r\n \"willpowerIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06330\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Charm. Cursed.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": \"06331\"\n + \ }\n ],\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: d6f6f1 Grid: true GridProjection: false 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 4c55b20cc..31632b394 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nihilism fc4168.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60404\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60404\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: fc4168 Grid: true GridProjection: false 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 739af2ccf..7b00c527b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Renowned Inventor DragSelectable: true -GMNotes: "{\r\n \"id\": \"87014\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Scientist. Ally. Past.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"87014\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Scientist. Ally. Past.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 03695f Grid: true GridProjection: false 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 3eed2c4aa..e794f2c33 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Nimble b8843c.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60317\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"agilityIcons\": 1,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60317\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"agilityIcons\": 1,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: b8843c Grid: true GridProjection: false 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 b10b0eda3..ba7aa7101 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Every Trial a Lesson DragSelectable: true -GMNotes: "{\r\n \"id\": \"54009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54009\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: c7fe4a Grid: true GridProjection: false 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 fe2dae9a6..d4946f996 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Enigmatic Warlock DragSelectable: true -GMNotes: "{\r\n \"id\": \"08091\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Sorcerer.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08091\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian|Mystic\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": + \"Ally. Sorcerer.\",\n \"willpowerIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 6c5628 Grid: true GridProjection: false 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 42f200c7e..8bba5fbe8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03307\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 5,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03307\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 1f3f16 Grid: true GridProjection: false 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 e9c42dd87..c822e956a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03026\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03026\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Path to Carcosa\"\n}" GUID: 44cf4a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Norman Withers a5d9bb.yaml b/unpacked/Bag All Player Cards 15bb07/Card Norman Withers a5d9bb.yaml index 4a3401fd3..29fef4a39 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Norman Withers a5d9bb.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Norman Withers a5d9bb.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08004-m\",\r\n \"alternate_ids\": [\r\n \"98007-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"08004-m\",\n \"alternate_ids\": [\n \"98007-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: a5d9bb Grid: true GridProjection: false 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 56da6cebd..3bf428822 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Astronomer DragSelectable: true -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}\r" +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}" GUID: e0a155 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 19c4be620..dfa7d5fb6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03272\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03272\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: d1d7fa Grid: true GridProjection: false 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 d3c221fa3..70862be87 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06284\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06284\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: f0389b Grid: true GridProjection: false 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 2c89786b0..00d681775 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obfuscation 5ec6d0.yaml @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07027\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07027\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 5ec6d0 Grid: true GridProjection: false 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 7d04efa98..827a039d9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07008\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07008\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 3,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: c5d8a9 Grid: true GridProjection: false 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 3a4d43a6a..e0fe62e49 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54013\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 4,\r\n \"traits\": \"Blessed.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"level\": 4,\n \"traits\": \"Blessed.\",\n \"permanent\": true,\n \"cycle\": + \"Return to the Circle Undone\"\n}" GUID: cf5ac8 Grid: true GridProjection: false 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 955c5db25..ccb69f9b2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Obsessive a2e7d7.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60204\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60204\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: a2e7d7 Grid: true GridProjection: false 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 02262cc39..5dac8f300 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09024\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09024\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: '972250' Grid: true GridProjection: false 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 638c796e9..07d6f0b5b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06008\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Insight. Research.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06008\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Insight. Research.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 3586e6 Grid: true GridProjection: false 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 825ed4009..b8611da6e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60217\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60217\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 010509 Grid: true GridProjection: false 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 3f4ee4324..6edf57e98 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54004\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome. Occult.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 3,\r\n \"id\": \"05317\"\r\n }\r\n - \ ],\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54004\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Tome. Occult.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": \"05317\"\n + \ }\n ],\n \"intellectIcons\": 2,\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 71d99c Grid: true GridProjection: false 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 ee1ab0e36..2953234a4 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05316\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome. Occult.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 3,\r\n \"id\": \"05317\"\r\n }\r\n - \ ],\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05316\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Occult.\",\n \"bonded\": [\n {\n \"count\": 3,\n \"id\": \"05317\"\n + \ }\n ],\n \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 5d6728 Grid: true GridProjection: false 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 b98e59338..5abe13e3c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07013\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07013\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item.\",\n \"weakness\": true,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: 6aea76 Grid: true GridProjection: false 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 a984a7cbe..3847ca0da 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08065\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"dynamicIcons\": - true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08065\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 1,\n \"traits\": \"Practiced. Expert.\",\n \"dynamicIcons\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 49a338 Grid: true GridProjection: false 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 59bbd7c58..fe99817ee 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"53013\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53013\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: e27c93 Grid: true GridProjection: false 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 9c32faa22..c8e952c1b 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 @@ -19,12 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06279\",\r\n \"alternate_ids\": [\r\n \"01686\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 3,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": - \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06279\",\n \"alternate_ids\": [\n \"01686\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": + 3,\n \"traits\": \"Item. Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 8a0060 Grid: true GridProjection: false 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 5ac7cef6e..b2ef57700 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01031\",\r\n \"alternate_ids\": [\r\n \"01531\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01031\",\n \"alternate_ids\": [\n \"01531\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": + 0,\n \"traits\": \"Item. Tome.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 063fd8 Grid: true GridProjection: false 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 15f92dfb8..783f15d5e 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04273\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 3,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04273\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 44a37f Grid: true GridProjection: false 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 52dd0cc0d..e88d64a67 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Key\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09117\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Key\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: e7d988 Grid: true GridProjection: false 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 fe8313d92..28d9bacf3 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60507\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": \"Key\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60507\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n + \ \"type\": \"Key\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 5888da Grid: true GridProjection: false 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 e35337398..ed84757a5 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08088\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08088\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian|Rogue\",\n \"cost\": 0,\n \"level\": 2,\n \"traits\": + \"Item. Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 7eb1ec Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d2.yaml b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml similarity index 75% rename from unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d2.yaml rename to unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml index f51a75c42..ca578051c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Olive McBride 9683d2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Olive McBride (2) 9683d2.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Tried Everything Once DragSelectable: true -GMNotes: "{\n \"id\": \"10097\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n - \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Ally. Witch.\",\n \"willpowerIcons\": - 2,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10097\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Ally. + Witch.\",\n \"willpowerIcons\": 2,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" GUID: 9683d2 Grid: true GridProjection: false @@ -34,7 +34,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Card -Nickname: Olive McBride +Nickname: Olive McBride (2) SidewaysCard: false Snap: true Sticky: true 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 f057cb25a..b5f4e1a9c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Will Try Anything Once DragSelectable: true -GMNotes: "{\r\n \"id\": \"04197\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Witch.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04197\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ally. + Witch.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 9683d0 Grid: true GridProjection: false 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 c0e96d1fe..c76017bbf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Permanent DragSelectable: true -GMNotes: "{\r\n \"id\": \"53010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53010\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 2ebdf1 Grid: true GridProjection: false 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 1f2ad8254..0e9e63e2e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04236\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04236\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: b0c61c Grid: true GridProjection: false 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 d506a8f3e..7c4732c80 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08028\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08028\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the + Earth\"\n}" GUID: a336de Grid: true GridProjection: false 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 12e6837ad..9c46da1df 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03263\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03263\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: a13ca4 Grid: true GridProjection: false 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 c464101e1..970abf3c8 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Signature DragSelectable: true -GMNotes: "{\r\n \"id\": \"01010\",\r\n \"alternate_ids\": [\r\n \"01510\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 1,\r\n - \ \"traits\": \"Tactic.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01010\",\n \"alternate_ids\": [\n \"01510\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Neutral\",\n \"cost\": 1,\n \"traits\": \"Tactic.\",\n + \ \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 2,\n \"cycle\": + \"Core\"\n}" GUID: ea6d44 Grid: true GridProjection: false 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 5b27741d6..0cad66734 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09006\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Innate.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09006\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Innate.\",\n \"wildIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: ac3502 Grid: true GridProjection: false 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 3411145dc..209d723ad 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08084\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian|Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08084\",\n \"type\": \"Event\",\n \"class\": \"Guardian|Seeker\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Insight. Tactic.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 4e4179 Grid: true GridProjection: false 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 ffd308e21..635825ca6 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08085\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian|Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of - the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08085\",\n \"type\": \"Event\",\n \"class\": \"Guardian|Seeker\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Insight. Tactic.\",\n \"intellectIcons\": + 2,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: b94090 Grid: true GridProjection: false 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 d8cea3027..4b0b0fe48 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09029\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Fortune. Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 1,\r\n - \ \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09029\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Fortune. Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 1,\n \"type\": + \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: '919856' Grid: true GridProjection: false 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 c0806c9cd..3f76c5b37 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60132\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 5,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"combatIcons\": - 4,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60132\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Spirit. Tactic.\",\n \"combatIcons\": + 4,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 8ffa44 Grid: true GridProjection: false 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 063947198..daed897a6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60117\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60117\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"combatIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 22bb1e Grid: true GridProjection: false 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 f2315ff86..f6ff6b55c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09098\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Charm.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09098\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Item. + Charm.\",\n \"agilityIcons\": 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 647c62 Grid: true GridProjection: false 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 bcb23a83c..f770ae6a2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09085\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09085\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 95f4b0 Grid: true GridProjection: false 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 302d38fe4..ccaf5f44f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51009\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Fortune.\",\r\n \"combatIcons\": - 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51009\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Fortune.\",\n \"combatIcons\": + 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 70772b Grid: true GridProjection: false 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 5e5ba1bdc..a47e12f1a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Oops! 59d89b.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02113\",\r\n \"alternate_ids\": [\r\n \"60518\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"combatIcons\": 2,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02113\",\n \"alternate_ids\": [\n \"60518\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Fortune.\",\n \"combatIcons\": 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 59d89b Grid: true GridProjection: false 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 2db936c9d..a01daf8fb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06029\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06029\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: a33acd Grid: true GridProjection: false 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 a970df990..3d4ca42da 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02231\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02231\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 63f145 Grid: true GridProjection: false 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 fa0524920..635818588 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Opportunist a88392.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01053\",\r\n \"alternate_ids\": [\r\n \"60319\",\r\n - \ \"01553\"\r\n ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n \"level\": - 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01053\",\n \"alternate_ids\": [\n \"60319\",\n \"01553\"\n + \ ],\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n \"level\": 0,\n \"traits\": + \"Innate.\",\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: a88392 Grid: true GridProjection: false 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 20ceba850..5bab964ba 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04204\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Weapon. Ranged.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 1,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04204\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Neutral\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Weapon. Ranged.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 1,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 2acced Grid: true GridProjection: false 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 846082f3c..0e7276aef 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09051\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09051\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: d084d7 Grid: true GridProjection: false 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 a8ad68928..c667a983f 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06158\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06158\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: df0e22 Grid: true GridProjection: false 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 f4b9bbdf3..cb56772e2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04194\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04194\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 19ab7c Grid: true GridProjection: false 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 01278c0db..d32b6c056 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Madness. Paradox. DragSelectable: true -GMNotes: "{\r\n \"id\": \"04264\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness. Paradox.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04264\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Paradox.\",\n \"weakness\": true,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: d64b8f Grid: true GridProjection: false 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 ae335a7a7..d12353168 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60126\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"combatIcons\": 3,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60126\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 2,\n \"traits\": \"Practiced. Expert.\",\n \"combatIcons\": 3,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 017e1f Grid: true GridProjection: false 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 595cb224a..d870ec85b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower 5ab9f4.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01091\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"combatIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01091\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"combatIcons\": 2,\n \"cycle\": + \"Core\"\n}" GUID: 5ab9f4 Grid: true GridProjection: false 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 303893f6b..95ff18430 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overpower e0881e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01591\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"combatIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01591\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"combatIcons\": 2,\n \"cycle\": + \"Core\"\n}" GUID: e0881e Grid: true GridProjection: false 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 715d1efa1..2a4910172 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Overzealous 88a9b3.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"03040\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03040\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 2,\n + \ \"cycle\": \"The Path to Carcosa\"\n}" GUID: 88a9b3 Grid: true GridProjection: false 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 56e35a879..f68bcc400 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Painkillers 0c859f.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02117\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 0c859f Grid: true GridProjection: false 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 014f6e465..3604b8ae7 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Panic 93e52d.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08132\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08132\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 93e52d Grid: true GridProjection: false 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 40a4b27b8..d6e6bc4d4 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pantalone adf028.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"82025\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Mask.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"82025\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Mask.\",\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: adf028 Grid: true GridProjection: false 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 02c957b3a..d7cabb967 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09767\",\r\n \"type\": \"Treachery\",\r\n \"traits\": - \"Madness. Paradox.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09767\",\n \"type\": \"Treachery\",\n \"traits\": \"Madness. + Paradox.\",\n \"weakness\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 3c3dfa Grid: true GridProjection: false 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 4bb9d35d7..83c76e993 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07120\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Covenant. Blessed. Cursed.\",\r\n \"permanent\": - true,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07120\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Blessed. Cursed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 541ee9 Grid: true GridProjection: false 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 8b8523f96..49f45e8c9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08066\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Augury.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08066\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Augury.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '583026' Grid: true GridProjection: false 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 18f4a06ec..4591438cd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60415\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Augury.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60415\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Augury.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 47bdba Grid: true GridProjection: false 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 34d4e6542..e353b37c0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Paranoia c17498.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01097\",\r\n \"alternate_ids\": [\r\n \"01597\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01097\",\n \"alternate_ids\": [\n \"01597\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Madness.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 2,\n \"cycle\": \"Core\"\n}" GUID: c17498 Grid: true GridProjection: false 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 679b5a4d7..662987ea5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02108\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02108\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 7f99cc Grid: true GridProjection: false 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 320ecbb63..c3bfb78e5 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Violinist DragSelectable: true -GMNotes: "{\r\n \"id\": \"06005\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Performer. Cursed.\",\r\n \"willpowerIcons\": - 4,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +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}" 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 8ed15f7d3..47210c50b 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: My Muse DragSelectable: true -GMNotes: "{\r\n \"id\": \"06016\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Instrument.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06016\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Instrument.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: ea0007 Grid: true GridProjection: false 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 51e8e9d7a..f033ea712 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04233\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Illicit. Fated.\",\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04233\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Illicit. Fated.\",\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 9f0b34 Grid: true GridProjection: false 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 f6a2c6e67..04f5ab794 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"09126\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 10,\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09126\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 10,\n \"traits\": \"Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 5b6c9f Grid: true GridProjection: false 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 1f9e5e3ed..3c0e841aa 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Of Nothing at All DragSelectable: true -GMNotes: "{\r\n \"id\": \"06022\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"traits\": \"Item. Relic.\",\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06022\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"traits\": \"Item. Relic.\",\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 9b0dcf Grid: true GridProjection: false 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 f0fd7614e..397788ea7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Nightmare is Over DragSelectable: true -GMNotes: "{\r\n \"id\": \"05260\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Assistant.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05260\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Assistant.\",\n \"willpowerIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 73bccf Grid: true GridProjection: false 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 11f225577..2a8c7d13f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60228\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"intellectIcons\": - 3,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60228\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 2,\n \"traits\": \"Practiced. Expert.\",\n \"intellectIcons\": 3,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 96b5ed Grid: true GridProjection: false 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 39b832efe..06a633f0b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Perception c6ac19.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01090\",\r\n \"alternate_ids\": [\r\n \"01590\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Practiced.\",\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01090\",\n \"alternate_ids\": [\n \"01590\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Neutral\",\n \"level\": 0,\n \"traits\": \"Practiced.\",\n + \ \"intellectIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: c6ac19 Grid: true GridProjection: false 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 a82276cc6..ca6af3839 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Perseverance 0a390e.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04111\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04111\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 0a390e Grid: true GridProjection: false 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 7cec43c7a..778cd3ecf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Persuasion 1b0235.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04105\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Trick.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04105\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Trick.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 1b0235 Grid: true GridProjection: false 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 049471c01..770f634fd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"85030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Monster. Ooze.\",\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"85030\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Monster. Ooze.\",\n \"agilityIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 26398a Grid: true GridProjection: false 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 25eb8be97..0461be841 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"90047\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Instrument.\",\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"90047\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Instrument.\",\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: '876557' Grid: true GridProjection: false 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 e47fed6f7..c54f6bce2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Big Man on Campus DragSelectable: true -GMNotes: "{\r\n \"id\": \"02035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02035\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Ally. + Miskatonic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: e1e098 Grid: true GridProjection: false 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 f7fe9aa46..be5e22fa4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Big Man on Campus DragSelectable: true -GMNotes: "{\r\n \"id\": \"02033\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02033\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: ffdeb5 Grid: true GridProjection: false 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 838cad985..70451cce1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50001\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50001\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 2,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: d708d9 Grid: true GridProjection: false 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 ef60d0764..f42baf511 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60131\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"replenish\": 2,\r\n \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60131\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": + 2,\n \"type\": \"Resource\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: ab51ce Grid: true GridProjection: false 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 9b4c1959d..07ab6ab78 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01017\",\r\n \"alternate_ids\": [\r\n \"60108\",\r\n - \ \"01517\"\r\n ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01017\",\n \"alternate_ids\": [\n \"60108\",\n \"01517\"\n + \ ],\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": + 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n + \ \"cycle\": \"Core\"\n}" GUID: 1165db Grid: true GridProjection: false 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 51990b898..e474bed94 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03195\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent. Illicit.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03195\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent. Illicit.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 2f4db2 Grid: true GridProjection: false 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 6e229180f..cd594b80e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pickpocketing da7c01.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01046\",\r\n \"alternate_ids\": [\r\n \"01546\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent. Illicit.\",\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01046\",\n \"alternate_ids\": [\n \"01546\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Talent. Illicit.\",\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: da7c01 Grid: true GridProjection: false 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 88b82b786..a65d65737 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60328\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60328\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: e503ce Grid: true GridProjection: false 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 2cd240761..d1e5d4479 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pilfer cc9563.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60315\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60315\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: cc9563 Grid: true GridProjection: false 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 b47f11b63..9387e2e9f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Pitchfork 45a724.yaml @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 111 +CardID: 12111 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"10110\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n - \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. Tool. Weapon. Melee.\",\n - \ \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock - Vale\"\n}" +GMNotes: "{\n \"id\": \"10110\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" GUID: 45a724 Grid: true GridProjection: false 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 b66d40dbf..0b45f8ccc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07024\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07024\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 96fd5d Grid: true GridProjection: false 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 0e50d71b3..9cc68d255 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03115\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Talent. Composure.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03115\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Talent. Composure.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 86b9c5 Grid: true GridProjection: false 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 e103bc971..240ebdf6d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08081\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Composure.\",\r\n \"willpowerIcons\": - 2,\r\n \"intellectIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08081\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Talent. Composure.\",\n \"willpowerIcons\": + 2,\n \"intellectIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 7a2fe9 Grid: true GridProjection: false 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 04c99af96..15b566ac2 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Mind-Expanding Ideas DragSelectable: true -GMNotes: "{\r\n \"id\": \"04307\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 5,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04307\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 5,\n \"level\": 5,\n \"traits\": \"Item. + Relic. Tome.\",\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n + \ {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 344d98 Grid: true GridProjection: false 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 98747951b..5404379fe 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 @@ -19,25 +19,24 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09099\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"wildIcons\": - 1,\r\n \"customizations\": [\r\n {\r\n \"name\": \"Detachable\",\r\n \"xp\": - 1,\r\n \"text\": \"Other investigators at your location may use the ability - on Pocket Multi-Tool.\"\r\n },\r\n {\r\n \"name\": \"Pry Bar\",\r\n \"xp\": - 1,\r\n \"text\": \"You get an additional +1 skill value if this is during a - skill test on a treachery.\"\r\n },\r\n {\r\n \"name\": \"Sharpened Knife\",\r\n - \ \"xp\": 2,\r\n \"text\": \"You get an additional +1 skill value if this - is during an attack.\"\r\n },\r\n {\r\n \"name\": \"Signal Mirror\",\r\n - \ \"xp\": 2,\r\n \"text\": \"You get an additional +1 skill value if this - is during an evasion attempt.\"\r\n },\r\n {\r\n \"name\": \"Magnifying - Lens\",\r\n \"xp\": 2,\r\n \"text\": \"You get an additional +1 skill - value if this is during an investigation.\"\r\n },\r\n {\r\n \"name\": - \"Lucky Charm\",\r\n \"xp\": 3,\r\n \"text\": \"After you fail a skill - test, ready Pocket Multi Tool.\"\r\n },\r\n {\r\n \"name\": \"Spring-Loaded\",\r\n - \ \"xp\": 4,\r\n \"text\": \"Pocket Multi Tool\u2019s ability is now a - \U0001F5F2 ability with the trigger: \u201CWhen you would fail a skill test you - are performing, exhaust Pocket Multi Tool\u2026\u201D\"\r\n }\r\n ],\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09099\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"wildIcons\": 1,\n \"customizations\": [\n {\n \"name\": \"Detachable\",\n + \ \"xp\": 1,\n \"text\": \"Other investigators at your location may use + the ability on Pocket Multi-Tool.\"\n },\n {\n \"name\": \"Pry Bar\",\n + \ \"xp\": 1,\n \"text\": \"You get an additional +1 skill value if this + is during a skill test on a treachery.\"\n },\n {\n \"name\": \"Sharpened + Knife\",\n \"xp\": 2,\n \"text\": \"You get an additional +1 skill value + if this is during an attack.\"\n },\n {\n \"name\": \"Signal Mirror\",\n + \ \"xp\": 2,\n \"text\": \"You get an additional +1 skill value if this + is during an evasion attempt.\"\n },\n {\n \"name\": \"Magnifying Lens\",\n + \ \"xp\": 2,\n \"text\": \"You get an additional +1 skill value if this + is during an investigation.\"\n },\n {\n \"name\": \"Lucky Charm\",\n + \ \"xp\": 3,\n \"text\": \"After you fail a skill test, ready Pocket Multi + Tool.\"\n },\n {\n \"name\": \"Spring-Loaded\",\n \"xp\": 4,\n \"text\": + \"Pocket Multi Tool\u2019s ability is now a \U0001F5F2 ability with the trigger: + \u201CWhen you would fail a skill test you are performing, exhaust Pocket Multi + Tool\u2026\u201D\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 7421ed Grid: true GridProjection: false 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 ca0a33281..cbb4e81f5 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Doorway to Another World DragSelectable: true -GMNotes: "{\r\n \"id\": \"86052\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Spell.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"86052\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Spell.\",\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" GUID: 35e8e2 Grid: true GridProjection: false 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 630d11bc7..8177d594f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08097\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08097\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker|Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 98eb87 Grid: true GridProjection: false 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 10192fc3a..3c7bab84f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Poisoned 819f52.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Poision. DragSelectable: true -GMNotes: "{\r\n \"id\": \"04102\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Poison.\",\r\n \"permanent\": true,\r\n \"weakness\": - true,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04102\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Poison.\",\n \"permanent\": true,\n \"weakness\": true,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 819f52 Grid: true GridProjection: false 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 225744a58..d98a01288 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01027\",\r\n \"alternate_ids\": [\r\n \"01527\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 3,\r\n - \ \"level\": 2,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01027\",\n \"alternate_ids\": [\n \"01527\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Guardian\",\n \"cost\": + 3,\n \"level\": 2,\n \"traits\": \"Item.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: da46e0 Grid: true GridProjection: false 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 c586c0150..cca53fff0 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Possessed 04b3a9.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness. DragSelectable: true -GMNotes: "{\r\n \"id\": \"08647\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08647\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 04b3a9 Grid: true GridProjection: false 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 d1e37e80c..a61b5cfe4 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Seeing Things Unseen DragSelectable: true -GMNotes: "{\r\n \"id\": \"02219\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item.\",\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02219\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item.\",\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: f96ed0 Grid: true GridProjection: false 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 181ce4206..f89933890 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,6 +41,393 @@ 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) @@ -555,265 +942,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - return GUIDReferenceApi -end -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 0ba7ac93d..edc25c385 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 @@ -19,31 +19,31 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09081\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"customizations\": [\r\n {\r\n \"name\": \"Betray\",\r\n \"xp\": - 1,\r\n \"text\": \"Add the command: \u201C\u27D0 \u2018Betray.\u2019 Deal 1 - damage to any enemy at this enemy\u2019s location with an equal or lower fight value - than this enemy.\u201D\"\r\n },\r\n {\r\n \"name\": \"Mercy\",\r\n \"xp\": - 1,\r\n \"text\": \"Add the command: \u201C\u27D0 \u2018Mercy.\u2019 An investigator +GMNotes: "{\n \"id\": \"09081\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"intellectIcons\": + 1,\n \"customizations\": [\n {\n \"name\": \"Betray\",\n \"xp\": 1,\n + \ \"text\": \"Add the command: \u201C\u27D0 \u2018Betray.\u2019 Deal 1 damage + to any enemy at this enemy\u2019s location with an equal or lower fight value than + this enemy.\u201D\"\n },\n {\n \"name\": \"Mercy\",\n \"xp\": 1,\n + \ \"text\": \"Add the command: \u201C\u27D0 \u2018Mercy.\u2019 An investigator at this enemy\u2019s location heals damage or horror equal to this enemy\u2019s - respective damage/horror value.\u201D\"\r\n },\r\n {\r\n \"name\": \"Confess\",\r\n - \ \"xp\": 1,\r\n \"text\": \"Add the command: \u201C\u27D0 \u2018Confess.\u2019 + respective damage/horror value.\u201D\"\n },\n {\n \"name\": \"Confess\",\n + \ \"xp\": 1,\n \"text\": \"Add the command: \u201C\u27D0 \u2018Confess.\u2019 Discover 1 clue at this enemy\u2019s location if its health is equal to or higher - than its location\u2019s shroud.\u201D\"\r\n },\r\n {\r\n \"name\": \"Distract\",\r\n - \ \"xp\": 1,\r\n \"text\": \"Add the command: \u201C\u27D0 \u2018Distract.\u2019 + than its location\u2019s shroud.\u201D\"\n },\n {\n \"name\": \"Distract\",\n + \ \"xp\": 1,\n \"text\": \"Add the command: \u201C\u27D0 \u2018Distract.\u2019 Automatically evade any enemy at this enemy\u2019s location with an equal or lower - evade value than this enemy.\u201D\"\r\n },\r\n {\r\n \"name\": \"Greater - Control\",\r\n \"xp\": 2,\r\n \"text\": \"Power Word gains \u201C\U0001F5F2: - Return Power Word to your hand.\u201D\"\r\n },\r\n {\r\n \"name\": \"Bonded\",\r\n - \ \"xp\": 3,\r\n \"text\": \"You may activate the parley ability on Power - Word from up to one location away from the attached enemy.\"\r\n },\r\n {\r\n - \ \"name\": \"Tonguetwister\",\r\n \"xp\": 3,\r\n \"text\": \"When - you parley with Power Word, you may give up to two different commands.\"\r\n },\r\n - \ {\r\n \"name\": \"Thrice Spoken\",\r\n \"xp\": 3,\r\n \"text\": - \"You may include three copies of Power Word in your deck. When you give a command - using one copy, also give that command to each other enemy with one of your copies - of Power Word attached.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" + evade value than this enemy.\u201D\"\n },\n {\n \"name\": \"Greater Control\",\n + \ \"xp\": 2,\n \"text\": \"Power Word gains \u201C\U0001F5F2: Return Power + Word to your hand.\u201D\"\n },\n {\n \"name\": \"Bonded\",\n \"xp\": + 3,\n \"text\": \"You may activate the parley ability on Power Word from up + to one location away from the attached enemy.\"\n },\n {\n \"name\": + \"Tonguetwister\",\n \"xp\": 3,\n \"text\": \"When you parley with Power + Word, you may give up to two different commands.\"\n },\n {\n \"name\": + \"Thrice Spoken\",\n \"xp\": 3,\n \"text\": \"You may include three copies + of Power Word in your deck. When you give a command using one copy, also give that + command to each other enemy with one of your copies of Power Word attached.\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: c91c1d Grid: true GridProjection: false 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 c054c9b04..1b3a0d829 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06197\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Gambit. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06197\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Gambit. Tactic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 1ac667 Grid: true GridProjection: false 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 c5b4b0f10..fbc517ac8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: From a Future Life DragSelectable: true -GMNotes: "{\r\n \"id\": \"08115\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Charm. Cursed.\",\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08115\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue|Survivor\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": + \"Item. Charm. Cursed.\",\n \"wildIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 358be4 Grid: true GridProjection: false 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 23acd4137..830398124 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: From a Former Life DragSelectable: true -GMNotes: "{\r\n \"id\": \"08114\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Charm. Blessed.\",\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08114\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue|Survivor\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": + \"Item. Charm. Blessed.\",\n \"wildIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: f69d3f Grid: true GridProjection: false 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 3ef7fd77e..6387c0258 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09107\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Dilemma. Tactic.\",\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09107\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Dilemma. Tactic.\",\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 6c726b Grid: true GridProjection: false 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 911c2a69d..b06730dcd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Predestined ec7702.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07035\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Fortune. Blessed.\",\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07035\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Fortune. Blessed.\",\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: ec7702 Grid: true GridProjection: false 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 2d3d1eafd..65e3e4f10 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Premonition e470cd.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04199\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Augury.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04199\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Augury.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: e470cd Grid: true GridProjection: false 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 1de88572c..ee031f883 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09036\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09036\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: a4f62a Grid: true GridProjection: false 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 f09fd968a..c5c8c3d05 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02184\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02184\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 831b6b Grid: true GridProjection: false 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 47a538507..69c6d4116 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51003\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51003\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 5e32a5 Grid: true GridProjection: false 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 e14a3a853..abc5386b8 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02186\",\r\n \"alternate_ids\": [\r\n \"60218\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02186\",\n \"alternate_ids\": [\n \"60218\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Insight.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 60b353 Grid: true GridProjection: false 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 f0ae8d356..2400fe044 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prescient 7e7873.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60419\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced. Augury.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60419\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Practiced. Augury.\",\n \"willpowerIcons\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 7e7873 Grid: true GridProjection: false 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 3b9685524..2886edb98 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09055\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09055\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Scarlet Keys\"\n}" GUID: a6c839 Grid: true GridProjection: false 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 71c8de3e8..880d5f14b 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Millionaire DragSelectable: true -GMNotes: "{\r\n \"id\": \"05003\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Silver Twilight. Socialite.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +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}" 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 b2162c477..cc675d179 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07156\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Blessed. Cursed.\",\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07156\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ally. + Blessed. Cursed.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 48e4a3 Grid: true GridProjection: false 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 cf6c16f40..35d90c936 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Professor of Languages DragSelectable: true -GMNotes: "{\r\n \"id\": \"02061\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02061\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Miskatonic.\",\n \"intellectIcons\": 1,\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 42806b Grid: true GridProjection: false 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 c48a23012..be2ac63c3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Finder of Hidden Connections DragSelectable: true -GMNotes: "{\r\n \"id\": \"08106\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08106\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker|Survivor\",\n \"cost\": 3,\n \"level\": 2,\n \"traits\": + \"Ally. Miskatonic.\",\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 1905cf Grid: true GridProjection: false 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 2519a2200..5a64dc668 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Finder of Hidden Connections DragSelectable: true -GMNotes: "{\r\n \"id\": \"08104\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08104\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker|Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Ally. Miskatonic.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: cc8571 Grid: true GridProjection: false 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 67e7815fe..c93cf67b3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07032\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced. Cursed.\",\r\n \"wildIcons\": 4,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07032\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Practiced. Cursed.\",\n \"wildIcons\": 4,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: d8b64b Grid: true GridProjection: false 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 78afe2cdf..16a0da4c2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Atlas of the Unknowable DragSelectable: true -GMNotes: "{\r\n \"id\": \"08045\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08045\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Item. + Relic. Tome.\",\n \"wildIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 55999d Grid: true GridProjection: false 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 b19e6d727..510f8725e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Prophesy 493b03.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05034\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05034\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 493b03 Grid: true GridProjection: false 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 2e14488c2..0a749b72b 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08120\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08120\",\n \"type\": \"Asset\",\n \"class\": \"Guardian|Mystic|Survivor\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": 2,\n \"type\": + \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 0e64cb Grid: true GridProjection: false 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 37a5bee34..ac5e7699f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08102\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker|Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08102\",\n \"type\": \"Event\",\n \"class\": \"Seeker|Mystic\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Ritual.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 91204c Grid: true GridProjection: false 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 b48a907eb..c5a19169e 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08095\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Item. Armor.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08095\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian|Survivor\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": + \"Item. Armor.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 9a5cb1 Grid: true GridProjection: false 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 49bea8de0..052912a05 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,6 +41,133 @@ 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 = {} @@ -77,6 +204,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -151,6 +283,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -194,6 +331,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -266,6 +407,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -279,6 +432,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -296,7 +461,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -341,6 +506,11 @@ do 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) @@ -353,122 +523,14 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/cards/ProtectiveIncantation1") -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 c8ba5cc84..2d48860cc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04031\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ritual. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04031\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ritual. + Blessed.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 0fd4ae Grid: true GridProjection: false 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 4a3fb9522..8b08c0bdc 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Psychosis d83baf.yaml @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"01099\",\r\n \"alternate_ids\": [\r\n \"01599\"\r\n - \ ],\r\n \"type\": \"Treachery\",\r\n \"class\": \"Neutral\",\r\n \"traits\": - \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01099\",\n \"alternate_ids\": [\n \"01599\"\n ],\n \"type\": + \"Treachery\",\n \"class\": \"Neutral\",\n \"traits\": \"Madness.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 1,\n \"cycle\": \"Core\"\n}" GUID: d83baf Grid: true GridProjection: false 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 94370daa1..b932913a9 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 109 +CardID: 12109 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 9b841142c..8d4f73441 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Mysterious Device DragSelectable: true -GMNotes: "{\r\n \"id\": \"05228\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Relic.\",\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05228\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Relic.\",\n \"cycle\": \"The Circle Undone\"\n}" GUID: 44334c Grid: true GridProjection: false 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 b510dd328..1dca38cd0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03196\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03196\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Path to Carcosa\"\n}" GUID: edd34a Grid: true GridProjection: false 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 c8224a6f8..0db353543 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"09125\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Paradox.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09125\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Paradox.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 0e4c07 Grid: true GridProjection: false 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 eb6a79b47..c2f9fee48 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09069\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09069\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 5cc3d2 Grid: true GridProjection: false 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 9bac3e0f8..bfb07bb53 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60530\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 4,\r\n \"traits\": \"Condition.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60530\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"level\": 4,\n \"traits\": \"Condition.\",\n \"permanent\": true,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 3bbc0b Grid: true GridProjection: false 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 89e040e77..76d93f10a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04154\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04154\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 092e92 Grid: true GridProjection: false 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 7f931d891..1a0b20caa 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02229\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02229\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 1,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: 99989c Grid: true GridProjection: false 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 0b9c757a6..7bdd5dcdb 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08089\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 4,\r\n \"traits\": \"Item. Tool. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08089\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Guardian|Rogue\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": + \"Item. Tool. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: '859736' Grid: true GridProjection: false 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 67a268ed5..0cf654657 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"50010\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Charm.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Return to the Night of the Zealot\"\r\n}\r" +GMNotes: "{\n \"id\": \"50010\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Charm.\",\n \"wildIcons\": 1,\n \"cycle\": \"Return to the Night of the Zealot\"\n}" GUID: 3f91af Grid: true GridProjection: false 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 bdc8bbdaf..c1ea551d3 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01075\",\r\n \"alternate_ids\": [\r\n \"60510\",\r\n - \ \"01575\"\r\n ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01075\",\n \"alternate_ids\": [\n \"60510\",\n \"01575\"\n + \ ],\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Charm.\",\n \"wildIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: f34090 Grid: true GridProjection: false 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 5b1591dbd..3acdb564c 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 @@ -68,6 +68,11 @@ do 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) @@ -80,9 +85,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -117,7 +123,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -136,6 +142,12 @@ do 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) @@ -152,8 +164,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -192,6 +204,18 @@ do 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) @@ -232,6 +256,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -306,6 +335,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -349,6 +383,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -421,6 +459,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -434,6 +484,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -451,7 +513,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData 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 333dfda09..b144b13e5 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07153\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Spirit. Blessed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07153\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Spell. Spirit. Blessed.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 92c295 Grid: true GridProjection: false 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 ff66d0f44..3c4a2652b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Concerned Brother DragSelectable: true -GMNotes: "{\r\n \"id\": \"60102\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Medic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60102\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"traits\": \"Ally. Medic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 1f50e9 Grid: true GridProjection: false 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 1253d1e5d..966f83760 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Expert Dreamer DragSelectable: true -GMNotes: "{\r\n \"id\": \"06059\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Dreamer.\",\r\n \"combatIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06059\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Dreamer.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b04c8e Grid: true GridProjection: false 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 683af4967..ea34613a5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Chained to the Waking World DragSelectable: true -GMNotes: "{\r\n \"id\": \"06079\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Dreamer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06079\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Dreamer.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: d253a6 Grid: true GridProjection: false 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 e3c3460a0..7435b1a42 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05008\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05008\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Horror\",\n \"token\": \"horror\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 1c7a00 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml index 083e12c4e..bd438792e 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Ravenous 558b0a.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: (Un)-Controlled Hunger DragSelectable: true -GMNotes: "{\r\n \"id\": \"89002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"startsInPlay\": true,\r\n \"traits\": \"Talent.\",\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"89002\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Talent.\",\n \"cycle\": \"Standalone\"\n}" GUID: 558b0a Grid: true GridProjection: false 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 56d5f7a89..09523bc4c 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 104 +CardID: 12104 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 04165184d..b591dfada 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06117\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06117\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 75eca5 Grid: true GridProjection: false 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 a3f1ebd8d..327bb7a2d 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"89004\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Power.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"89004\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Power.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 0a1b3a Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml b/unpacked/Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml index 7c73a083e..b3e35074b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reality Acid Reference 858b0a.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"89005\",\r\n \"type\": \"Story\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"89005\",\n \"type\": \"Story\",\n \"class\": \"Neutral\",\n + \ \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 858b0a Grid: true GridProjection: false 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 47b377d94..1ae1b2522 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04158\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Augury. Ritual.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04158\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Augury. Ritual.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: a06aa7 Grid: true GridProjection: false 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 f229d96ab..15c13d9b7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03197\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03197\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: e27b3c Grid: true GridProjection: false 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 dfbed6af8..52c5aac6d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60429\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 3,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60429\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 4,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 3,\n \"cycle\": \"Investigator Packs\"\n}" GUID: '591789' Grid: true GridProjection: false 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 a4788984b..9f92ea152 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03118\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Desperate.\",\r\n \"combatIcons\": 4,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03118\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Desperate.\",\n \"combatIcons\": 4,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 3ff641 Grid: true GridProjection: false 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 d83fc4e5e..de9f2f7a6 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Reckless c45e67.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60304\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60304\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: c45e67 Grid: true GridProjection: false 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 58912a92f..d47b2fe9b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Refine 482b10.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09121\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Supply. Double.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09121\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Supply. Double.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 482b10 Grid: true GridProjection: false 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 dcfaa3364..0cd863d2a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Regurgitation 0a1b3a.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"89003\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Power.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"89003\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Power.\",\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 0a1b3a Grid: true GridProjection: false 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 dd05f11d3..853af2a07 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Relentless af3efd.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60109\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60109\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: af3efd Grid: true GridProjection: false 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 134a3a88c..1ac5b1de9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04020\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Upgrade.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04020\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Upgrade.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 102fad Grid: true GridProjection: false 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 e41e93200..f886cbf53 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02157\",\r\n \"alternate_ids\": [\r\n \"01695\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"level\": 3,\r\n - \ \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02157\",\n \"alternate_ids\": [\n \"01695\"\n ],\n \"type\": + \"Asset\",\n \"class\": \"Neutral\",\n \"level\": 3,\n \"traits\": \"Talent.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 3c959c Grid: true GridProjection: false 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 e91439f3a..29bb90a8e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Unleash the Timestream DragSelectable: true -GMNotes: "{\r\n \"id\": \"04343\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04343\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 3,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 35bc58 Grid: true GridProjection: false 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 8272afa3e..820e01496 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Forestalling the Future DragSelectable: true -GMNotes: "{\r\n \"id\": \"04191\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04191\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 3,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 7667ef Grid: true GridProjection: false 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 ed774a7ed..a67b8b818 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Repossess the Past DragSelectable: true -GMNotes: "{\r\n \"id\": \"04303\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04303\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 3,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 87718c Grid: true GridProjection: false 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 53af4ee66..3e0b74f18 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: "\uFFFD\uFFFD\u201A\uFFFD\uFFFDA Device, of Some Sort" DragSelectable: true -GMNotes: "{\r\n \"id\": \"04061\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04061\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": 3,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: e27a30 Grid: true GridProjection: false 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 1da15d394..68eab0c36 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01032\",\r\n \"alternate_ids\": [\r\n \"01532\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01032\",\n \"alternate_ids\": [\n \"01532\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": + 0,\n \"traits\": \"Ally. Miskatonic.\",\n \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 8f91ce Grid: true GridProjection: false 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 f5eaeed39..b320b79a8 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"09045\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n - \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Tome. Science.\",\n \"intellectIcons\": - 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": \"Evidence\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" +GMNotes: "{\n \"id\": \"09045\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Tome. Science.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 0,\n \"type\": \"Evidence\",\n \"token\": \"resource\"\n }\n ],\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: a37bd4 Grid: true GridProjection: false 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 161b57a55..a7d8049dd 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Resourceful 334f03.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03039\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03039\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"intellectIcons\": 1,\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 334f03 Grid: true GridProjection: false 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 ef373d8ad..600d99109 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 100 +CardID: 55100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '551': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907490/4AAE686A793E66311FF78890309D20670A329D16/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907034/013ED775CA50C6FC71731E4FBAEBF1ECA8C68F1E/ 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 8286a296c..53d1a5c03 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Reporter DragSelectable: true -GMNotes: "{\r\n \"id\": \"02002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Reporter.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +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}" 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 fc014e254..6a489703a 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02009\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02009\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 033a35 Grid: true GridProjection: false 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 73a0debcd..8b625dff0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07109\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Tactic. Blessed.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07109\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Tactic. Blessed.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 491c09 Grid: true GridProjection: false 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 4f0510feb..19e8015b2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07108\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07108\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Tool.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 55fc3d Grid: true GridProjection: false 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 d14fed68e..23241481d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51010\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51010\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 3,\n \"traits\": \"Innate.\",\n \"wildIcons\": 2,\n \"cycle\": \"Return + to The Dunwich Legacy\"\n}" GUID: bb501b Grid: true GridProjection: false 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 c08edf9ac..3af266a3b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02192\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 3,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02192\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 3,\n \"cycle\": \"The + Dunwich Legacy\"\n}" GUID: '358387' Grid: true GridProjection: false 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 3fdc9bfc2..75e8d15c7 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Athlete DragSelectable: true -GMNotes: "{\r\n \"id\": \"05005\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Miskatonic.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 5,\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +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}" GUID: bb8296 Grid: true GridProjection: false 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 86c6a385b..14a564c7d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07308\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 5,\r\n \"traits\": \"Spell. Blessed. Cursed.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07308\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 5,\n \"traits\": \"Spell. Blessed. Cursed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 315b45 Grid: true GridProjection: false 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 76656b00f..3f73aaab5 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,6 +41,218 @@ 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 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/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/RiteofSanctification") end) @@ -78,6 +290,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -152,6 +369,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -195,6 +417,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -267,6 +493,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -280,193 +518,17 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(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 +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) end - - -- updates the token modifiers with the provided data - ---@param tokenData 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - return GUIDReferenceApi 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 e8c94d836..baccc1335 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07019\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Ritual. Blessed.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07019\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Ritual. + Blessed.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: '974743' Grid: true GridProjection: false 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 b3b8cde55..e8a844b8c 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51007\",\r\n \"alternate_ids\": [\r\n \"01689\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 4,\r\n - \ \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51007\",\n \"alternate_ids\": [\n \"01689\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Arcane\",\n \"class\": \"Mystic\",\n \"cost\": 4,\n + \ \"level\": 2,\n \"traits\": \"Spell.\",\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 4f2668 Grid: true GridProjection: false 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 3db2dd4f7..9a937028e 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02233\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 5,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02233\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 5,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 194adb Grid: true GridProjection: false 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 85277194f..34508c094 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02028\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02028\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 29b842 Grid: true GridProjection: false 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 129ca9af1..7ad5a9ad5 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02029\",\r\n \"alternate_ids\": [\r\n \"60405\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": 1,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02029\",\n \"alternate_ids\": [\n \"60405\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": + 0,\n \"traits\": \"Item.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 0a4db3 Grid: true GridProjection: false 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 527583f2d..60b079d04 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60422\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Clothing.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60422\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Clothing.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: ef43db Grid: true GridProjection: false 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 da3c3f968..232a81d65 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60412\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60412\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Clothing.\",\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: d9292f Grid: true GridProjection: false 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 dfc8b1cbb..af816cbce 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08128\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08128\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0fc42c Grid: true GridProjection: false 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 4daabbf7d..841aaa17d 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Fed DragSelectable: true -GMNotes: "{\r\n \"id\": \"01001-pb\",\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" +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}" 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 608ed379c..8fa8c6b00 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Fed DragSelectable: true -GMNotes: "{\r\n \"id\": \"01001-pf\",\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" +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}" 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 cfb2f035c..e42cb42e4 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Fed DragSelectable: true -GMNotes: "{\r\n \"id\": \"01001-p\",\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" +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}" GUID: '502768' Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 5bde90.yaml b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 5bde90.yaml index 86c1c22e8..b5463023b 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 5bde90.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Roland Banks 5bde90.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01001-m\",\r\n \"alternate_ids\": [\r\n \"98004-m\",\r\n - \ \"01501-m\"\r\n ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"01001-m\",\n \"alternate_ids\": [\n \"98004-m\",\n \"01501-m\"\n + \ ],\n \"type\": \"Minicard\"\n}" GUID: 5bde90 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 978a0cae5..3f0428a3f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Fed DragSelectable: true -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" +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}" GUID: 9e9e98 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 2d40350d6..84c29fbfd 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01006\",\r\n \"alternate_ids\": [\r\n \"01506\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"cost\": 3,\r\n - \ \"traits\": \"Item. Weapon. Firearm.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01006\",\n \"alternate_ids\": [\n \"01506\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": + \"Item. Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: 4edb91 Grid: true GridProjection: false 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 973ce6149..adba261b1 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Ammo\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90030\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Weapon. Firearm.\",\n + \ \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: dbdaff Grid: true GridProjection: false 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 42c0ce239..d6cd1d354 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06007\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Blunder. Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06007\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Blunder. Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: e567ff Grid: true GridProjection: false 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 d1cce5c98..24e00ee3b 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09017\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Blunder.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09017\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Blunder.\",\n \"weakness\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 6d2eae Grid: true GridProjection: false 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 05dcf3bb0..1623f7015 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03119\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Desperate.\",\r\n \"agilityIcons\": 4,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03119\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Desperate.\",\n \"agilityIcons\": 4,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 0f32e8 Grid: true GridProjection: false 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 f6a255d1e..f344019bd 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 @@ -19,36 +19,34 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09022\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"replenish\": - 1,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n - \ ],\r\n \"customizations\": [\r\n {\r\n \"name\": \"Heirloom\",\r\n \"xp\": - 1,\r\n \"text\": \"This asset gets -1 cost and gains the Relic trait.\",\r\n - \ \"replaces\": {\r\n \"cost\": 3,\r\n \"traits\": \"Item. Relic. - Weapon. Melee.\"\r\n }\r\n },\r\n {\r\n \"name\": \"Inscription - of Glory\",\r\n \"xp\": 1,\r\n \"text\": \"Add this inscription: \u201C\u27D0 - Glory - If this attack defeats an enemy, choose one: draw 1 card, heal 1 damage, - or heal 1 horror.\u201D\"\r\n },\r\n {\r\n \"name\": \"Inscription of - the Elders\",\r\n \"xp\": 1,\r\n \"text\": \"Add this inscription: \u201C\u27D0 - Elders - If this attack succeeds by an amount equal to or grather than your location\\u0027s - shroud, discover 1 clue at your location.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Inscription of the Hunt\",\r\n \"xp\": 1,\r\n \"text\": \"Add this inscription: - \u201C\u27D0 Hunt - Immediately move to a connecting location or engage an enemy - at your location.\u201D\"\r\n },\r\n {\r\n \"name\": \"Inscription of - Fury\",\r\n \"xp\": 1,\r\n \"text\": \"Add this inscription: \u201C\u27D0 +GMNotes: "{\n \"id\": \"09022\",\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 \"uses\": [\n {\n \"count\": + 4,\n \"replenish\": 1,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"customizations\": [\n {\n \"name\": \"Heirloom\",\n \"xp\": + 1,\n \"text\": \"This asset gets -1 cost and gains the Relic trait.\",\n \"replaces\": + {\n \"cost\": 3,\n \"traits\": \"Item. Relic. Weapon. Melee.\"\n }\n + \ },\n {\n \"name\": \"Inscription of Glory\",\n \"xp\": 1,\n \"text\": + \"Add this inscription: \u201C\u27D0 Glory - If this attack defeats an enemy, choose + one: draw 1 card, heal 1 damage, or heal 1 horror.\u201D\"\n },\n {\n \"name\": + \"Inscription of the Elders\",\n \"xp\": 1,\n \"text\": \"Add this inscription: + \u201C\u27D0 Elders - If this attack succeeds by an amount equal to or grather than + your location\\u0027s shroud, discover 1 clue at your location.\u201D\"\n },\n + \ {\n \"name\": \"Inscription of the Hunt\",\n \"xp\": 1,\n \"text\": + \"Add this inscription: \u201C\u27D0 Hunt - Immediately move to a connecting location + or engage an enemy at your location.\u201D\"\n },\n {\n \"name\": \"Inscription + of Fury\",\n \"xp\": 1,\n \"text\": \"Add this inscription: \u201C\u27D0 Fury - If this attack is successful, in addition to its standard damage, deal 1 - damage to each other enemy engaged with you.\u201D\"\r\n },\r\n {\r\n \"name\": - \"Ancient Power\",\r\n \"xp\": 3,\r\n \"text\": \"You may imbue the same - inscription up to three times.\"\r\n },\r\n {\r\n \"name\": \"Saga\",\r\n - \ \"xp\": 3,\r\n \"text\": \"Replenish 2 of Runic Axe\\u0027s charges at - the start of each round, instead of only one\",\r\n \"replaces\": {\r\n \"uses\": - [\r\n {\r\n \"count\": 4,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n - \ ]\r\n }\r\n },\r\n {\r\n \"name\": \"Scriptweaver\",\r\n - \ \"xp\": 4,\r\n \"text\": \"For every charge spent, you may imbue the - axe with up to two different inscriptions.\"\r\n }\r\n ],\r\n \"cycle\": \"The - Scarlet Keys\"\r\n}\r" + damage to each other enemy engaged with you.\u201D\"\n },\n {\n \"name\": + \"Ancient Power\",\n \"xp\": 3,\n \"text\": \"You may imbue the same inscription + up to three times.\"\n },\n {\n \"name\": \"Saga\",\n \"xp\": 3,\n + \ \"text\": \"Replenish 2 of Runic Axe\\u0027s charges at the start of each + round, instead of only one\",\n \"replaces\": {\n \"uses\": [\n {\n + \ \"count\": 4,\n \"replenish\": 2,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ]\n }\n + \ },\n {\n \"name\": \"Scriptweaver\",\n \"xp\": 4,\n \"text\": + \"For every charge spent, you may imbue the axe with up to two different inscriptions.\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 7cdb0a Grid: true GridProjection: false 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 5fa06488d..745767d84 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 @@ -41,267 +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") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/RunicAxeUpgradeSheetTaboo") end) @@ -816,4 +555,391 @@ 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/Card Ríastrad (1) f1f24e.yaml b/unpacked/Bag All Player Cards 15bb07/Card Ríastrad (1) f1f24e.yaml index f17c8c7ff..4ca1cf86c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07193\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Spell. Spirit. Cursed.\",\r\n - \ \"combatIcons\": 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07193\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Spell. Spirit. Cursed.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: f1f24e Grid: true GridProjection: false 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 ab9fdc040..cd5d7d8b4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07110\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Covenant. Blessed.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07110\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Blessed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 87226d Grid: true GridProjection: false 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 00bc746af..92b75aeea 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04234\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04234\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Ritual.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: f2877e Grid: true GridProjection: false 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 bc274cab5..61f85cb7e 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98003\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Dark Young.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98003\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Dark Young.\",\n \"weakness\": true,\n \"cycle\": \"Promo\"\n}" GUID: 46812e Grid: true GridProjection: false 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 87b58c33a..0880a4c03 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06196\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06196\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 7dc42a Grid: true GridProjection: false 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 6e379c319..5f3c54a30 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Safeguard 8d6ae6.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60110\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60110\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 8d6ae6 Grid: true GridProjection: false 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 f2e5972c8..dbda4d8ba 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09116\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09116\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: f2e87d Grid: true GridProjection: false 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 eb8821827..a089516ac 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08052\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 1,\r\n - \ \"dynamicIcons\": true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08052\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 1,\n \"dynamicIcons\": + true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 5e3aac Grid: true GridProjection: false 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 39bf932b7..fe3eb8dbb 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06327\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Item. Weapon. Firearm. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": - 2,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06327\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Item. + Weapon. Firearm. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 2,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 4f5f0f Grid: true GridProjection: false 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 594a2c779..e7c3ed78b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03116\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Desperate.\",\r\n \"willpowerIcons\": 4,\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03116\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Desperate.\",\n \"willpowerIcons\": 4,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 5c3dd0 Grid: true GridProjection: false 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 67d59a2a9..40f74d26d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06332\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06332\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ff4aea Grid: true GridProjection: false 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 6cd996886..5076f9b0c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging 1b76c9.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01073\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01073\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: 1b76c9 Grid: true GridProjection: false 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 ab368aef1..547f96f61 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scavenging b9e532.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01573\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01573\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: b9e532 Grid: true GridProjection: false 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 ceb586e13..9c00d4dc1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04103\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Bold.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04103\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Bold.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: ab37af Grid: true GridProjection: false 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 832051870..3d4df8a30 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08072\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08072\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": + 1,\n \"uses\": [\n {\n \"count\": 5,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 699a99 Grid: true GridProjection: false 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 5932060ab..ee3f0d6ef 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03109\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Talent. Composure.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03109\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Talent. Composure.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 3a0df6 Grid: true GridProjection: false 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 fa3385d15..cfaac7b76 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08040\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Talent. Composure.\",\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08040\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Talent. Composure.\",\n \"intellectIcons\": + 2,\n \"combatIcons\": 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '158450' Grid: true GridProjection: false 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 6bb1cb492..d3c815d90 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08047\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08047\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight. Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 927d34 Grid: true GridProjection: false 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 e18bc436b..f43cdd24b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02193\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02193\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: dffe4a Grid: true GridProjection: false 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 261508d7b..fa3af6fbf 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrapper c8505c.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60511\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60511\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: c8505c Grid: true GridProjection: false 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 fd421f55d..dba8db27f 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06116\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06116\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 0d926f Grid: true GridProjection: false 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 eb7edf910..536b5234f 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,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") @@ -157,13 +160,9 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- draw an encounter card for the requesting mat + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end return MythosAreaApi @@ -173,6 +172,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -267,6 +267,26 @@ do 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) @@ -352,6 +372,15 @@ do 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 @@ -361,6 +390,22 @@ do 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) @@ -371,7 +416,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -427,10 +472,87 @@ do 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/ScrollofSecrets") +__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 Scroll of Secrets (3) (Taboo) c127f1.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) (Taboo) c127f1.ttslua index b76b9c5a5..c8b306f4e 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 @@ -41,6 +41,420 @@ 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) +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 +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) @@ -141,296 +555,4 @@ function drawCardsFromBottom(playerColor, owner, amount) printToColor("Handle the drawn cards according to the ability text on 'Scroll of Secrets'.", playerColor) 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 to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - 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") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - 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 (3) 0b12ac.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.ttslua index b76b9c5a5..2c2ff4ee7 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,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") @@ -160,13 +157,9 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- draw an encounter card for the requesting mat + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end return MythosAreaApi @@ -176,6 +169,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -270,6 +264,26 @@ do 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) @@ -355,6 +369,15 @@ do 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 @@ -364,6 +387,22 @@ do 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) @@ -374,7 +413,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -430,7 +469,90 @@ do 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) 0b12ac.yaml b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets (3) 0b12ac.yaml index 33e768faa..1e39877f1 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Seeker DragSelectable: true -GMNotes: "{\r\n \"id\": \"05188\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05188\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 2,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 0b12ac Grid: true GridProjection: false 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 b76b9c5a5..2c2ff4ee7 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,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") @@ -160,13 +157,9 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- draw an encounter card for the requesting mat + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end return MythosAreaApi @@ -176,6 +169,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -270,6 +264,26 @@ do 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) @@ -355,6 +369,15 @@ do 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 @@ -364,6 +387,22 @@ do 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) @@ -374,7 +413,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -430,7 +469,90 @@ do 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 b52cc0800..12c790140 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Mystic DragSelectable: true -GMNotes: "{\r\n \"id\": \"05189\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tome.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Secret\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05189\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. + Tome.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 4,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: 194d88 Grid: true GridProjection: false 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 eb7edf910..65187b79b 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,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 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) __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") @@ -157,13 +228,9 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- draw an encounter card for the requesting mat + MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp) + getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp}) end return MythosAreaApi @@ -173,6 +240,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -267,6 +335,26 @@ do 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) @@ -352,6 +440,15 @@ do 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 @@ -361,6 +458,22 @@ do 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) @@ -371,7 +484,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -427,10 +540,19 @@ do 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/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 230835.ttslua b/unpacked/Bag All Player Cards 15bb07/Card Scroll of Secrets 230835.ttslua index b76b9c5a5..42ea72d22 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,6 +41,393 @@ 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/cards/ScrollofSecrets") end) @@ -160,277 +547,12 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- 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") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - 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 6e751c240..6745936b4 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05116\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker|Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05116\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker|Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Item. Tome.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Circle Undone\"\n}" GUID: '230835' Grid: true GridProjection: false 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 af8ce794c..0951316b8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06165\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Fortune.\",\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06165\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Fortune.\",\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: 7651f3 Grid: true GridProjection: false 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 4dcf3aa31..3a82882ad 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03236\",\r\n \"alternate_ids\": [\r\n \"01690\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": 2,\r\n \"uses\": - [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03236\",\n \"alternate_ids\": [\n \"01690\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Arcane\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n + \ \"level\": 3,\n \"traits\": \"Spell.\",\n \"intellectIcons\": 2,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: e58d2a Grid: true GridProjection: false 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 fd1b2d936..ef2bac4a1 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Scrying 8a927c.yaml @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01061\",\r\n \"alternate_ids\": [\r\n \"01561\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01061\",\n \"alternate_ids\": [\n \"01561\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Arcane\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n + \ \"level\": 0,\n \"traits\": \"Spell.\",\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Core\"\n}" GUID: 8a927c Grid: true GridProjection: false 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 775f7f871..72bad0926 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60406\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60406\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 6446d1 Grid: true GridProjection: false 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 c028b4cd5..13b3af483 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07014\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07014\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Weapon. Melee.\",\n + \ \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 4e405d Grid: true GridProjection: false 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 5fc7eb7da..d8342f1a4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03312\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 5,\r\n \"traits\": \"Spell. Expert.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03312\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 5,\n \"traits\": \"Spell. Expert.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 91e890 Grid: true GridProjection: false 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 d42ba11aa..d8be67b08 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 @@ -41,6 +41,48 @@ 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("playercards/cards/SealoftheSeventhSign5") end) @@ -76,6 +118,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -150,6 +197,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -193,6 +245,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -265,6 +321,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -278,6 +346,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -295,7 +375,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -340,6 +420,11 @@ do 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) @@ -352,9 +437,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -389,7 +475,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -408,6 +494,12 @@ do 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) @@ -424,8 +516,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -437,34 +529,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 - - return GUIDReferenceApi -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 883420596..22185dad0 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Over the Threshold and Beyond DragSelectable: true -GMNotes: "{\r\n \"id\": \"04311\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Spell. Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 7,\r\n \"type\": - \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04311\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Spell. + Ritual.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 7,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 9cbac1 Grid: true GridProjection: false 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 858bdcb3b..ca0e59d50 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02008\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": 2,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02008\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Insight.\",\n \"intellectIcons\": 2,\n \"wildIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 4156cf Grid: true GridProjection: false 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 255e0bf1a..28cc8cd12 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02011\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02011\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 426d28 Grid: true GridProjection: false 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 cd676b740..0daba6d68 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04149\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Bold.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04149\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spirit. Bold.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: baef55 Grid: true GridProjection: false 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 3198301f9..291a9dbc3 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60227\",\r\n \"alternate_ids\": [\r\n \"01685\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n \"cost\": 1,\r\n - \ \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60227\",\n \"alternate_ids\": [\n \"01685\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Seeker\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": + \"Insight.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Investigator + Packs\"\n}" GUID: 719f7e Grid: true GridProjection: false 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 eb9019851..f0a104b34 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02023\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: f69e10 Grid: true GridProjection: false 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 cd2b4a8ff..033c497a5 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Painter DragSelectable: true -GMNotes: "{\r\n \"id\": \"03003\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Artist.\",\r\n \"willpowerIcons\": 4,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" 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 6d00e7823..67880caad 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic. Occult.\",\r\n - \ \"bonded\": [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06022\"\r\n }\r\n - \ ],\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06021\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Item. Relic. Occult.\",\n \"bonded\": + [\n {\n \"count\": 1,\n \"id\": \"06022\"\n }\n ],\n \"wildIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ff9f23 Grid: true GridProjection: false 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 965b100d6..1445ff804 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06035\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06035\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: eff3c8 Grid: true GridProjection: false 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 35928c98b..0236646b6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60104\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60104\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Investigator Packs\"\n}" GUID: 2204cc Grid: true GridProjection: false 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 296390594..4113cc9d1 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06157\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06157\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Spirit.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 5e808d Grid: true GridProjection: false 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 7497b1fe1..5d404133b 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09003\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09003\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 07dd55 Grid: true GridProjection: false 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 2ff5618cd..957072d65 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"53015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact.\",\n \"weakness\": true,\n \"cycle\": \"Return to the Forgotten + Age\"\n}" GUID: 180b5b Grid: true GridProjection: false 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 37c20402e..87f691b65 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Two Days Until Retirement DragSelectable: true -GMNotes: "{\r\n \"id\": \"84008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 5,\r\n \"traits\": \"Ally. Police.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"84008\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 5,\n \"traits\": \"Ally. Police.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 5630c2 Grid: true GridProjection: false 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 e4aa75a29..fa9271ee7 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 @@ -76,6 +76,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -150,6 +155,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -193,6 +203,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -265,6 +279,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -278,6 +304,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -295,7 +333,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -340,6 +378,11 @@ do 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) @@ -352,9 +395,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -389,7 +433,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -408,6 +452,12 @@ do 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) @@ -424,8 +474,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -464,6 +514,18 @@ do 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) 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 517f28dc0..2ce095c22 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Humanoid. Monster. Serpent. DragSelectable: true -GMNotes: "{\r\n \"id\": \"04014\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Monster. Serpent.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04014\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Monster. Serpent.\",\n \"weakness\": true,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: '678391' Grid: true GridProjection: false 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 ef85ed3aa..50a6ae7c8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07011\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Cultist.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The - Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07011\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Cultist.\",\n \"weakness\": true,\n \"cycle\": \"The + Innsmouth Conspiracy\"\n}" GUID: 9be144 Grid: true GridProjection: false 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 270cea590..3fee89c6f 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,18 +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/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) __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. @@ -78,6 +66,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -152,6 +145,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -195,6 +193,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -267,6 +269,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -280,6 +294,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -297,7 +323,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -342,6 +368,11 @@ do 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) @@ -354,9 +385,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -391,7 +423,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -410,6 +442,12 @@ do 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) @@ -426,8 +464,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -466,7 +504,31 @@ do 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 219b0b5f0..6c5ac669d 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04310\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04310\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: b10a71 Grid: true GridProjection: false 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 392c54587..834722c4a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06204\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Developed.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06204\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Developed.\",\n \"intellectIcons\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: 4d9a97 Grid: true GridProjection: false 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 88a30696d..863837a3d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60327\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60327\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 7f27d6 Grid: true GridProjection: false 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 17b5c8f48..2c6cf2421 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09108\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09108\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight. Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 2c165a Grid: true GridProjection: false 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 70ca51d13..04df23492 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03008\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03008\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: bcf406 Grid: true GridProjection: false 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 e8fc135b9..1db2d727a 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,115 +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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - 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 @@ -185,6 +76,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -259,6 +155,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -302,6 +203,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -374,6 +279,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -387,6 +304,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -404,7 +333,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -449,6 +378,11 @@ do 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) @@ -461,13 +395,141 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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/ShieldofFaith2") +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 a2dff37b5..a1f7eeebb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07221\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07221\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell. + Blessed.\",\n \"willpowerIcons\": 2,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 06abe0 Grid: true GridProjection: false 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 bce511e7a..a7f8427cf 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06329\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06329\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: b4b991 Grid: true GridProjection: false 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 9fac84280..18ce4c687 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06009\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Blunder. Mystery.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06009\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Blunder. Mystery.\",\n \"weakness\": true,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: f4dd3d Grid: true GridProjection: false 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 f12f969b7..f4bf23cc0 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,116 @@ 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/cards/ShortSupply") end) @@ -74,10 +184,10 @@ function shortSupply(color) return end - -- discard cards + -- discard cards, waiting 0.7 seconds between each discard to give players visiblity of the cards broadcastToColor("Discarding top 10 cards for player color '" .. matColor .. "'.", color, "White") for i = 1, 10 do - drawDeck.takeObject({ flip = true, position = { discardPos.x, 2 + 0.075 * i, discardPos.z } }) + Wait.time(function() drawDeck.takeObject({ flip = true, position = { discardPos.x, 2 + 0.075 * i, discardPos.z } }) end, .7 * (i - 1)) end end end) @@ -85,6 +195,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -179,6 +290,26 @@ do 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) @@ -264,6 +395,15 @@ do 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 @@ -273,6 +413,22 @@ do 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) @@ -283,7 +439,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -312,34 +468,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 - - return GUIDReferenceApi -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 d65b5a009..0be5371a6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08071\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08071\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: e5f541 Grid: true GridProjection: false 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 e5a9eac9d..1ac0bb50f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03232\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03232\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Insight. Tactic.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to + Carcosa\"\n}" GUID: 29169e Grid: true GridProjection: false 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 89ba2386c..f49c2a563 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shortcut d4fd4a.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02022\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02022\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Tactic.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d4fd4a Grid: true GridProjection: false 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 b6d7e77f6..ac5769046 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01029\",\r\n \"alternate_ids\": [\r\n \"01529\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n \"cost\": 5,\r\n - \ \"level\": 4,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"combatIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": \"Ammo\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01029\",\n \"alternate_ids\": [\n \"01529\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Hand x2\",\n \"class\": \"Guardian\",\n \"cost\": 5,\n + \ \"level\": 4,\n \"traits\": \"Item. Weapon. Firearm.\",\n \"combatIcons\": 2,\n + \ \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Ammo\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Core\"\n}" GUID: c92ea3 Grid: true GridProjection: false 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 57e687208..c98436076 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Showmanship ad63bc.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07012\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07012\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Talent.\",\n \"combatIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: ad63bc Grid: true GridProjection: false 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 842833026..9b6e56645 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04106\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04106\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 658d38 Grid: true GridProjection: false 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 a7ef4e2d4..55fdcd0ba 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08017\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": 2,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08017\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Talent.\",\n \"intellectIcons\": 2,\n \"wildIcons\": + 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: c70129 Grid: true GridProjection: false 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 1b27377e0..efed1a6a3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07310\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Fortune. Blessed. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n - \ \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Offering\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07310\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Fortune. Blessed. Cursed.\",\n + \ \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Offering\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 1934c6 Grid: true GridProjection: false 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 61f08d10a..b6e7c368c 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02154\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02154\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: b3ce16 Grid: true GridProjection: false 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 2aa25a27c..c65507ee9 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02306\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02306\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 2,\n \"uses\": [\n {\n \"count\": + 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 7a33b2 Grid: true GridProjection: false 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 7a023bee1..024f2d69d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Shrivelling 914053.yaml @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01060\",\r\n \"alternate_ids\": [\r\n \"01560\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 3,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": 1,\r\n \"uses\": - [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Charge\",\r\n \"token\": - \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01060\",\n \"alternate_ids\": [\n \"01560\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Arcane\",\n \"class\": \"Mystic\",\n \"cost\": 3,\n + \ \"level\": 0,\n \"traits\": \"Spell.\",\n \"combatIcons\": 1,\n \"uses\": [\n + \ {\n \"count\": 4,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Core\"\n}" GUID: '914053' Grid: true GridProjection: false 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 2c03113ee..342c931cf 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07228\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07228\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Spell. + Cursed.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 12bdf1 Grid: true GridProjection: false 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 453e61bd4..f1df80a58 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07119\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Cursed.\",\r\n \"agilityIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07119\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell. + Cursed.\",\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: a565d5 Grid: true GridProjection: false 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 7d27922a8..9aa3c050c 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ritual. Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54008\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ritual. + Talent.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": \"Return + to the Circle Undone\"\n}" GUID: f998c5 Grid: true GridProjection: false 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 aec8439ff..11b6b9f46 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05112\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ritual. Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05112\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ritual. + Talent.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 05d263 Grid: true GridProjection: false 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 ea325e7ef..547d20ab4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07197\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced. Blessed.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07197\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Practiced. Blessed.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: c73bb0 Grid: true GridProjection: false 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 b3c532df2..650c5a17d 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Sailor DragSelectable: true -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" +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}" GUID: 3f92cf Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 574b59.yaml b/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 574b59.yaml index 7e682d452..c44dbec01 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 574b59.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Silas Marsh 574b59.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07005-m\",\r\n \"alternate_ids\": [\r\n \"98013-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"07005-m\",\n \"alternate_ids\": [\n \"98013-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 574b59 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 8e5651b0d..3cb1f684e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07015\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Tool.\",\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07015\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Tool.\",\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 4f11a2 Grid: true GridProjection: false 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 9e596e67f..9b158b7d8 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Enemy DragSelectable: true -GMNotes: "{\r\n \"id\": \"01102\",\r\n \"alternate_ids\": [\r\n \"01602\"\r\n - \ ],\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n \"traits\": \"Humanoid. - Cultist. Silver Twilight.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01102\",\n \"alternate_ids\": [\n \"01602\"\n ],\n \"type\": + \"Enemy\",\n \"class\": \"Neutral\",\n \"traits\": \"Humanoid. Cultist. Silver + Twilight.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n \"cycle\": + \"Core\"\n}" GUID: 16a89d Grid: true GridProjection: false 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 c986e6ca4..b965d0fb3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09094\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Ritual.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09094\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Ritual.\",\n \"permanent\": + true,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 0c77d6 Grid: true GridProjection: false 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 a8777961c..e007c3a8e 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08736\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Science.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08736\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Science.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 8d6475 Grid: true GridProjection: false 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 50c31cbbe..4c5ad89c7 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07016\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07016\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: b9fbff Grid: true GridProjection: false 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 06b8a4281..42410abe9 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Nun DragSelectable: true -GMNotes: "{\r\n \"id\": \"07001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Believer. Blessed.\",\r\n \"willpowerIcons\": - 4,\r\n \"intellectIcons\": 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 3,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +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}" 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 d4179b9ff..174fd86cf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05322\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05322\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 060943 Grid: true GridProjection: false 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 630108da0..327d56315 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05158\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05158\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"intellectIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 6eceef Grid: true GridProjection: false 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 e6690869f..6bdba9765 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Ex-Con DragSelectable: true -GMNotes: "{\r\n \"id\": \"01003-pb\",\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" +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}" 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 8b90a1bf2..ac96c9dcc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Ex-Con DragSelectable: true -GMNotes: "{\r\n \"id\": \"01003-pf\",\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" +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}" 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 425041c96..1cf8d92d1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Ex-Con DragSelectable: true -GMNotes: "{\r\n \"id\": \"01003-p\",\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" +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}" GUID: 22ebb2 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 6b00ec.yaml b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 6b00ec.yaml index ce4e16585..a060f884c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 6b00ec.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Skids O'Toole 6b00ec.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01003-m\",\r\n \"alternate_ids\": [\r\n \"01503-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"01003-m\",\n \"alternate_ids\": [\n \"01503-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 6b00ec 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 4cf957ae9..29f593383 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Ex-Con DragSelectable: true -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" +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}" GUID: 9015b4 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 a3a79172c..2e6740e32 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08127\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Creature.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08127\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Creature.\",\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '852697' Grid: true GridProjection: false 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 387a7bbb0..f98ad1d77 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08096\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Item. Tool. Weapon. Melee.\",\r\n - \ \"combatIcons\": 3,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08096\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian|Survivor\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": + \"Item. Tool. Weapon. Melee.\",\n \"combatIcons\": 3,\n \"cycle\": \"Edge of the + Earth\"\n}" GUID: ae3ff5 Grid: true GridProjection: false 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 1997decec..f46835688 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sledgehammer 78fdc7.yaml @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08094\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08094\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian|Survivor\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": + \"Item. Tool. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"Edge of the + Earth\"\n}" GUID: 78fdc7 Grid: true GridProjection: false 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 53e68379d..a9e74782e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03029\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03029\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 819aee Grid: true GridProjection: false 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 e978aa77b..f637224d7 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08121\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Seeker|Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"replenish\": 2,\r\n - \ \"type\": \"Resource\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08121\",\n \"type\": \"Asset\",\n \"class\": \"Guardian|Seeker|Mystic\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"replenish\": 2,\n \"type\": + \"Resource\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 1bdb15 Grid: true GridProjection: false 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 d2101d348..acac98c34 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60324\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60324\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 4a45c6 Grid: true GridProjection: false 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 6415fef33..94121cb63 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04232\",\r\n \"alternate_ids\": [\r\n \"60314\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04232\",\n \"alternate_ids\": [\n \"60314\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Trick.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: cf1d4e Grid: true GridProjection: false 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 aee01cc1d..3281fefae 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05277\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Favor. Service.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05277\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Favor. Service.\",\n \"combatIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: bf5a5f Grid: true GridProjection: false 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 1290f738a..ea60a8de0 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08619\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Expedition.\",\r\n \"intellectIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08619\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Expedition.\",\n \"intellectIcons\": 2,\n + \ \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: c9feda Grid: true GridProjection: false 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 e4c6d704e..e523d2291 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02007\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02007\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 58f534 Grid: true GridProjection: false 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 108e5322b..a9e8ceb8f 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02116\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02116\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 603e29 Grid: true GridProjection: false 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 e6caf91c5..f1e6529fc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04010\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Supply. Illicit.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04010\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Supply. Illicit.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 1f3880 Grid: true GridProjection: false 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 8a8008d1c..150d8919c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03199\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Trap. Improvised.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03199\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Trap. Improvised.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: f66dd9 Grid: true GridProjection: false 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 58976d506..b78364823 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03152\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03152\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 5f19e0 Grid: true GridProjection: false 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 4a455975a..d2bd9918e 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01052\",\r\n \"alternate_ids\": [\r\n \"01552\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01052\",\n \"alternate_ids\": [\n \"01552\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Tactic.\",\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: b18b33 Grid: true GridProjection: false 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 fd5c8a80b..0a6381e7d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60316\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60316\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"Investigator Packs\"\n}" GUID: d099f4 Grid: true GridProjection: false 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 05b6d33a7..4cbc98102 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08087\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian|Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08087\",\n \"type\": \"Event\",\n \"class\": \"Guardian|Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 79cbc6 Grid: true GridProjection: false 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 fe6e46373..065e67789 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06020\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06020\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: ef7c11 Grid: true GridProjection: false 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 cd2726a94..40ed282b7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05109\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05109\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: a3f105 Grid: true GridProjection: false 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 69d215c3a..aaff86f52 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02112\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Song.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 5,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02112\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell. + Song.\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 5,\n + \ \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 2ae3ce Grid: true GridProjection: false 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 874dac147..ecb1ea9ae 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05314\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05314\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 53f076 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Sophie 4f46ad.yaml b/unpacked/Bag All Player Cards 15bb07/Card Sophie 4f46ad.yaml index 9fa51b299..d4560218f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Sophie 4f46ad.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Sophie 4f46ad.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03009\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"startsInPlay\": true,\r\n \"traits\": \"Item. Spirit.\",\r\n \"cycle\": \"The - Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03009\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Item. Spirit.\",\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 4f46ad Grid: true GridProjection: false 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 6ef4eabbc..bea0c95f1 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08620\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Expedition.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08620\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Expedition.\",\n \"willpowerIcons\": 2,\n + \ \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 9e136f Grid: true GridProjection: false 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 c36882e29..1f92cfeaa 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 110 +CardID: 12110 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 bcde4e9ec..97adc01bf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06201\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06201\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 8e8a14 Grid: true GridProjection: false 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 cf1e4cdd6..d320fba27 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: Spell. DragSelectable: true -GMNotes: "{\r\n \"id\": \"05177\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Spell.\",\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05177\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Spell.\",\n \"cycle\": \"The Circle Undone\"\n}" GUID: 863f1a Grid: true GridProjection: false 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 2411455cb..ef748c31a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03035\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item. + Relic. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 90a106 Grid: true GridProjection: false 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 cc1c2070d..6776e09bd 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07229\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Ritual. Blessed. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07229\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Ritual. + Blessed. Cursed.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e5901b Grid: true GridProjection: false 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 bf9d17a6a..555ec6c07 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03014\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03014\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ritual.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: a33470 Grid: true GridProjection: false 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 a180b001e..73a2e14f9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06323\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Ritual.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06323\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 26922c Grid: true GridProjection: false 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 2313dae67..8289b875e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98008\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Promo\"\n}" GUID: 67e006 Grid: true GridProjection: false 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 c583df52b..717a92ed0 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"02226\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n - \ \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Item. Weapon. Firearm.\",\n \"combatIcons\": - 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": - \"Ammo\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich - Legacy\"\n}" +GMNotes: "{\n \"id\": \"02226\",\n \"type\": \"Asset\",\n \"slot\": \"Hand x2\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 4,\n \"traits\": \"Item. + Weapon. Firearm.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: a7944d Grid: true GridProjection: false 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 325fcb70e..b1bb20dc5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Cleansing Fire DragSelectable: true -GMNotes: "{\r\n \"id\": \"03269\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03269\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 423d46 Grid: true GridProjection: false 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 1b625dfbe..eff3f28bb 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 108 +CardID: 12108 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 f11d686a8..cb5110720 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02148\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02148\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: cd7b97 Grid: true GridProjection: false 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 6df9e8f1a..b1597d7a0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60118\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60118\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 7ec473 Grid: true GridProjection: false 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 c65311265..f1f74df12 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06027\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Augury.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06028\"\r\n }\r\n ],\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06027\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight. Augury.\",\n \"bonded\": + [\n {\n \"count\": 1,\n \"id\": \"06028\"\n }\n ],\n \"wildIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 968a26 Grid: true GridProjection: false 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 ce92f97b3..f6b3c66a9 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03013\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03013\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 1890d0 Grid: true GridProjection: false 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 6c7bcdd7f..202b65b7d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Steadfast 4e1d91.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05022\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05022\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 4e1d91 Grid: true GridProjection: false 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 7d1488236..febb127e5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52005\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52005\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: 26a3bf Grid: true GridProjection: false 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 a34977bc3..1fe1acf57 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stealth ddee79.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03028\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03028\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: ddee79 Grid: true GridProjection: false 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 cf15b3a18..b292f7ce0 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Letter Carrier DragSelectable: true -GMNotes: "{\r\n \"id\": \"60501\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Chosen. Civic.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 2,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 4,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +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}" 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 ab4f80dc4..ab45988e4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03264\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03264\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 82d62c Grid: true GridProjection: false 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 eb040ab27..9c644733e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07112\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Insight. Cursed.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07112\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Insight. Cursed.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: e99f0d Grid: true GridProjection: false 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 61bb42029..2da37a73a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52008\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 2,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52008\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 2,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: 1e9213 Grid: true GridProjection: false 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 30d5d30d2..efad940f7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03153\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03153\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 9c922f Grid: true GridProjection: false 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 1047d09ac..c85813936 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Restorative Concoction DragSelectable: true -GMNotes: "{\r\n \"id\": \"02262\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Science.\",\r\n \"willpowerIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02262\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. Science.\",\n \"willpowerIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 4874bc Grid: true GridProjection: false 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 38962767b..deac39971 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Freezing Variant DragSelectable: true -GMNotes: "{\r\n \"id\": \"02264\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Science.\",\r\n \"agilityIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02264\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. Science.\",\n \"agilityIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 9afe23 Grid: true GridProjection: false 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 ac6dc1e0e..cce3b16fa 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: Empowering Elixir DragSelectable: true -GMNotes: "{\r\n \"id\": \"51004\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Science.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51004\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. Science.\",\n \"intellectIcons\": + 2,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: d96e4b Grid: true GridProjection: false 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 2c98a2926..80fe3f230 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Acidic Ichor DragSelectable: true -GMNotes: "{\r\n \"id\": \"02263\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 4,\r\n \"traits\": \"Item. Science.\",\r\n \"combatIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02263\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 4,\n \"traits\": \"Item. Science.\",\n \"combatIcons\": + 2,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: fa61ba Grid: true GridProjection: false 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 ea740922e..885a94282 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Unidentified DragSelectable: true -GMNotes: "{\r\n \"id\": \"02021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Science.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02021\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Science.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 565b6b Grid: true GridProjection: false 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 cbc9bdafd..3dbb0305c 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01076\",\r\n \"alternate_ids\": [\r\n \"01576\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Ally. Creature.\",\r\n \"agilityIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01076\",\n \"alternate_ids\": [\n \"01576\"\n ],\n \"type\": + \"Asset\",\n \"slot\": \"Ally\",\n \"class\": \"Survivor\",\n \"cost\": 1,\n + \ \"level\": 0,\n \"traits\": \"Ally. Creature.\",\n \"agilityIcons\": 1,\n \"cycle\": + \"Core\"\n}" GUID: f474b1 Grid: true GridProjection: false 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 7826f2078..edbc87127 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02189\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02189\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"startsInPlay\": true,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": + true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d7dbac Grid: true GridProjection: false 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 56a264b1f..9835888e5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Streetwise a973aa.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60311\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60311\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: a973aa Grid: true GridProjection: false 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 33f00bac0..fa77521ab 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08077\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Innate. Synergy.\",\r\n \"wildIcons\": 1,\r\n - \ \"dynamicIcons\": true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08077\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate. Synergy.\",\n \"wildIcons\": 1,\n \"dynamicIcons\": + true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 4e6d80 Grid: true GridProjection: false 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 816827f9a..e26b4c28c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09088\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09088\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"combatIcons\": 1,\n + \ \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 046b16 Grid: true GridProjection: false 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 96f2521b7..28abf0c6b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02271\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Fortune.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02271\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Fortune.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 06228f Grid: true GridProjection: false 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 e9030b118..ca52cd440 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Enemy DragSelectable: true -GMNotes: "{\r\n \"id\": \"01103\",\r\n \"alternate_ids\": [\r\n \"01603\"\r\n - \ ],\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n \"traits\": \"Humanoid. - Detective.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01103\",\n \"alternate_ids\": [\n \"01603\"\n ],\n \"type\": + \"Enemy\",\n \"class\": \"Neutral\",\n \"traits\": \"Humanoid. Detective.\",\n + \ \"weakness\": true,\n \"basicWeaknessCount\": 1,\n \"cycle\": \"Core\"\n}" GUID: 4ea68b Grid: true GridProjection: false 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 b5d5b246a..b228e9904 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05276\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05276\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"level\": 3,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 4ea716 Grid: true GridProjection: false 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 aeaf32741..4ebc96927 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04112\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"combatIcons\": 1,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04112\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"combatIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 58c435 Grid: true GridProjection: false 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 baa409906..f88bf16f5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Stupor a42bcf.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08133\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08133\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: a42bcf Grid: true GridProjection: false 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 91c5a6f9b..0a584b3ca 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09071\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Item. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09071\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Clothing.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 0a1b3a Grid: true GridProjection: false 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 d5982b686..e6060bb9a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Anomaly DragSelectable: true -GMNotes: "{\r\n \"id\": \"89001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Manifold.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +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}" 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 7bfd012e1..3b87cd6e8 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"52006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to the Path - to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52006\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Return to + the Path to Carcosa\"\n}" GUID: 0ec9bf Grid: true GridProjection: false 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 c3f10aea2..0c20b1a38 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03268\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03268\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: e7f37b Grid: true GridProjection: false 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 f4e62bbbc..9224c8aa7 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06282\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Summon.\",\r\n \"bonded\": - [\r\n {\r\n \"count\": 1,\r\n \"id\": \"06283\"\r\n }\r\n ],\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06282\",\n \"type\": \"Asset\",\n \"slot\": \"Ally|Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Ally. + Summon.\",\n \"bonded\": [\n {\n \"count\": 1,\n \"id\": \"06283\"\n + \ }\n ],\n \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": \"The + Dream-Eaters\"\n}" GUID: ab4fb3 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml b/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml index 0bd24131a..376c26576 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Summoned Nightgaunt cf96b9.yaml @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: true Description: Monster. Nightgaunt. Power. DragSelectable: true -GMNotes: "{\r\n \"id\": \"83058\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Monster. Nightgaunt. Power.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"83058\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Monster. Nightgaunt. Power.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Standalone\"\n}" GUID: cf96b9 Grid: true GridProjection: false 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 6e78d4a57..a17220b9c 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 @@ -19,30 +19,30 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09080\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Summon.\",\r\n \"willpowerIcons\": - 1,\r\n \"customizations\": [\r\n {\r\n \"name\": \"Armored Carapace\",\r\n - \ \"xp\": 1,\r\n \"text\": \"Summoned Servitor gains a health value of - 3. It can be assigned damage dealt to any investigator at its location.\"\r\n },\r\n - \ {\r\n \"name\": \"Claws that Catch\",\r\n \"xp\": 1,\r\n \"text\": +GMNotes: "{\n \"id\": \"09080\",\n \"type\": \"Asset\",\n \"slot\": \"Ally|Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Summon.\",\n + \ \"willpowerIcons\": 1,\n \"customizations\": [\n {\n \"name\": \"Armored + Carapace\",\n \"xp\": 1,\n \"text\": \"Summoned Servitor gains a health + value of 3. It can be assigned damage dealt to any investigator at its location.\"\n + \ },\n {\n \"name\": \"Claws that Catch\",\n \"xp\": 1,\n \"text\": \"Add this action: \u201C\u27D0 Fight. You fight any enemy at this location with - a base Combat of 4. Ignore the aloof and retaliate keywords for this attack.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Jaws that Snatch\",\r\n \"xp\": 1,\r\n - \ \"text\": \"Add this action: \u201C\u27D0 Evade. You attempt to evade any - enemy at this location with a base Agility of 4. Ignore the alert keyword for this - evasion attempt.\u201D\"\r\n },\r\n {\r\n \"name\": \"Eyes of Flame\",\r\n - \ \"xp\": 1,\r\n \"text\": \"Add this action: \u201C\u27D0 Investigate. - You investigate this location with a base Intellect of 4.\u201D\"\r\n },\r\n - \ {\r\n \"name\": \"Wings of Night\",\r\n \"xp\": 1,\r\n \"text\": - \"After Summoned Servitor moves from your location to a connecting location, you - may move to that location, as well.\"\r\n },\r\n {\r\n \"name\": \"Dominance\",\r\n - \ \"xp\": 2,\r\n \"text\": \"Summoned Servitor no longer takes up an (select - one): arcane / ally slot.\"\r\n },\r\n {\r\n \"name\": \"Dreaming Call\",\r\n - \ \"xp\": 3,\r\n \"text\": \"Instead of discarding another asset you control - in order to play Summoned Servitor, you may return that asset to its owner\u2019s - hand.\"\r\n },\r\n {\r\n \"name\": \"D\xE6monic Influence\",\r\n \"xp\": - 5,\r\n \"text\": \"Summoned Servitor can take 2 different actions instead of - 1 during each of your turns.\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" + a base Combat of 4. Ignore the aloof and retaliate keywords for this attack.\u201D\"\n + \ },\n {\n \"name\": \"Jaws that Snatch\",\n \"xp\": 1,\n \"text\": + \"Add this action: \u201C\u27D0 Evade. You attempt to evade any enemy at this location + with a base Agility of 4. Ignore the alert keyword for this evasion attempt.\u201D\"\n + \ },\n {\n \"name\": \"Eyes of Flame\",\n \"xp\": 1,\n \"text\": + \"Add this action: \u201C\u27D0 Investigate. You investigate this location with + a base Intellect of 4.\u201D\"\n },\n {\n \"name\": \"Wings of Night\",\n + \ \"xp\": 1,\n \"text\": \"After Summoned Servitor moves from your location + to a connecting location, you may move to that location, as well.\"\n },\n {\n + \ \"name\": \"Dominance\",\n \"xp\": 2,\n \"text\": \"Summoned Servitor + no longer takes up an (select one): arcane / ally slot.\"\n },\n {\n \"name\": + \"Dreaming Call\",\n \"xp\": 3,\n \"text\": \"Instead of discarding another + asset you control in order to play Summoned Servitor, you may return that asset + to its owner\u2019s hand.\"\n },\n {\n \"name\": \"D\xE6monic Influence\",\n + \ \"xp\": 5,\n \"text\": \"Summoned Servitor can take 2 different actions + instead of 1 during each of your turns.\"\n }\n ],\n \"cycle\": \"The Scarlet + Keys\"\n}" GUID: 73b311 Grid: true GridProjection: false 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 21473a0e1..a93cad259 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01056\",\r\n \"alternate_ids\": [\r\n \"01556\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n \"cost\": 2,\r\n - \ \"level\": 3,\r\n \"traits\": \"Fortune. Insight.\",\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01056\",\n \"alternate_ids\": [\n \"01556\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": + \"Fortune. Insight.\",\n \"cycle\": \"Core\"\n}" GUID: 308be1 Grid: true GridProjection: false 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 589a13ca6..1ff71f0be 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09056\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool. Science.\",\r\n - \ \"intellectIcons\": 2,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09056\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. Tool. Science.\",\n \"intellectIcons\": + 2,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: c8ecf2 Grid: true GridProjection: false 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 5fdf081ec..22b498481 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06278\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Fortune. Research.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06278\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 1,\n \"traits\": \"Fortune. Research.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: ff59dd Grid: true GridProjection: false 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 69c0d469a..fa5d27e15 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08037\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"dynamicIcons\": - true,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08037\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 1,\n \"traits\": \"Practiced. Expert.\",\n \"dynamicIcons\": true,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 6aa5dc Grid: true GridProjection: false 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 4f0dc62e8..0b9c8a813 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02235\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02235\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"agilityIcons\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: be4abe Grid: true GridProjection: false 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 bd9a1c125..9dd175a43 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01081\",\r\n \"alternate_ids\": [\r\n \"01581\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01081\",\n \"alternate_ids\": [\n \"01581\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Survivor\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"agilityIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 078efb Grid: true GridProjection: false 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 3fbd672cb..43d643735 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 2,\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53002\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 2,\n \"cycle\": \"Return to the Forgotten + Age\"\n}" GUID: c1d796 Grid: true GridProjection: false 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 af167f647..5f6e9a486 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04017\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04017\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 4d971e Grid: true GridProjection: false 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 1f8ca1d70..3321772b7 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08023\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Spirit. Tactic. Trick.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08023\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Spirit. Tactic. Trick.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: b4d67b Grid: true GridProjection: false 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 6377886e3..57058ddd5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05156\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Gambit.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05156\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Gambit.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: c2d211 Grid: true GridProjection: false 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 bfaf50964..fe8b26a1e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06161\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Tactic. Trick.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06161\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Tactic. Trick.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 2cfa4f Grid: true GridProjection: false 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 0b1c52578..97a85addf 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02152\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Item. Weapon. Melee. Illicit.\",\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02152\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Item. + Weapon. Melee. Illicit.\",\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: 2fba3b Grid: true GridProjection: false 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 8a6a745ed..17da55c5c 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Switchblade 213853.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01044\",\r\n \"alternate_ids\": [\r\n \"60307\",\r\n - \ \"01544\"\r\n ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n \"cost\": - 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee. Illicit.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01044\",\n \"alternate_ids\": [\n \"60307\",\n \"01544\"\n + \ ],\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n \"class\": \"Rogue\",\n \"cost\": + 1,\n \"level\": 0,\n \"traits\": \"Item. Weapon. Melee. Illicit.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"Core\"\n}" GUID: '213853' Grid: true GridProjection: false 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 ce805b1dc..8b1938ce5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07029\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07029\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 9c32e2 Grid: true GridProjection: false 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 8b4a0bf74..20c4c57d3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08737\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Supply.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08737\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Supply.\",\n \"wildIcons\": 1,\n \"cycle\": \"Edge + of the Earth\"\n}" GUID: e627e8 Grid: true GridProjection: false 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 5168f55c7..9716cfc9a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04201\",\r\n \"alternate_ids\": [\r\n \"60519\"\r\n - \ ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n \"level\": 0,\r\n - \ \"traits\": \"Innate.\",\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04201\",\n \"alternate_ids\": [\n \"60519\"\n ],\n \"type\": + \"Skill\",\n \"class\": \"Survivor\",\n \"level\": 0,\n \"traits\": \"Innate.\",\n + \ \"cycle\": \"The Forgotten Age\"\n}" GUID: cc6e4d Grid: true GridProjection: false 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 a752a554b..cfd3386c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04150\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced. Bold.\",\r\n \"wildIcons\": 3,\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04150\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Practiced. Bold.\",\n \"wildIcons\": 3,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 50fb37 Grid: true GridProjection: false 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 37eba908d..3273e506e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08116\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic|Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08116\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic|Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": + \"Item. Charm.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 7b4b0c Grid: true GridProjection: false 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 7a8b9d744..3bfcfe6bd 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02019\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich - Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02019\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 9956d5 Grid: true GridProjection: false 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 7aca9e0f7..d665b812b 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60130\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 2,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60130\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 2,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 85fe46 Grid: true GridProjection: false 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 32ab901c4..563d9bec5 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Taunt d5cac6.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02017\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02017\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d5cac6 Grid: true GridProjection: false 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 98bd5ccd9..25c16d475 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07151\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Item. Tome.\",\r\n \"permanent\": true,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07151\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Item. Tome.\",\n \"permanent\": true,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 90fdb0 Grid: true GridProjection: false 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 248986683..6f6f291a2 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Teamwork eab2ed.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02018\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02018\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: eab2ed Grid: true GridProjection: false 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 4190bfadf..9fef2c87c 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08728\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08728\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 05e697 Grid: true GridProjection: false 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 d970bbb2e..ec1e18914 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08725\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08725\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0ba293 Grid: true GridProjection: false 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 e1b9e4b9b..f6e2f83bf 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08729\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08729\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 0ef2ba Grid: true GridProjection: false 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 22ba32e3c..3adc52595 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08727\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08727\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 361f15 Grid: true GridProjection: false 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 4a0939fda..8143f3ca9 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08723\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08723\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 519e41 Grid: true GridProjection: false 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 e378664d2..4c6151492 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08724\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08724\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 76409f Grid: true GridProjection: false 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 dd5633b80..ae564e366 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08726\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08726\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: f5bd65 Grid: true GridProjection: false 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 f5f6e5947..210cfc0ee 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05230\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Upgrade.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05230\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. Upgrade.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: db2c81 Grid: true GridProjection: false 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 11444eb7e..b0ea1b5ad 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07037\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Fortune. Blessed. Cursed.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07037\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Fortune. Blessed. Cursed.\",\n + \ \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 33f906 Grid: true GridProjection: false 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 04d8b87f7..4cf206968 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Rogue DragSelectable: true -GMNotes: "{\r\n \"id\": \"05190\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n - \ \"type\": \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05190\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. Illicit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Circle + Undone\"\n}" GUID: b5e5f1 Grid: true GridProjection: false 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 004c2170d..5070c6d78 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Survivor DragSelectable: true -GMNotes: "{\r\n \"id\": \"05191\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n - \ \"type\": \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05191\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. Illicit.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": + \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Circle + Undone\"\n}" GUID: cbe256 Grid: true GridProjection: false 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 20cbcba86..ad1ec5f57 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05117\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Illicit.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05117\",\n \"type\": \"Asset\",\n \"class\": \"Rogue|Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. Illicit.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: be33f5 Grid: true GridProjection: false 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 5ae7eb0a6..b619387f2 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 06322f Grid: true GridProjection: false 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 e34764dba..c9c9451d1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Too Noble for His Own Good DragSelectable: true -GMNotes: "{\r\n \"id\": \"06155\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Police.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06155\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Ally. + Police.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 08e5a6 Grid: true GridProjection: false 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 dd1fe3975..75389e54d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05041\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Omen.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05041\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Omen.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 2,\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: c1ce8e Grid: true GridProjection: false 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 8902dfc20..590f2df41 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"04042\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04042\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 6cbc01 Grid: true GridProjection: false 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 cf21197d2..3bc6ad387 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Signed in Blood DragSelectable: true -GMNotes: "{\r\n \"id\": \"05150\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Tome. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05150\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Item. Tome. Relic.\",\n \"willpowerIcons\": 1,\n + \ \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: ae3775 Grid: true GridProjection: false 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 b24e13af7..a6c841883 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: A Liar, or a Prophet, or Both DragSelectable: true -GMNotes: "{\r\n \"id\": \"06285\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 5,\r\n \"traits\": \"Ally. Avatar. Dreamlands.\",\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06285\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Ally. + Avatar. Dreamlands.\",\n \"wildIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 16e57b Grid: true GridProjection: false 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 41beca234..2b7ac9093 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Symbol of Power DragSelectable: true -GMNotes: "{\r\n \"id\": \"08057\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the - Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08057\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Relic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 3eafd5 Grid: true GridProjection: false 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 73e6a14f4..d716cb996 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,19 +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/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. @@ -79,6 +66,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -153,6 +145,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -196,6 +193,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -268,6 +269,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -281,6 +294,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -298,7 +323,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -343,6 +368,11 @@ do 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) @@ -355,9 +385,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -392,7 +423,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -411,6 +442,12 @@ do 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) @@ -427,8 +464,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -467,7 +504,32 @@ do 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 ee48b7410..c06448091 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Stygian Waymark DragSelectable: true -GMNotes: "{\r\n \"id\": \"53008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Item. Relic. Cursed.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"Return to the Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53008\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Relic. Cursed.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Charge\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: a775ad Grid: true GridProjection: false 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 b6620696b..4283db682 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,6 +41,130 @@ 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) @@ -79,6 +203,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -153,6 +282,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -196,6 +330,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -268,6 +406,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -281,6 +431,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -298,7 +460,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -343,6 +505,11 @@ do 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) @@ -355,119 +522,14 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - 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 Chthonian Stone fc4ce8.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Chthonian Stone fc4ce8.yaml index 2f96bbfe7..5b43de934 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Stygian Waymark DragSelectable: true -GMNotes: "{\r\n \"id\": \"04030\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Cursed.\",\r\n - \ \"intellectIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04030\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Relic. Cursed.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: fc4ce8 Grid: true GridProjection: false 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 891156efe..527a2ed75 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,6 +41,176 @@ 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 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/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 = {} @@ -68,6 +238,18 @@ do 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) @@ -106,6 +288,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -180,6 +367,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -223,6 +415,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -295,6 +491,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -308,163 +516,17 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(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 +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) end - - -- updates the token modifiers with the provided data - ---@param tokenData 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 Codex of Ages df9809.yaml b/unpacked/Bag All Player Cards 15bb07/Card The Codex of Ages df9809.yaml index b5e501a40..89e42ce65 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: finis omnium nunc est DragSelectable: true -GMNotes: "{\r\n \"id\": \"04013\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic. Tome. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04013\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Relic. Tome. Blessed.\",\n + \ \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: df9809 Grid: true GridProjection: false 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 9e017467e..d73eaf25d 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: "What\uFFFD\uFFFD\u201A\uFFFD\uFFFDs in the Box?" DragSelectable: true -GMNotes: "{\r\n \"id\": \"05196\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"countPerInvestigator\": 1,\r\n \"type\": - \"Lock\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05196\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"countPerInvestigator\": 1,\n \"type\": \"Lock\",\n + \ \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Circle Undone\"\n}" GUID: 0e39c2 Grid: true GridProjection: false 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 ed2f70783..3e1d00976 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Your Shadow Hungers DragSelectable: true -GMNotes: "{\r\n \"id\": \"54015\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Omen. Tarot.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54015\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Omen. Tarot.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 2,\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 7bcaf3 Grid: true GridProjection: false 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 66020a510..66d77fec2 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98006\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98006\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Promo\"\n}" GUID: fe68c6 Grid: true GridProjection: false 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 a5b62b7f0..8ffdd9d10 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06325\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 5,\r\n \"traits\": \"Spell. Practiced.\",\r\n \"wildIcons\": 4,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06325\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 5,\n \"traits\": \"Spell. Practiced.\",\n \"wildIcons\": 4,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: d6085d Grid: true GridProjection: false 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 ebb6127b0..0a023307a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Unlimited Potential DragSelectable: true -GMNotes: "{\r\n \"id\": \"54011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54011\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: b74c69 Grid: true GridProjection: false 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 101fb00b3..a6884a3b3 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Stealing Time DragSelectable: true -GMNotes: "{\r\n \"id\": \"02305\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02305\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich + Legacy\"\n}" GUID: 62d930 Grid: true GridProjection: false 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 ee125af43..37e0c340a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"08006\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Omen. Endtimes.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08006\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Omen. Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: e9fef2 Grid: true GridProjection: false 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 c8c9a7dd9..78e6eb381 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Your True Master Awaits DragSelectable: true -GMNotes: "{\r\n \"id\": \"54007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54007\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 20c8a9 Grid: true GridProjection: false 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 71f9c8e1d..503ff0a4e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03007\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Practiced. Expert.\",\r\n \"combatIcons\": 4,\r\n \"cycle\": \"The - Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03007\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Practiced. Expert.\",\n \"combatIcons\": 4,\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: b80459 Grid: true GridProjection: false 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 807a128ca..7e90fcb67 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 @@ -19,11 +19,12 @@ CustomDeck: UniqueBack: false Description: "Calamitous Blade of Celepha\xEFs" DragSelectable: true -GMNotes: "{\n \"id\": \"06018\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n - \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item. Weapon. Melee. Relic. Cursed.\",\n - \ \"bonded\": [\n {\n \"count\": 3,\n \"id\": \"06019\"\n }\n ],\n - \ \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": - \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" +GMNotes: "{\n \"id\": \"06018\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Item. + Weapon. Melee. Relic. Cursed.\",\n \"bonded\": [\n {\n \"count\": 3,\n + \ \"id\": \"06019\"\n }\n ],\n \"combatIcons\": 1,\n \"uses\": [\n {\n + \ \"count\": 0,\n \"type\": \"Offering\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 2d94ed Grid: true GridProjection: false 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 28a815ff0..8243eb5f3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Tome.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The Path to - Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03011\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Tome.\",\n \"weakness\": true,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 016b72 Grid: true GridProjection: false 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 dcb5e2cde..c3281db1d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Humanoid. Elite. DragSelectable: true -GMNotes: "{\r\n \"id\": \"03059\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Elite.\",\r\n \"weakness\": true,\r\n \"cycle\": \"The - Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03059\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Elite.\",\n \"weakness\": true,\n \"cycle\": \"The Path + to Carcosa\"\n}" GUID: 6720ef Grid: true GridProjection: false 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 f3968b40b..65ef25ce4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Message from Your Inner Self DragSelectable: true -GMNotes: "{\r\n \"id\": \"05031\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"The - Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05031\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: e80bd8 Grid: true GridProjection: false 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 9f05101bf..2b1038494 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Petrus de Dacia Translation DragSelectable: true -GMNotes: "{\r\n \"id\": \"60233\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 5,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": - 5,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60233\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Item. + Tome.\",\n \"intellectIcons\": 5,\n \"uses\": [\n {\n \"count\": 6,\n + \ \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 96ba38 Grid: true GridProjection: false 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 eddac67c7..8c26325ce 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: John Dee Translation DragSelectable: true -GMNotes: "{\r\n \"id\": \"01009\",\r\n \"alternate_ids\": [\r\n \"01509\"\r\n - \ ],\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n \"traits\": \"Item. - Tome.\",\r\n \"weakness\": true,\r\n \"cycle\": \"Core\"\r\n}\r" +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}" 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 ddee51d9f..525435e87 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Olaus Wormius Translation DragSelectable: true -GMNotes: "{\r\n \"id\": \"02140\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Tome.\",\r\n \"intellectIcons\": 1,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02140\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Tome.\",\n \"intellectIcons\": 1,\n \"cycle\": + \"The Dunwich Legacy\"\n}" GUID: d45f10 Grid: true GridProjection: false 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 3226ca658..796c65b55 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03012\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Spell.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03012\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Spell.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: dfd48b Grid: true GridProjection: false 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 b6ad1bacc..b2535cc7c 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"04039\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04039\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: dc5b38 Grid: true GridProjection: false 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 a91286e0b..984fe7748 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 @@ -19,27 +19,25 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09042\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic. Upgrade.\",\r\n - \ \"intellectIcons\": 2,\r\n \"customizations\": [\r\n {\r\n \"name\": - \"Living Quill\",\r\n \"xp\": 1,\r\n \"text\": \"Using attached asset\u2019s - \u27BD abilities does not provoke attacks of opportunity.\"\r\n },\r\n {\r\n - \ \"name\": \"Spectral Binding\",\r\n \"xp\": 1,\r\n \"text\": \"Attached - asset does not take up any slots.\"\r\n },\r\n {\r\n \"name\": \"Mystic - Vane\",\r\n \"xp\": 2,\r\n \"text\": \"You get +2 skill value while performing - skill tests on attached asset.\"\r\n },\r\n {\r\n \"name\": \"Endless - Inkwell\",\r\n \"xp\": 2,\r\n \"text\": \"Name two more Tome or Spell - assets.\"\r\n },\r\n {\r\n \"name\": \"Energy Sap\",\r\n \"xp\": - 2,\r\n \"text\": \"The Raven Quill gains: \u201C\U0001F5F2 Exhaust The Raven - Quill: Move 1 secret or charge from an asset you control to attached asset.\u201D\"\r\n - \ },\r\n {\r\n \"name\": \"Interwoven Ink\",\r\n \"xp\": 3,\r\n \"text\": +GMNotes: "{\n \"id\": \"09042\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. Relic. Upgrade.\",\n \"intellectIcons\": + 2,\n \"customizations\": [\n {\n \"name\": \"Living Quill\",\n \"xp\": + 1,\n \"text\": \"Using attached asset\u2019s \u27BD abilities does not provoke + attacks of opportunity.\"\n },\n {\n \"name\": \"Spectral Binding\",\n + \ \"xp\": 1,\n \"text\": \"Attached asset does not take up any slots.\"\n + \ },\n {\n \"name\": \"Mystic Vane\",\n \"xp\": 2,\n \"text\": + \"You get +2 skill value while performing skill tests on attached asset.\"\n },\n + \ {\n \"name\": \"Endless Inkwell\",\n \"xp\": 2,\n \"text\": \"Name + two more Tome or Spell assets.\"\n },\n {\n \"name\": \"Energy Sap\",\n + \ \"xp\": 2,\n \"text\": \"The Raven Quill gains: \u201C\U0001F5F2 Exhaust + The Raven Quill: Move 1 secret or charge from an asset you control to attached asset.\u201D\"\n + \ },\n {\n \"name\": \"Interwoven Ink\",\n \"xp\": 3,\n \"text\": \"After you resolve an \u27BD ability on attached asset, you may exhaust The Raven - Quill to ready another asset you control.\"\r\n },\r\n {\r\n \"name\": - \"Supernatural Record\",\r\n \"xp\": 4,\r\n \"text\": \"When you play - The Raven Quill, instead of attaching it to a named asset you control, you may search - your deck, discard pile, and hand for a copy of a named asset and play it (paying - its cost). Then, attach The Raven Quill to it.\"\r\n }\r\n ],\r\n \"cycle\": - \"The Scarlet Keys\"\r\n}\r" + Quill to ready another asset you control.\"\n },\n {\n \"name\": \"Supernatural + Record\",\n \"xp\": 4,\n \"text\": \"When you play The Raven Quill, instead + of attaching it to a named asset you control, you may search your deck, discard + pile, and hand for a copy of a named asset and play it (paying its cost). Then, + attach The Raven Quill to it.\"\n }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: b81037 Grid: true GridProjection: false 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 2f77eda64..f64b21a5e 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Broken but Reliable DragSelectable: true -GMNotes: "{\r\n \"id\": \"08053\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08053\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic.\",\n \"wildIcons\": 1,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 814c79 Grid: true GridProjection: false 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 50a1cc485..b7ae0934f 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: Broken but Reliable DragSelectable: true -GMNotes: "{\r\n \"id\": \"08058\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 0,\r\n \"type\": \"Charge\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08058\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Item. + Relic.\",\n \"wildIcons\": 2,\n \"uses\": [\n {\n \"count\": 0,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: '696894' Grid: true GridProjection: false 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 ab6040300..887c85d5e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: He Was Never There DragSelectable: true -GMNotes: "{\r\n \"id\": \"02310\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 5,\r\n \"traits\": \"Ally. Conspirator.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02310\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 5,\n \"traits\": \"Ally. + Conspirator.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: ad18a6 Grid: true GridProjection: false 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 14d1adba7..aa31bb750 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Key to the Gate of Dreams DragSelectable: true -GMNotes: "{\r\n \"id\": \"06189\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Charm. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 2,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06189\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Charm. Relic.\",\n \"willpowerIcons\": 1,\n + \ \"wildIcons\": 2,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 61fd07 Grid: true GridProjection: false 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 8f584257e..0374d0405 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04270\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic. Cursed.\",\r\n - \ \"intellectIcons\": 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04270\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 2,\n \"traits\": \"Item. Relic. Cursed.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 5d559a Grid: true GridProjection: false 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 b631bd36a..ae4f1da25 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: You Have Been Chosen DragSelectable: true -GMNotes: "{\r\n \"id\": \"54001\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54001\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: a77ce0 Grid: true GridProjection: false 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 1df7d49a5..0a0467870 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06028\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"traits\": \"Augury.\",\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06028\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"traits\": \"Augury.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 600a3c Grid: true GridProjection: false 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 813303d92..dca69817a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07263\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 10,\r\n \"level\": 3,\r\n \"traits\": \"Insight. Cursed.\",\r\n \"willpowerIcons\": - 3,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07263\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 10,\n \"level\": 3,\n \"traits\": \"Insight. Cursed.\",\n \"willpowerIcons\": + 3,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: c4ae95 Grid: true GridProjection: false 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 f89c27e05..0e628fa93 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Regalia Dementia DragSelectable: true -GMNotes: "{\r\n \"id\": \"03143\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Clothing.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03143\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Clothing.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 5d30a1 Grid: true GridProjection: false 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 4271166af..44be0d488 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Enemy DragSelectable: true -GMNotes: "{\r\n \"id\": \"03042\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Curse.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03042\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Curse.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: da227d Grid: true GridProjection: false 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 d703b170a..49874a2eb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Circumstances Beyond Your Control DragSelectable: true -GMNotes: "{\r\n \"id\": \"05042\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Omen. Tarot.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05042\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Neutral\",\n \"cost\": 4,\n \"traits\": \"Omen. Tarot.\",\n \"weakness\": + true,\n \"basicWeaknessCount\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d5c93d Grid: true GridProjection: false 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 6af2c9828..06a18b1d1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07154\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07154\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: ca1b5c Grid: true GridProjection: false 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 dc1f1a7a4..61a13e021 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: The Journey is Complete DragSelectable: true -GMNotes: "{\r\n \"id\": \"54003\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Tarot.\",\r\n \"cycle\": \"Return - to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54003\",\n \"type\": \"Asset\",\n \"slot\": \"Tarot\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Tarot.\",\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 372b5b Grid: true GridProjection: false 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 6a687a85b..a1d894632 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Thermos 5b14dc.yaml @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04274\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04274\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Item.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 5b14dc Grid: true GridProjection: false 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 c980868ce..043e360cb 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09075\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Tool. Illicit.\",\r\n - \ \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 6,\r\n \"type\": \"Supply\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09075\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. + Tool. Illicit.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"uses\": + [\n {\n \"count\": 6,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: be8d1f Grid: true GridProjection: false 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 dba72da37..1f2d2a393 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09064\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Tool. Illicit.\",\r\n - \ \"intellectIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 6,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The - Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09064\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Tool. Illicit.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": + 6,\n \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Scarlet Keys\"\n}" GUID: 857b53 Grid: true GridProjection: false 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 ce9865b6b..877018a02 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"51006\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 2,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51006\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 2,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: 3e0653 Grid: true GridProjection: false 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 02e7fec83..c6ffd4292 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02025\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02025\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 6fec31 Grid: true GridProjection: false 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 387d4cf1f..a2390c72a 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07161\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07161\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth + Conspiracy\"\n}" GUID: 45956a Grid: true GridProjection: false 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 026965c60..a07641e67 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Soldier in a New War DragSelectable: true -GMNotes: "{\r\n \"id\": \"07082\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Ally. Agency. Veteran.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth - Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07082\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Ally. Agency. Veteran.\",\n \"willpowerIcons\": + 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 1f7e6e Grid: true GridProjection: false 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 ac383c65c..5c2071d72 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06199\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Fortune. Practiced.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06199\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Fortune. Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 30062e Grid: true GridProjection: false 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 c3a143469..52a476f2c 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60203\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Flaw.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60203\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 3eef18 Grid: true GridProjection: false 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 e8a2e7b0a..78a85e083 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"51011\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Pact. Mystery.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 2,\r\n \"cycle\": \"Return to The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"51011\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Pact. Mystery.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 2,\n \"cycle\": \"Return to The Dunwich Legacy\"\n}" GUID: fd9c56 Grid: true GridProjection: false 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 67e912eae..bde1dc131 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"90038\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"permanent\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90038\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"permanent\": true,\n \"cycle\": \"Standalone\"\n}" GUID: b4f9ee Grid: true GridProjection: false 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 18bd4da19..afea9fb34 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07030\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Spell. Blessed.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07030\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Spell. Blessed.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 823e49 Grid: true GridProjection: false 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 07eccd21b..00dce379f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03311\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Paradox.\",\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03311\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spell. Paradox.\",\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: ba0fe7 Grid: true GridProjection: false 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 19d7c9370..176224a54 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04276\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 5,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"willpowerIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04276\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 5,\n \"level\": 5,\n \"traits\": \"Item. + Relic. Weapon. Melee.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: d3e55b Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml b/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml new file mode 100644 index 000000000..21cf68426 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Tinker 102fbd.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '22': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279446315725170768/AA2426A7A410FEA47066203B1965D849D4AC43DA/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10028\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight. Upgrade.\",\n \"agilityIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 102fbd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: Tinker +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.17 + posY: 2.93 + posZ: -16.73 + 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 To Fight the Black Wind 00b6c3.yaml b/unpacked/Bag All Player Cards 15bb07/Card To Fight the Black Wind 00b6c3.yaml index 81989a310..e912291dc 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98012\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Task. Dreamlands.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98012\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Task. Dreamlands.\",\n \"weakness\": true,\n \"cycle\": \"Promo\"\n}" GUID: 00b6c3 Grid: true GridProjection: false 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 9180046af..88dab2000 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08020\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit. Tactic.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08020\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit. Tactic.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 58288b Grid: true GridProjection: false 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 632430952..0b58914a0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07033\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Charm.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07033\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Charm.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 2ea0d0 Grid: true GridProjection: false 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 bd32b676d..c9dbcad14 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"60103\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Criminal. Syndicate.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60103\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Criminal. Syndicate.\",\n \"weakness\": true,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: c3a014 Grid: true GridProjection: false 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 f3c572ec9..cafa7dfca 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Rookie Cop DragSelectable: true -GMNotes: "{\r\n \"id\": \"06001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Police. Warden.\",\r\n \"willpowerIcons\": 3,\r\n - \ \"intellectIcons\": 3,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +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}" 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 14e7585e8..ae55c992c 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Bounty Hunter DragSelectable: true -GMNotes: "{\r\n \"id\": \"06003\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Criminal. Hunter.\",\r\n \"willpowerIcons\": 2,\r\n - \ \"intellectIcons\": 3,\r\n \"combatIcons\": 5,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +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}" 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 15153425a..8084b50b3 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06011\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Weapon. Firearm.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n - \ \"count\": 3,\r\n \"type\": \"Ammo\",\r\n \"token\": \"resource\"\r\n - \ }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06011\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Weapon. Firearm.\",\n + \ \"intellectIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"uses\": + [\n {\n \"count\": 3,\n \"type\": \"Ammo\",\n \"token\": \"resource\"\n + \ }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 1186a1 Grid: true GridProjection: false 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 c358e849f..50055264e 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06012\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Humanoid. Monster. Deep One.\",\r\n \"weakness\": true,\r\n \"uses\": - [\r\n {\r\n \"count\": 1,\r\n \"type\": \"Doom\",\r\n \"token\": - \"doom\"\r\n },\r\n {\r\n \"count\": 1,\r\n \"type\": \"Bounty\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06012\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Humanoid. Monster. Deep One.\",\n \"weakness\": true,\n \"uses\": + [\n {\n \"count\": 1,\n \"type\": \"Doom\",\n \"token\": \"doom\"\n + \ },\n {\n \"count\": 1,\n \"type\": \"Bounty\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: d6f8d1 Grid: true GridProjection: false 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 25ef4b65b..bc33383de 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09120\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Item. Clothing.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09120\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Clothing.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 769a3e Grid: true GridProjection: false 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 14be9f018..f23ce7b05 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Mortal Reminder DragSelectable: true -GMNotes: "{\r\n \"id\": \"04023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04023\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Relic.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: c1a687 Grid: true GridProjection: false 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 4c4279180..53f915729 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03235\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Mystic\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03235\",\n \"type\": \"Skill\",\n \"class\": \"Mystic\",\n + \ \"level\": 0,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Path to Carcosa\"\n}" GUID: 79287f Grid: true GridProjection: false 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 b6fa4d402..1b27c211a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05036\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Clothing. Footwear.\",\r\n - \ \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05036\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. Clothing. Footwear.\",\n + \ \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 6fa7fa Grid: true GridProjection: false 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 7325d0497..8ed425e76 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04025\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 1,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04025\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 1,\n \"traits\": \"Ally. + Wayfarer.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 18927e Grid: true GridProjection: false 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 fdbeb1856..391fc48b2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04203\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Item. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04203\",\n \"type\": \"Asset\",\n \"slot\": \"Body\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Clothing.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: ba560e Grid: true GridProjection: false 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 c61075419..aba0c5d54 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03147\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03147\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Guardian\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 0d4eb9 Grid: true GridProjection: false 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 abc0ff1e4..eec3d3a01 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54010\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": - 2,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54010\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"wildIcons\": 2,\n + \ \"cycle\": \"Return to the Circle Undone\"\n}" GUID: 76978f Grid: true GridProjection: false 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 214866df7..8c105d654 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05281\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05281\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Circle Undone\"\n}" GUID: 869d4c Grid: true GridProjection: false 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 7dd8e69eb..da2c510a2 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09076\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Criminal.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09076\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Ally. + Criminal.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 11d7ad Grid: true GridProjection: false 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 2c4550631..588063bbb 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 103 +CardID: 55103 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '551': BackIsHidden: true BackURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907490/4AAE686A793E66311FF78890309D20670A329D16/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607899142907034/013ED775CA50C6FC71731E4FBAEBF1ECA8C68F1E/ 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 90d9a0fa0..9fc414322 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Spy DragSelectable: true -GMNotes: "{\r\n \"id\": \"07003\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Agency. Detective.\",\r\n \"willpowerIcons\": 2,\r\n - \ \"intellectIcons\": 4,\r\n \"combatIcons\": 2,\r\n \"agilityIcons\": 4,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +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}" 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 c47083616..0f0f0d86e 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Fixer for Hire DragSelectable: true -GMNotes: "{\r\n \"id\": \"07194\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 5,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Criminal. Cursed.\",\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07194\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Rogue\",\n \"cost\": 5,\n \"level\": 2,\n \"traits\": \"Ally. + Criminal. Cursed.\",\n \"wildIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 1fd630 Grid: true GridProjection: false 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 71ea8276c..f181a1709 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03021\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03021\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: e25dc1 Grid: true GridProjection: false 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 f8a0e92da..525e79223 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 @@ -19,11 +19,11 @@ CustomDeck: UniqueBack: false Description: Reworking Reality DragSelectable: true -GMNotes: "{\r\n \"id\": \"08070\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 4,\r\n \"level\": 5,\r\n \"traits\": \"Item. Relic. Tome.\",\r\n \"willpowerIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 1,\r\n \"replenish\": - 1,\r\n \"type\": \"Charge\",\r\n \"token\": \"resource\"\r\n }\r\n - \ ],\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08070\",\n \"type\": \"Asset\",\n \"slot\": \"Hand|Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 4,\n \"level\": 5,\n \"traits\": \"Item. + Relic. Tome.\",\n \"willpowerIcons\": 2,\n \"wildIcons\": 1,\n \"uses\": [\n + \ {\n \"count\": 1,\n \"replenish\": 1,\n \"type\": \"Charge\",\n + \ \"token\": \"resource\"\n }\n ],\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 79870f Grid: true GridProjection: false 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 280f857b6..fdbd911cb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03273\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"cycle\": - \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03273\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"cycle\": \"The + Path to Carcosa\"\n}" GUID: 8837ff Grid: true GridProjection: false 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 2341638b3..ad4bf5bbf 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04153\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04153\",\n \"type\": \"Skill\",\n \"class\": \"Seeker\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 1,\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: 4167c0 Grid: true GridProjection: false 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 1afd7df04..d9fdc8c02 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Trusted 1bc300.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04019\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Upgrade.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04019\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Upgrade.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 1bc300 Grid: true GridProjection: false 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 38b162813..03496eb5f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08008\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n \"agilityIcons\": - 2,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08008\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Weapon. Melee.\",\n + \ \"agilityIcons\": 2,\n \"wildIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: ca9a60 Grid: true GridProjection: false 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 34e3ef960..b92a668f4 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 @@ -19,11 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"53003\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 3,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Return to the Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53003\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 3,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: 45cd73 Grid: true GridProjection: false 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 70814bc75..753390405 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04152\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"uses\": [\r\n {\r\n \"count\": 2,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04152\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": \"Secret\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: d64c99 Grid: true GridProjection: false 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 6de6b0144..2772f2679 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04159\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 1,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Try\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04159\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 1,\n \"uses\": [\n {\n \"count\": 3,\n \"type\": \"Try\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 3dc82f Grid: true GridProjection: false 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 e6c9224a0..007238aa0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02309\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02309\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: f1b0f9 Grid: true GridProjection: false 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 cc8710382..72d766fea 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Lost in a Dream DragSelectable: true -GMNotes: "{\r\n \"id\": \"06244\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Artist. Dreamer.\",\r\n - \ \"intellectIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06244\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Mystic\",\n \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. + Artist. Dreamer.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 9f76ec Grid: true GridProjection: false 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 cde8adc4d..2c4f31a88 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: Sanctum's Reward DragSelectable: true -GMNotes: "{\r\n \"id\": \"05013\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Item. Relic. Weapon.\",\r\n \"willpowerIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05013\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Item. Relic. Weapon.\",\n + \ \"willpowerIcons\": 1,\n \"combatIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 223ba3 Grid: true GridProjection: false 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 3e8cff55b..d79c462f1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Monster. Extradimensional. Tindalos. DragSelectable: true -GMNotes: "{\r\n \"id\": \"06283\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Extradimensional. Tindalos.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06283\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Extradimensional. Tindalos.\",\n \"weakness\": true,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: 86cf9c Grid: true GridProjection: false 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 f63a8c7e3..022395ba4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09095\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09095\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 343f3a Grid: true GridProjection: false 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 973e888f0..98232416d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03033\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"willpowerIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03033\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"willpowerIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 45d2d2 Grid: true GridProjection: false 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 ee5a55e9c..ffa9d1ea2 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 101 +CardID: 12101 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 2fb5fde84..c5d778bfe 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07157\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Tactic. Trap.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07157\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Tactic. Trap.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: cc8321 Grid: true GridProjection: false 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 371191e67..9dab1be14 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Underprepared 709a54.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"09128\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Blunder.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09128\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Blunder.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 709a54 Grid: true GridProjection: false 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 05df594c3..b97ae9c55 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09077\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Connection. Illicit.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09077\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"level\": 2,\n \"traits\": \"Connection. Illicit.\",\n \"permanent\": true,\n + \ \"cycle\": \"The Scarlet Keys\"\n}" GUID: bba889 Grid: true GridProjection: false 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 de1095533..0fc41e59d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08046\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Favor. Illicit.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08046\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Favor. Illicit.\",\n \"permanent\": true,\n \"cycle\": + \"Edge of the Earth\"\n}" GUID: 8190ac Grid: true GridProjection: false 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 db3aca8c1..7ab3ab618 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08039\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 0,\r\n \"level\": 2,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08039\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 0,\n \"level\": 2,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"agilityIcons\": 1,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: 3a4edd Grid: true GridProjection: false 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 fd1d9921e..37deb3012 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04024\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04024\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: f763e8 Grid: true GridProjection: false 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 c40c2992b..da3c3d319 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60526\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Innate. Developed.\",\r\n \"wildIcons\": 2,\r\n - \ \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60526\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Developed.\",\n \"wildIcons\": 2,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 2f2190 Grid: true GridProjection: false 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 99563fe93..f985cf581 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01593\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01593\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: 853b6c Grid: true GridProjection: false 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 634c1c6f3..98bc3f852 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01093\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Innate.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01093\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Innate.\",\n \"wildIcons\": 2,\n \"cycle\": \"Core\"\n}" GUID: acb83a Grid: true GridProjection: false 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 47795a43a..36483259c 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"85029\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Science.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"uses\": [\r\n {\r\n \"count\": 4,\r\n \"type\": - \"Supply\",\r\n \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"85029\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item. Science.\",\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Supply\",\n \"token\": + \"resource\"\n }\n ],\n \"cycle\": \"Standalone\"\n}" GUID: 2f1166 Grid: true GridProjection: false 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 15c0319d3..ebe66cc7b 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 @@ -80,6 +80,11 @@ SHOW_MULTI_RELEASE --@type: number (amount of tokens to release at once) - this entry allows releasing of multiple tokens at once - example usage: "Nephthys" (to release 3 bless tokens at once) +SHOW_MULTI_RETURN --@type: number (amount of tokens to return to pool at once) + - enables an entry in the context menu + - this entry allows returning tokens to the token pool + - example usage: "Nephthys" (to return 3 bless tokens at once) + SHOW_MULTI_SEAL --@type: number (amount of tokens to seal at once) - enables an entry in the context menu - this entry allows sealing of multiple tokens at once @@ -154,6 +159,11 @@ function generateContextMenu() self.addContextMenuItem("Release token(s)", releaseAllTokens) end + -- conditional release option + if SHOW_MULTI_RETURN then + self.addContextMenuItem("Return " .. SHOW_MULTI_RETURN .. " token(s)", returnMultipleTokens) + end + -- main context menu options to seal tokens for _, map in pairs(ID_URL_MAP) do if (VALID_TOKENS[map.name] ~= nil) or (UPDATE_ON_HOVER and tokensInBag[map.name] and not INVALID_TOKENS[map.name]) then @@ -197,6 +207,10 @@ function readBag() end end +function resetSealedTokens() + sealedTokens = {} +end + -- native event from TTS - used to update the context menu for cards like "Unrelenting" function onHover() if UPDATE_ON_HOVER then @@ -269,6 +283,18 @@ function releaseAllTokens(playerColor) end end +-- returns multiple tokens at once to the token pool +function returnMultipleTokens(playerColor) + if SHOW_MULTI_RETURN <= #sealedTokens then + for i = 1, SHOW_MULTI_RETURN do + returnToken(table.remove(sealedTokens)) + end + printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor) + else + printToColor("Not enough tokens sealed.", playerColor) + end +end + -- returns the token (referenced by GUID) to the chaos bag function putTokenAway(guid) local token = getObjectFromGUID(guid) @@ -282,6 +308,18 @@ function putTokenAway(guid) blessCurseManagerApi.releasedToken(name, guid) end end + +-- returns the token to the pool (== removes it) +function returnToken(guid) + local token = getObjectFromGUID(guid) + if not token then return end + + local name = token.getName() + token.destruct() + if name == "Bless" or name == "Curse" then + blessCurseManagerApi.returnedToken(name, guid) + end +end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -299,7 +337,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -344,6 +382,11 @@ do 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) @@ -356,9 +399,10 @@ do getManager().call("doRemove", playerColor) end - -- adds Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) + -- 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 @@ -393,7 +437,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -412,6 +456,12 @@ do 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) @@ -428,8 +478,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -468,6 +518,18 @@ do 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) 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 32b78c5b5..ab12a04a0 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07196\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07196\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: 45386d Grid: true GridProjection: false 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 1ce5ea30f..6ae5da554 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08113\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue|Survivor\",\r\n - \ \"cost\": 0,\r\n \"level\": 3,\r\n \"traits\": \"Pact.\",\r\n \"cycle\": \"Edge - of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08113\",\n \"type\": \"Asset\",\n \"class\": \"Rogue|Survivor\",\n + \ \"cost\": 0,\n \"level\": 3,\n \"traits\": \"Pact.\",\n \"cycle\": \"Edge of + the Earth\"\n}" GUID: 57b95d Grid: true GridProjection: false 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 fa88a11ea..59b515222 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05010\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 4,\r\n \"traits\": \"Insight. Mystery.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05010\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 4,\n \"traits\": \"Insight. Mystery.\",\n \"weakness\": true,\n \"cycle\": + \"The Circle Undone\"\n}" GUID: 22d886 Grid: true GridProjection: false 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 773719273..54bbe9234 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"52011\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness. Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"hidden\": true,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52011\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"hidden\": true,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: a5be8b Grid: true GridProjection: false 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 d4f19b814..0d5ceca66 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"52013\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness. Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"hidden\": true,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52013\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"hidden\": true,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: ea0fa1 Grid: true GridProjection: false 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 325dc0ef3..6a219ab97 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"52012\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness. Pact.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"hidden\": true,\r\n \"cycle\": \"Return to the Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"52012\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness. Pact.\",\n \"weakness\": true,\n \"basicWeaknessCount\": + 1,\n \"hidden\": true,\n \"cycle\": \"Return to the Path to Carcosa\"\n}" GUID: f6aba5 Grid: true GridProjection: false 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 cf6841f7f..190d15499 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04015\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Talent.\",\r\n \"combatIcons\": 1,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04015\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Talent.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 41a9ec Grid: true GridProjection: false 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 6c165ce1f..1b529cd92 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08051\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Favor.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08051\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Favor.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 69289f Grid: true GridProjection: false 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 36c07862e..f9ab69054 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Explorer DragSelectable: true -GMNotes: "{\r\n \"id\": \"04002\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Wayfarer.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 4,\r\n \"cycle\": \"The Forgotten - Age\"\r\n}\r" +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}" 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 97bfd73ac..f7f9f4975 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Took You Long Enough DragSelectable: true -GMNotes: "{\r\n \"id\": \"05261\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Ally. Socialite.\",\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05261\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Ally. Socialite.\",\n \"agilityIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 726d1d Grid: true GridProjection: false 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 742880459..7b14a9225 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04306\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04306\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 2f9ab1 Grid: true GridProjection: false 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 df4b7b9f2..7591122f5 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60202\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Talent.\",\r\n \"willpowerIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60202\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 3,\n \"traits\": \"Talent.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 2fdcc9 Grid: true GridProjection: false 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 84d308624..76c044fec 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: Skilled Botanist DragSelectable: true -GMNotes: "{\r\n \"id\": \"53037\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"agilityIcons\": 1,\r\n \"wildIcons\": 2,\r\n \"cycle\": \"Return to the Forgotten - Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"53037\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Ally. Wayfarer.\",\n \"willpowerIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 2,\n \"cycle\": \"Return to the Forgotten Age\"\n}" GUID: a0c2da Grid: true GridProjection: false 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 1dec4a21b..86161e1da 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"98009\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Extradimensional. Tindalos.\",\r\n \"weakness\": true,\r\n - \ \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98009\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Extradimensional. Tindalos.\",\n \"weakness\": true,\n + \ \"cycle\": \"Promo\"\n}" GUID: ce3a1a Grid: true GridProjection: false 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 e47a1e3d1..d7cde982f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Venturer 0e2987.yaml @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04018\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"intellectIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Supply\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04018\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Guardian\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Wayfarer.\",\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 3,\n + \ \"type\": \"Supply\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: 0e2987 Grid: true GridProjection: false 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 cdccbca0f..314aac43d 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06167\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"permanent\": true,\r\n \"cycle\": - \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06167\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"level\": 2,\n \"traits\": \"Talent.\",\n \"permanent\": true,\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: eca1c8 Grid: true GridProjection: false 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 652a3576d..d53a27fed 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02299\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Practiced. Expert.\",\r\n \"combatIcons\": 2,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02299\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 2,\n \"traits\": \"Practiced. Expert.\",\n \"combatIcons\": 2,\n + \ \"cycle\": \"The Dunwich Legacy\"\n}" GUID: d2e026 Grid: true GridProjection: false 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 b55724013..33f7c727c 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01025\",\r\n \"alternate_ids\": [\r\n \"60119\",\r\n - \ \"01525\"\r\n ],\r\n \"type\": \"Skill\",\r\n \"class\": \"Guardian\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Practiced.\",\r\n \"combatIcons\": 1,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01025\",\n \"alternate_ids\": [\n \"60119\",\n \"01525\"\n + \ ],\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n \"level\": 0,\n \"traits\": + \"Practiced.\",\n \"combatIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: '889121' Grid: true GridProjection: false 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 527fbc2ea..35ec9fd41 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Doctor DragSelectable: true -GMNotes: "{\r\n \"id\": \"09004\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Seeker\",\r\n \"traits\": \"Medic.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 4,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Scarlet - Keys\"\r\n}\r" +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}" GUID: c431f3 Grid: true GridProjection: false 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 1ceb0142c..0226254fb 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60416\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60416\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"willpowerIcons\": + 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 0988b2 Grid: true GridProjection: false 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 e7403c5c8..81b696af8 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04016\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse. Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04016\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse. Pact.\",\n \"weakness\": true,\n \"cycle\": \"The Forgotten + Age\"\n}" GUID: f93ea8 Grid: true GridProjection: false 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 0751906c0..18d62a330 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03270\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 2,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03270\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Spell. Spirit.\",\n \"wildIcons\": + 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: 4d74f6 Grid: true GridProjection: false 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 57787fe13..512ea5573 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02307\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 1,\r\n \"level\": 5,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"willpowerIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02307\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 5,\n \"traits\": \"Spell. Spirit.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 7bc995 Grid: true GridProjection: false 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 8590e6957..e093f5056 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01065\",\r\n \"alternate_ids\": [\r\n \"01565\"\r\n - \ ],\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n \"cost\": 1,\r\n - \ \"level\": 0,\r\n \"traits\": \"Spell. Spirit.\",\r\n \"wildIcons\": 1,\r\n - \ \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01065\",\n \"alternate_ids\": [\n \"01565\"\n ],\n \"type\": + \"Event\",\n \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": + \"Spell. Spirit.\",\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 6656ad Grid: true GridProjection: false 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 cddf873de..8b4477aef 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07031\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Insight. Blessed.\",\r\n \"willpowerIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07031\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Insight. Blessed.\",\n \"willpowerIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 69116c Grid: true GridProjection: false 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 a55191546..070d733c3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05229\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Trick.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05229\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Tactic. Trick.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: ec38db Grid: true GridProjection: false 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 359381c8f..04a4add87 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03233\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 0,\r\n \"traits\": \"Gambit.\",\r\n \"willpowerIcons\": 1,\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03233\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 0,\n \"traits\": \"Gambit.\",\n \"willpowerIcons\": 1,\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: c40cb4 Grid: true GridProjection: false 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 501af0a00..e09029253 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06017\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster. Extradimensional.\",\r\n \"weakness\": true,\r\n \"hidden\": - true,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06017\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Extradimensional.\",\n \"weakness\": true,\n \"hidden\": + true,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 6945f7 Grid: true GridProjection: false 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 9a945e2cf..05c450f31 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07179\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Relic.\",\r\n \"intellectIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07179\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"traits\": \"Item. Relic.\",\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: '591284' Grid: true GridProjection: false 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 d9769a592..f408e618d 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Waylay da207b.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"03237\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"agilityIcons\": - 2,\r\n \"cycle\": \"The Path to Carcosa\"\r\n}\r" +GMNotes: "{\n \"id\": \"03237\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Tactic.\",\n \"agilityIcons\": + 2,\n \"cycle\": \"The Path to Carcosa\"\n}" GUID: da207b Grid: true GridProjection: false 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 1222a8ab8..d932e8482 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,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/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") @@ -100,6 +103,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -194,6 +198,26 @@ do 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) @@ -279,6 +303,15 @@ do 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 @@ -288,6 +321,22 @@ do 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) @@ -298,7 +347,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -354,10 +403,87 @@ do 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/WellConnected") +__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 0269b1849..1d7c3b546 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"54006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 3,\r\n \"traits\": \"Condition.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Return to the Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"54006\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Condition.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Return to the Circle Undone\"\n}" GUID: '170127' Grid: true GridProjection: false 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 63f6a9df6..fc1ce0c5a 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,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/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,6 +100,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -197,6 +195,26 @@ do 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) @@ -282,6 +300,15 @@ do 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 @@ -291,6 +318,22 @@ do 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) @@ -301,7 +344,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -357,7 +400,90 @@ do 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/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 4aea785d8..444b07ece 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05028\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Condition.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05028\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Condition.\",\n \"intellectIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: 66b7d5 Grid: true GridProjection: false 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 c9e68ba34..6dce1e9ed 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04151\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Talent.\",\r\n \"cycle\": - \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04151\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent.\",\n \"cycle\": \"The + Forgotten Age\"\n}" GUID: eea4ef Grid: true GridProjection: false 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 8a4820257..60c64897a 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 100 +CardID: 12100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 9d544d0fc..ee2e3378b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05152\",\r\n \"type\": \"Event\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 0,\r\n \"level\": 1,\r\n \"traits\": \"Upgrade.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05152\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 0,\n \"level\": 1,\n \"traits\": \"Upgrade.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: e454c3 Grid: true GridProjection: false 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 3eeb5feda..32db022e9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: true Description: The Urchin DragSelectable: true -GMNotes: "{\r\n \"id\": \"01005-pb\",\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" +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}" GUID: 4232d9 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams 15e40d.yaml b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams 15e40d.yaml index 9bcfe706b..871b6132f 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams 15e40d.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wendy Adams 15e40d.yaml @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: true Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01005-m\",\r\n \"alternate_ids\": [\r\n \"01505-m\"\r\n - \ ],\r\n \"type\": \"Minicard\"\r\n}\r" +GMNotes: "{\n \"id\": \"01005-m\",\n \"alternate_ids\": [\n \"01505-m\"\n ],\n + \ \"type\": \"Minicard\"\n}" GUID: 15e40d 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 6863b61c6..82dffce07 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: true Description: The Urchin DragSelectable: true -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" +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}" GUID: fc1d17 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 d38cca9c4..d74c5888a 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01514\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01514\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": + 2,\n \"cycle\": \"Core\"\n}" GUID: 05d7d5 Grid: true GridProjection: false 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 25703fa5a..785d114d4 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01014\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"wildIcons\": 2,\r\n \"cycle\": - \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01014\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"wildIcons\": + 2,\n \"cycle\": \"Core\"\n}" GUID: 27b4ea Grid: true GridProjection: false 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 eb4b71148..2967ead48 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90039\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item. Relic.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90039\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Relic.\",\n \"willpowerIcons\": + 1,\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" GUID: 664b70 Grid: true GridProjection: false 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 9c6aba2d1..4a89d8464 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Madness. DragSelectable: true -GMNotes: "{\r\n \"id\": \"84007\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"84007\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"Standalone\"\n}" GUID: 2c76d9 Grid: true GridProjection: false 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 new file mode 100644 index 000000000..c702e4e7f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/Card Where's Pa 9aba43.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 910400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '9104': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558543/20409C8476361342F4067117A61ABFC07326F948/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10018\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Flaw.\",\n \"weakness\": true,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 9aba43 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Card +Nickname: '"Where''s Pa?"' +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 10.69 + posY: 2.44 + posZ: 43.88 + 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 Whispers from the Deep dd4a25.yaml b/unpacked/Bag All Player Cards 15bb07/Card Whispers from the Deep dd4a25.yaml index ac91e35c5..2174ccf61 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"07009\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Curse.\",\r\n \"weakness\": true,\r\n \"wildIcons\": 1,\r\n \"negativeIcons\": - true,\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07009\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse.\",\n \"weakness\": true,\n \"wildIcons\": 1,\n \"negativeIcons\": + true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: dd4a25 Grid: true GridProjection: false 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 5f8723076..b3a5408a3 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Hunter of Rare Books DragSelectable: true -GMNotes: "{\r\n \"id\": \"60223\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 2,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"willpowerIcons\": - 1,\r\n \"intellectIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60223\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 2,\n \"traits\": \"Ally. + Miskatonic.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"cycle\": + \"Investigator Packs\"\n}" GUID: 854c79 Grid: true GridProjection: false 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 a8f55716b..7dacbb7be 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Hunter of Rare Books DragSelectable: true -GMNotes: "{\r\n \"id\": \"60213\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic.\",\r\n \"intellectIcons\": - 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60213\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic.\",\n \"intellectIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: 3c5099 Grid: true GridProjection: false 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 8592414a4..c4e0f9f9b 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01085\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01085\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 0027f2 Grid: true GridProjection: false 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 63d4b0489..f095e4704 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01585\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 3,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": - 1,\r\n \"wildIcons\": 1,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01585\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 4,\n \"level\": 3,\n \"traits\": \"Spirit.\",\n \"combatIcons\": + 1,\n \"wildIcons\": 1,\n \"cycle\": \"Core\"\n}" GUID: 3959fa Grid: true GridProjection: false 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 d7d85b05d..fe3050aa6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"60512\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Spirit.\",\r\n \"combatIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"Investigator Packs\"\r\n}\r" +GMNotes: "{\n \"id\": \"60512\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Spirit.\",\n \"combatIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"Investigator Packs\"\n}" GUID: dc4a2c Grid: true GridProjection: false 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 212384bb3..fcad28a79 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Gravedigger DragSelectable: true -GMNotes: "{\r\n \"id\": \"03005\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Survivor\",\r\n \"traits\": \"Warden.\",\r\n \"willpowerIcons\": 3,\r\n \"intellectIcons\": - 2,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 3,\r\n \"cycle\": \"The Path - to Carcosa\"\r\n}\r" +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}" GUID: 7e4c56 Grid: true GridProjection: false 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 97f1b03bb..bddac6db9 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04272\",\r\n \"type\": \"Event\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Tactic. Improvised.\",\r\n - \ \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04272\",\n \"type\": \"Event\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Improvised.\",\n \"cycle\": + \"The Forgotten Age\"\n}" GUID: aa3984 Grid: true GridProjection: false 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 76762830e..1ed1b00a1 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Aviatrix DragSelectable: true -GMNotes: "{\r\n \"id\": \"60301\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Rogue\",\r\n \"traits\": \"Criminal.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 3,\r\n \"combatIcons\": 3,\r\n \"agilityIcons\": 5,\r\n \"cycle\": \"Investigator - Packs\"\r\n}\r" +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}" 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 03aa38915..bc3a59904 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 @@ -19,8 +19,9 @@ CustomDeck: UniqueBack: false Description: Jewel of the Gods DragSelectable: true -GMNotes: "{\r\n \"id\": \"06277\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"traits\": \"Item. Relic. Blessed.\",\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06277\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"traits\": \"Item. Relic. Blessed.\",\n \"cycle\": + \"The Dream-Eaters\"\n}" GUID: 464ca1 Grid: true GridProjection: false 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 e83e1c453..9399b71e6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05321\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 4,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 2,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05321\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Spell.\",\n + \ \"combatIcons\": 2,\n \"cycle\": \"The Circle Undone\"\n}" GUID: f57a6f Grid: true GridProjection: false 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 0be335ca7..583998cdb 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Wither d946d9.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05157\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Spell.\",\r\n \"combatIcons\": - 1,\r\n \"cycle\": \"The Circle Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05157\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n + \ \"combatIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d946d9 Grid: true GridProjection: false 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 4c20bca38..a7fef4993 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08615\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Item. Expedition.\",\r\n \"agilityIcons\": 1,\r\n - \ \"wildIcons\": 2,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08615\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Item. Expedition.\",\n \"agilityIcons\": 1,\n \"wildIcons\": + 2,\n \"cycle\": \"Edge of the Earth\"\n}" GUID: '991640' Grid: true GridProjection: false 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 3ffc002b6..2d11ed8e8 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06202\",\r\n \"type\": \"Event\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Spell.\",\r\n \"cycle\": \"The - Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06202\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Spell.\",\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 26853e Grid: true GridProjection: false 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 c44a3ee03..aa38dc5d2 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09013\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Pact.\",\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09013\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Pact.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: 5edfc2 Grid: true GridProjection: false 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 f09a6024f..82d6a3ed4 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 @@ -19,8 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"09012\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Pact.\",\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09012\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Pact.\",\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: bb7174 Grid: true GridProjection: false 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 ba1927af5..26777ba50 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01537\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01537\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Core\"\n}" GUID: 07b7a1 Grid: true GridProjection: false 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 a4e0cd6a5..f95d8c2ae 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"01037\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 2,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"intellectIcons\": - 2,\r\n \"cycle\": \"Core\"\r\n}\r" +GMNotes: "{\n \"id\": \"01037\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"intellectIcons\": + 2,\n \"cycle\": \"Core\"\n}" GUID: eb6165 Grid: true GridProjection: false 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 60019496a..fe6a36dc8 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 @@ -19,10 +19,10 @@ CustomDeck: UniqueBack: false Description: On Death's Doorstep DragSelectable: true -GMNotes: "{\r\n \"id\": \"09007\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Ally. Bystander.\",\r\n \"weakness\": true,\r\n \"uses\": [\r\n - \ {\r\n \"count\": 3,\r\n \"type\": \"Damage\",\r\n \"token\": - \"damage\"\r\n }\r\n ],\r\n \"cycle\": \"The Scarlet Keys\"\r\n}\r" +GMNotes: "{\n \"id\": \"09007\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Ally. Bystander.\",\n \"weakness\": true,\n \"uses\": [\n {\n + \ \"count\": 3,\n \"type\": \"Damage\",\n \"token\": \"damage\"\n + \ }\n ],\n \"cycle\": \"The Scarlet Keys\"\n}" GUID: fb54d3 Grid: true GridProjection: false 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 1e4a316b0..d473641c3 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"02015\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Madness.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02015\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Madness.\",\n \"weakness\": true,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 97781f Grid: true GridProjection: false 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 cbce97246..c2d6e1376 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"08034\",\r\n \"type\": \"Event\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 1,\r\n \"level\": 0,\r\n \"traits\": \"Insight.\",\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"Edge of the Earth\"\r\n}\r" +GMNotes: "{\n \"id\": \"08034\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Insight.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"Edge of the Earth\"\n}" GUID: 320bbe Grid: true GridProjection: false 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 2ad7e42a5..59a42a8cf 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 107 +CardID: 12107 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '121': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2021607169641060708/B263E98D28E301D8EF45EB001FEBCE98DA25354B/ 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 80c242c58..ff7201552 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Lost Son of Eztli DragSelectable: true -GMNotes: "{\r\n \"id\": \"04035\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 3,\r\n \"level\": 1,\r\n \"traits\": \"Ally. Wayfarer.\",\r\n \"willpowerIcons\": - 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04035\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 3,\n \"level\": 1,\n \"traits\": \"Ally. + Wayfarer.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: 284bbe Grid: true GridProjection: false 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 9faceed97..e6d6af32a 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Yaztaroth bd65dc.yaml @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"98018\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Curse. Pact.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98018\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Curse. Pact.\",\n \"weakness\": true,\n \"cycle\": \"Promo\"\n}" GUID: bd65dc Grid: true GridProjection: false 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 663497ebd..2bb12d472 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"04028\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Trick.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Forgotten Age\"\r\n}\r" +GMNotes: "{\n \"id\": \"04028\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Forgotten Age\"\n}" GUID: dcdcea Grid: true GridProjection: false 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 a8fc78418..2727fce2b 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"05319\",\r\n \"type\": \"Event\",\r\n \"class\": \"Rogue\",\r\n - \ \"cost\": 0,\r\n \"level\": 0,\r\n \"traits\": \"Favor. Gambit.\",\r\n \"intellectIcons\": - 1,\r\n \"combatIcons\": 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Circle - Undone\"\r\n}\r" +GMNotes: "{\n \"id\": \"05319\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 0,\n \"level\": 0,\n \"traits\": \"Favor. Gambit.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Circle Undone\"\n}" GUID: d27d12 Grid: true GridProjection: false 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 f90cc0abf..7850faeb6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Basic Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"06038\",\r\n \"type\": \"Enemy\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Monster.\",\r\n \"weakness\": true,\r\n \"basicWeaknessCount\": - 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06038\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster.\",\n \"weakness\": true,\n \"basicWeaknessCount\": 1,\n + \ \"cycle\": \"The Dream-Eaters\"\n}" GUID: 406ab2 Grid: true GridProjection: false 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 08b5281c5..369aedaf8 100644 --- a/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml +++ b/unpacked/Bag All Player Cards 15bb07/Card Zeal 695bb7.yaml @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"06032\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Ally. Creature. Dreamlands.\",\r\n \"intellectIcons\": - 1,\r\n \"agilityIcons\": 1,\r\n \"cycle\": \"The Dream-Eaters\"\r\n}\r" +GMNotes: "{\n \"id\": \"06032\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 1,\n \"traits\": \"Ally. Creature. Dreamlands.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"cycle\": \"The Dream-Eaters\"\n}" GUID: 695bb7 Grid: true GridProjection: false 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 0293a5b4c..466beba65 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Recalling Ancient Things DragSelectable: true -GMNotes: "{\r\n \"id\": \"02217\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Dunwich.\",\r\n \"willpowerIcons\": 1,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02217\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 3,\n \"traits\": \"Ally. Dunwich.\",\n \"willpowerIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 6714b2 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 714943c0d..f119c3812 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 @@ -19,10 +19,9 @@ CustomDeck: UniqueBack: true Description: The Chef DragSelectable: true -GMNotes: "{\r\n \"id\": \"02001\",\r\n \"type\": \"Investigator\",\r\n \"class\": - \"Guardian\",\r\n \"traits\": \"Believer. Hunter.\",\r\n \"willpowerIcons\": 4,\r\n - \ \"intellectIcons\": 2,\r\n \"combatIcons\": 4,\r\n \"agilityIcons\": 2,\r\n - \ \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +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}" 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 8123ee0c2..cbfaae98c 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Symbol of Righteousness DragSelectable: true -GMNotes: "{\r\n \"id\": \"02006\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"traits\": \"Item. Charm.\",\r\n \"combatIcons\": 2,\r\n \"wildIcons\": - 1,\r\n \"cycle\": \"The Dunwich Legacy\"\r\n}\r" +GMNotes: "{\n \"id\": \"02006\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"traits\": \"Item. Charm.\",\n \"combatIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"The Dunwich Legacy\"\n}" GUID: 66d810 Grid: true GridProjection: false 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 8969989a6..abd5f67cc 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Symbol of Conviction (Advanced) DragSelectable: true -GMNotes: "{\n \"id\": \"90060\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n - \ \"cost\": 1,\n \"traits\": \"Item. Charm.\",\n \"combatIcons\": 2,\n \"wildIcons\": - 1,\n \"cycle\": \"Path of the Righteous\"\n}" +GMNotes: "{\n \"id\": \"90060\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"traits\": \"Item. Charm.\",\n \"combatIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"Path of the Righteous\"\n}" GUID: 66d811 Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml new file mode 100644 index 000000000..218f63de0 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Absolution aef183.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 125300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1253': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136565/AE4B753BBB284EB12A0BDE36CEA3CD763C835AC0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10024\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Spell. Blessed.\",\n \"willpowerIcons\": 2,\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: aef183 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Absolution +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 b5d0638f1..e02ae2ad9 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Accursed e91c5e.yaml @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 100 +CardID: 20100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '201': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009070977509/27A8CCF2BC48CAD909180D64177E86B8232F66C6/ 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 new file mode 100644 index 000000000..2c05a388b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yoth) 84ad64.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 1700 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '17': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875866961/175F57B97C6DEC14F1F6E6420A318A76D38FFE8A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10007\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Science.\",\n \"agilityIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 84ad64 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Aetheric Current (Yoth) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..0b4d6f6b1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Aetheric Current (Yuggoth) 84ad65.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 12700 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '127': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867121/DD34A54C059F9DE340A3C54406A276D202D1C329/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10006\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Science.\",\n \"combatIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 84ad65 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Aetheric Current (Yuggoth) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 50d9657f8..3f2f98c9e 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,6 +41,74 @@ 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) @@ -553,6 +621,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -647,6 +716,26 @@ do 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) @@ -732,6 +821,15 @@ do 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 @@ -741,6 +839,22 @@ do 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) @@ -751,7 +865,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -807,6 +921,18 @@ do 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) 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 new file mode 100644 index 000000000..b5ad0c713 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Ancestral Token c1fb1f.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 4900 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '49': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447674651244606/B2275AD213AF8DD0B65170BD4E5E5E98E233A6C7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10019\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Guardian\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Charm. Blessed.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: c1fb1f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Ancestral Token +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 1a2bb64ea..62ead6817 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07122\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Survivor\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Covenant. Blessed.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07122\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Blessed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: '436401' Grid: true GridProjection: false 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 8ab0921df..f4f2c1fc3 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07113\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"level\": 2,\r\n \"traits\": \"Covenant. Cursed.\",\r\n \"permanent\": true,\r\n - \ \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07113\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"startsInPlay\": true,\n \"level\": 2,\n \"traits\": \"Covenant. Cursed.\",\n + \ \"permanent\": true,\n \"cycle\": \"The Innsmouth Conspiracy\"\n}" GUID: 10b087 Grid: true GridProjection: false 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 new file mode 100644 index 000000000..8ce71f8d6 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Book of Living Myths c5fb1f.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 8500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '85': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528306779/F60D99AAA35122A9553F0B5FD736DB6FB73BE7EF/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Chronicle of Wonders +DragSelectable: true +GMNotes: "{\n \"id\": \"10013\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"traits\": \"Item. Tome. Blessed. + Cursed.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": 1,\n \"wildIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: c5fb1f +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Book of Living Myths +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..c585a7574 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Buried Secrets 28080e.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '133': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520416/34030F3F4E7DB48038BAC2BB6010D4781C102301/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: "{\n \"id\": \"90064\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Mystery.\",\n \"weakness\": true,\n \"cycle\": \"Relics of the + Past\"\n}" +GUID: 28080e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Buried Secrets +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.2 + posY: 2.67 + posZ: -16.73 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..7654cf7f5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Cat Mask 847ed6.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 40300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '403': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186559601365/6C247C82793481C97E24F74A26AF905E3B708C50/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Capricious Meddler +DragSelectable: true +GMNotes: "{\n \"id\": \"10084\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Charm. Mask.\",\n \"combatIcons\": + 1,\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" +GUID: 847ed6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Cat Mask +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..5d09b1e2c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Confound (3) 9965de.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 124100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1241': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136671/AC1530FE71D9E5CF4F816A488E07076AC8064BD8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10057\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Insight. Trick.\",\n \"intellectIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 9965de +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Confound (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 47a789f3c..8b4e54a4f 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,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 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 @@ -544,6 +615,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -638,6 +710,26 @@ do 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) @@ -723,6 +815,15 @@ do 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 @@ -732,6 +833,22 @@ do 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) @@ -742,7 +859,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -798,10 +915,19 @@ do 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/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 a24f64abf..04305969f 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90002\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 2,\r\n \"traits\": \"Item.\",\r\n \"willpowerIcons\": 1,\r\n \"intellectIcons\": - 1,\r\n \"wildIcons\": 2,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90002\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Item.\",\n \"willpowerIcons\": 1,\n \"intellectIcons\": + 1,\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" GUID: cf41be Grid: true GridProjection: false 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 e92e04dc1..d2b1893be 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,89 +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 - - return GUIDReferenceApi -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) __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 @@ -576,6 +493,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -670,6 +588,26 @@ do 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) @@ -755,6 +693,15 @@ do 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 @@ -764,6 +711,22 @@ do 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) @@ -774,7 +737,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -803,4 +766,167 @@ 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/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 2a0ba5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml similarity index 75% rename from unpacked/Bag All Player Cards 15bb07/CardCustom Devil 2a0ba5.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml index 41506f9e0..3d2a7fa52 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Devil 2a0ba5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Devil (2) 2a0ba5.yaml @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Friend or Foe? DragSelectable: true -GMNotes: "{\n \"id\": \"10119\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n - \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Ally. Creature. Cursed.\",\n \"agilityIcons\": - 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10119\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Survivor\",\n \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Ally. + Creature. Cursed.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" GUID: 2a0ba5 Grid: true GridProjection: false @@ -34,7 +35,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: CardCustom -Nickname: '"Devil"' +Nickname: '"Devil" (2)' SidewaysCard: false Snap: true Sticky: true 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 new file mode 100644 index 000000000..c98261a2d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Drain Essence 9965aa.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 12100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '121': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128231/B3D4EF69ABE3736988B015629C5862F69EB42BDC/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10094\",\n \"type\": \"Event\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spell.\",\n \"intellectIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 9965aa +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Drain Essence +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 30438d61f..0157a8c69 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07111\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Seeker\",\r\n - \ \"cost\": 4,\r\n \"level\": 0,\r\n \"traits\": \"Ally. Miskatonic\",\r\n \"willpowerIcons\": - 1,\r\n \"uses\": [\r\n {\r\n \"count\": 3,\r\n \"type\": \"Secret\",\r\n - \ \"token\": \"resource\"\r\n }\r\n ],\r\n \"cycle\": \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07111\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Seeker\",\n \"cost\": 4,\n \"level\": 0,\n \"traits\": \"Ally. + Miskatonic\",\n \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": + 3,\n \"type\": \"Secret\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: f6b1b6 Grid: true GridProjection: false 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 2c05b644f..c3e6a54f3 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 100 +CardID: 33100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '331': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009099794816/E5700422279C3B3100E11698F95F7FF2403C6362/ @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"10128\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n \"willpowerIcons\": - 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": \"Charge\",\n \"token\": - \"resource\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10128\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Neutral\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Ritual.\",\n + \ \"willpowerIcons\": 1,\n \"uses\": [\n {\n \"count\": 4,\n \"type\": + \"Charge\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" GUID: e8765a Grid: true GridProjection: false 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 869df2fca..89c153ec8 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,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/customizable/EmpiricalHypothesisUpgradeSheet") +end) __bundle_register("playercards/customizable/EmpiricalHypothesisUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) -- Customizable Cards: Empirical Hypothesis @@ -555,6 +558,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -649,6 +653,26 @@ do 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) @@ -734,6 +758,15 @@ do 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 @@ -743,6 +776,22 @@ do 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) @@ -753,7 +802,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -809,10 +858,87 @@ do 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/customizable/EmpiricalHypothesisUpgradeSheet") +__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 new file mode 100644 index 000000000..961d43776 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Failed Experiment acd281.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 57200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '572': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867257/845C4AF7C4ECDFA6EB547F4C8CBB4B192EFCF159/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10008\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Blunder.\",\n \"weakness\": true,\n \"cycle\": \"The Feast of + Hemlock Vale\"\n}" +GUID: acd281 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Failed Experiment +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.13 + posY: 5.02 + posZ: -16.72 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..cf0e38dad --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Fake Credentials acd38d.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 7400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '74': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128378/E8199C752F09FB88E1A7D5F56FBC4B9D772F820D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10066\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Rogue\",\n \"cost\": 3,\n \"level\": 0,\n \"traits\": \"Item. + Illicit.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: acd38d +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Fake Credentials +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 ad79604b6..41f2d32f8 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 @@ -3,13 +3,13 @@ AltLookAngle: y: 0 z: 0 Autoraise: true -CardID: 100 +CardID: 34100 ColorDiffuse: b: 0.71324 g: 0.71324 r: 0.71324 CustomDeck: - '1': + '341': BackIsHidden: true BackURL: https://i.imgur.com/EcbhVuh.jpg/ FaceURL: http://cloud-3.steamusercontent.com/ugc/2172484009099794971/0D542175146E0E2FBBBDCC8110B32A573FDBB03E/ diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Flux Stabilizer 55990a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Flux Stabilizer 55990a.yaml new file mode 100644 index 000000000..043ce78b2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Flux Stabilizer 55990a.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 78400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '784': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867375/0BEDB302FC862640FDBAB3CB2C014FE1BBA2B9DD/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867499/17C5348F996E1044F4ABA802807FAB9589E0C154/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: true +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10005\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"startsInPlay\": true,\n \"traits\": \"Item. Tool. Science.\",\n \"bonded\": + [\n {\n \"count\": 1,\n \"id\": \"10006\"\n },\n {\n \"count\": + 1,\n \"id\": \"10007\"\n }\n ],\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 55990a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Flux Stabilizer +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 98.64 + posY: 1.95 + posZ: 13.55 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..6b5fe1866 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Fox Mask 4144cd.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '25': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2316603641240799540/C9D5A77FF0A0ED8DB1BBBBF0B02296B49E0E3CE8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Wise Trickster +DragSelectable: true +GMNotes: "{\n \"id\": \"10067\",\n \"type\": \"Asset\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Charm. Mask.\",\n \"intellectIcons\": + 1,\n \"agilityIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" +GUID: 4144cd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Fox Mask +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 cf525a664..8fce323df 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,265 +41,72 @@ 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) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlaymatApi = {} - 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 + } - -- 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 + -- 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 + }) - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) + -- filtering the result local objList = {} - for _, mat in pairs(getMatForColor(matColor)) do - for _, obj in ipairs(mat.call("searchAroundSelf", filter)) do - table.insert(objList, obj) + 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 - -- 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 + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - 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 - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) 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 }) + -- 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 - -- 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 - - return GUIDReferenceApi + return SearchLib end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -820,4 +627,323 @@ 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) return __bundle_require("__root") \ No newline at end of file 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 09c3927f1..a24f42dbf 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 @@ -41,6 +41,68 @@ 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/GrizzledUpgradeSheet") +end) +__bundle_register("playercards/customizable/GrizzledUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Customizable Cards: Grizzled + +-- Color information for buttons and input boxes +boxSize = 40 +inputFontsize = 50 + +-- static values +xInitial = -0.933 +xOffset = 0.075 + +customizations = { + [1] = { + textField = { + position = { 0.3, 0.25, -0.91 }, + width = 600 + } + }, + [2] = { + checkboxes = { + posZ = -0.71, + count = 1, + }, + textField = { + position = { 0.005, 0.25, -0.58 }, + width = 875 + } + }, + [3] = { + checkboxes = { + posZ = -0.458, + count = 2, + }, + textField = { + position = { 0.005, 0.25, -0.32 }, + width = 875 + } + }, + [4] = { + checkboxes = { + posZ = -0.205, + count = 3, + } + }, + [5] = { + checkboxes = { + posZ = 0.362, + count = 4, + }, + }, + [6] = { + checkboxes = { + posZ = 0.82, + 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 @@ -493,6 +555,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -587,6 +650,26 @@ do 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) @@ -672,6 +755,15 @@ do 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 @@ -681,6 +773,22 @@ do 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) @@ -691,7 +799,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -747,69 +855,87 @@ do 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/customizable/GrizzledUpgradeSheet") -end) -__bundle_register("playercards/customizable/GrizzledUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) --- Customizable Cards: Grizzled +__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 + } --- Color information for buttons and input boxes -boxSize = 40 -inputFontsize = 50 + -- 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 + }) --- static values -xInitial = -0.933 -xOffset = 0.075 + -- 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 -customizations = { - [1] = { - textField = { - position = { 0.3, 0.25, -0.91 }, - width = 600 - } - }, - [2] = { - checkboxes = { - posZ = -0.71, - count = 1, - }, - textField = { - position = { 0.005, 0.25, -0.58 }, - width = 875 - } - }, - [3] = { - checkboxes = { - posZ = -0.458, - count = 2, - }, - textField = { - position = { 0.005, 0.25, -0.32 }, - width = 875 - } - }, - [4] = { - checkboxes = { - posZ = -0.205, - count = 3, - } - }, - [5] = { - checkboxes = { - posZ = 0.362, - count = 4, - }, - }, - [6] = { - checkboxes = { - posZ = 0.82, - count = 5, - }, - }, -} -require("playercards/customizable/UpgradeSheetLibrary") + -- 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 Guided by Faith aef282.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml new file mode 100644 index 000000000..4f61e6158 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Guided by Faith aef282.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 105100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1051': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255556703/D151EE26C6909481B57B07C1716A8E7BCED4B988/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10025\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Spirit. Blessed.\",\n \"intellectIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: aef282 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Guided by Faith +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Assistant) 3764ce.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Assistant) 3764ce.yaml new file mode 100644 index 000000000..086c189ee --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Assistant) 3764ce.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 115200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1152': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255556877/A9A8E5091268C0B6D076058B2FC4B0FDECC62388/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Farmhand +DragSelectable: true +GMNotes: "{\n \"id\": \"10015-b1\",\n \"type\": \"Investigator\",\n \"class\": + \"Survivor\",\n \"traits\": \"Assistant. Resolute.\",\n \"willpowerIcons\": 3,\n + \ \"intellectIcons\": 3,\n \"combatIcons\": 4,\n \"agilityIcons\": 4,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 3764ce +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hank Samson (Assistant) +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 9.23 + posY: 3.55 + posZ: 2.42 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Warden) 3764cf.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Warden) 3764cf.yaml new file mode 100644 index 000000000..45c7631fd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson (Warden) 3764cf.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 115300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1153': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557592/1223DD109412F49A37C56EB5164325C52F0F3924/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Farmhand +DragSelectable: true +GMNotes: "{\n \"id\": \"10015-b2\",\n \"type\": \"Investigator\",\n \"class\": + \"Survivor\",\n \"traits\": \"Warden. Resolute\",\n \"willpowerIcons\": 4,\n \"intellectIcons\": + 1,\n \"combatIcons\": 6,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 3764cf +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hank Samson (Warden) +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 9.23 + posY: 3.55 + posZ: 2.42 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cc.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cc.yaml new file mode 100644 index 000000000..dd8cc01c9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cc.yaml @@ -0,0 +1,53 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 8474100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '84741': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557283/E14EDC6948598047D0D876439AD44E924073F6BF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557407/20471F625A68290478EF8A681CBA7CB68E1CD521/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10015-m\",\n \"type\": \"Minicard\"\n}" +GUID: 3764cc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hank Samson +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Minicard +Tooltip: true +Transform: + posX: 5.76 + posY: 3.65 + posZ: 15.39 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.6 + scaleY: 1 + scaleZ: 0.6 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..1f72f5e9d --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hank Samson 3764cd.yaml @@ -0,0 +1,59 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 11600 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '116': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557149/D8D7CA505C221592685FFE01A493875A859DBE3F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Farmhand +DragSelectable: true +GMNotes: "{\n \"id\": \"10015\",\n \"type\": \"Investigator\",\n \"class\": \"Survivor\",\n + \ \"traits\": \"Assistant. Warden.\",\n \"bonded\": [\n {\n \"count\": + 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}" +GUID: 3764cd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hank Samson +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 9.23 + posY: 3.55 + posZ: 2.42 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..7409397f4 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hatchet (1) 2ea0d3.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 52200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '522': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378887536210/F43975F08B2C9DE8717AC605520379B3C3F0FE33/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10117\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 1,\n \"traits\": \"Item. + Tool. Weapon. Ranged.\",\n \"agilityIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 2ea0d3 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hatchet (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 9.01 + posY: 3.86 + posZ: -16.7 + rotX: 1 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..ce18e552e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Hold Up aef182.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 105300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1053': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557726/4725495E403D9EE65EF5F9136F700D429C81AF52/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10026\",\n \"type\": \"Event\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Tactic. Trick.\",\n \"agilityIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: aef182 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Hold Up +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 de3ad688b..2d710013f 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 @@ -41,39 +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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playercards/customizable/HonedInstinctUpgradeSheet") -end) __bundle_register("playercards/customizable/HonedInstinctUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) -- Customizable Cards: Honed Instinct @@ -589,6 +556,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -683,6 +651,26 @@ do 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) @@ -768,6 +756,15 @@ do 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 @@ -777,6 +774,22 @@ do 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) @@ -787,7 +800,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -816,4 +829,117 @@ 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/customizable/HonedInstinctUpgradeSheet") +end) return __bundle_require("__root") \ No newline at end of file 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 3e4a98332..0b2a12ce3 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,95 +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 - - return GUIDReferenceApi -end -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) __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 @@ -582,6 +493,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -676,6 +588,26 @@ do 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) @@ -761,6 +693,15 @@ do 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 @@ -770,6 +711,22 @@ do 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) @@ -780,7 +737,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -809,4 +766,173 @@ 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/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 77e929005..a8a81d593 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 @@ -553,6 +553,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -647,6 +648,26 @@ do 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) @@ -732,6 +753,15 @@ do 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 @@ -741,6 +771,22 @@ do 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) @@ -751,7 +797,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -807,7 +853,87 @@ do 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 Kate Winthrop ce2322.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml new file mode 100644 index 000000000..ef2b8b954 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2322.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 12100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '121': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867646/87E93B4F71674659B01C9ED280E573D7BD929882/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867768/A54D29440DD5A9DA4E059B861C7AC22F5ACD9BE4/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Scientist +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}" +GUID: ce2322 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Kate Winthrop +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 9.23 + posY: 3.55 + posZ: 2.42 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2323.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2323.yaml new file mode 100644 index 000000000..05ba4cecd --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kate Winthrop ce2323.yaml @@ -0,0 +1,53 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2300 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '23': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867871/EB5C687183CDE5C99EB5DD7ADD3FB4BDD6FEAF90/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875867965/C9915CEC416F68E17D14095E2699FA7268826D66/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10004-m\",\n \"type\": \"Minicard\"\n}" +GUID: ce2323 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Kate Winthrop +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Minicard +Tooltip: true +Transform: + posX: 5.76 + posY: 3.65 + posZ: 15.39 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.6 + scaleY: 1 + scaleZ: 0.6 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..e348e331e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami 54eaa7.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 1200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '12': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2279447041528306921/0A76D03B8AF90DA47EDD0910372D3039F8F721CF/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528307014/97D703914FF15C0251BBAF2719502EC26BDCDD5F/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Folklorist +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}" +GUID: 54eaa7 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: "K\u014Dhaku Narukami" +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 9.23 + posY: 3.55 + posZ: 2.42 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami cea427.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami cea427.yaml new file mode 100644 index 000000000..c22fd4d24 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Kōhaku Narukami cea427.yaml @@ -0,0 +1,53 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 84700 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '847': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2279447041528307132/8E82D44E2F6AB7BFF189CB763611C59EF9EC1431/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528307218/ADD29232375EB7B3F78A33CB4BBA79A283DC7172/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10012-m\",\n \"type\": \"Minicard\"\n}" +GUID: cea427 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: "K\u014Dhaku Narukami" +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Minicard +Tooltip: true +Transform: + posX: 5.76 + posY: 3.65 + posZ: 15.39 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.6 + scaleY: 1 + scaleZ: 0.6 +Value: 0 +XmlUI: '' 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 b43b83a8e..8e601e0ff 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 @@ -19,9 +19,8 @@ CustomDeck: UniqueBack: false Description: Weakness DragSelectable: true -GMNotes: "{\r\n \"id\": \"98021\",\r\n \"type\": \"Treachery\",\r\n \"class\": - \"Neutral\",\r\n \"traits\": \"Endtimes.\",\r\n \"weakness\": true,\r\n \"cycle\": - \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98021\",\n \"type\": \"Treachery\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Endtimes.\",\n \"weakness\": true,\n \"cycle\": \"Promo\"\n}" GUID: 242a11 Grid: true GridProjection: false 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 130e42f6c..da78a5353 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 @@ -41,6 +41,116 @@ 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/LivingInkUpgradeSheet") end) @@ -562,6 +672,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -656,6 +767,26 @@ do 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) @@ -741,6 +872,15 @@ do 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 @@ -750,6 +890,22 @@ do 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) @@ -760,7 +916,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -789,34 +945,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 - - return GUIDReferenceApi -end -end) return __bundle_require("__root") \ No newline at end of file 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 970eddc85..1f232703d 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 @@ -553,6 +553,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -647,6 +648,26 @@ do 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) @@ -732,6 +753,15 @@ do 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 @@ -741,6 +771,22 @@ do 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) @@ -751,7 +797,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -807,7 +853,87 @@ do 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 new file mode 100644 index 000000000..e61e97766 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Back) 46b148.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13800 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '138': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520738/82315ABC94958A349B8144CD56E5988E53BF2294/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517531830/EC1E6D6443C07256771BE6E913FFF97949E8FB7D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Archeologist +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}" +GUID: 46b148 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Monterey Jack (Parallel Back) +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 53.27 + posY: 3.14 + posZ: 22.08 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..a4af2ab39 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel Front) 46b147.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13700 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '137': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324186517531692/2F83981C724FECFD69619EFE558B675129FEE563/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520906/D92C977B92A6B9CCBFB1EDF94ABE919BF22E0FD4/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Archeologist +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}" +GUID: 46b147 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Monterey Jack (Parallel Front) +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 53.27 + posY: 3.14 + posZ: 22.08 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..ccb5be1c8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Monterey Jack (Parallel) 46b146.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13600 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '136': + BackIsHidden: true + BackURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520738/82315ABC94958A349B8144CD56E5988E53BF2294/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520906/D92C977B92A6B9CCBFB1EDF94ABE919BF22E0FD4/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +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}" +GUID: 46b146 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Monterey Jack (Parallel) +SidewaysCard: true +Snap: true +Sticky: true +Tags: +- Investigator +- PlayerCard +Tooltip: true +Transform: + posX: 53.27 + posY: 3.14 + posZ: 22.08 + rotX: 0 + rotY: 180 + rotZ: 0 + scaleX: 1.15 + scaleY: 1 + scaleZ: 1.15 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..07aa66971 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Mouse Mask 32ad21.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '24': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2317731538678126539/603CACA51D3BB18D8E97BB18CE9DE3A6E517AFF6/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Meek Watcher +DragSelectable: true +GMNotes: "{\n \"id\": \"10043\",\n \"type\": \"Asset\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Charm. Mask.\",\n \"willpowerIcons\": + 1,\n \"intellectIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" +GUID: 32ad21 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Mouse Mask +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary acd0c2.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml similarity index 97% rename from unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary acd0c2.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml index 8347aadaa..6df3c9bf9 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary acd0c2.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Occult Reliquary (3) acd0c2.yaml @@ -34,7 +34,7 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: CardCustom -Nickname: Occult Reliquary +Nickname: Occult Reliquary (3) SidewaysCard: false Snap: true Sticky: true 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 e2875bffd..944d14e25 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Advanced DragSelectable: true -GMNotes: "{\r\n \"id\": \"90009\",\r\n \"type\": \"Event\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 0,\r\n \"traits\": \"Tactic.\",\r\n \"intellectIcons\": 1,\r\n \"agilityIcons\": - 1,\r\n \"wildIcons\": 2,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90009\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 0,\n \"traits\": \"Tactic.\",\n \"intellectIcons\": 1,\n \"agilityIcons\": + 1,\n \"wildIcons\": 2,\n \"cycle\": \"Standalone\"\n}" GUID: 9c4900 Grid: true GridProjection: false 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 new file mode 100644 index 000000000..15891836c --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Pelt Shipment aa11bc.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 51400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '514': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255557867/008C1DCB5CE961BEB32E83846BBEF4DA0F9EB38E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10109\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"level\": 0,\n \"traits\": \"Item. Supply.\",\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: aa11bc +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Pelt Shipment +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 9.01 + posY: 3.86 + posZ: -16.7 + rotX: 1 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..be344b2a7 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Persistence (1) 2cf51.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 12400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '124': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558022/32883D27BAD8B1BD11F955D75BC7DA0BB0C8BBC3/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10118\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 1,\n \"traits\": \"Innate.\",\n \"wildIcons\": 1,\n \"cycle\": \"The + Feast of Hemlock Vale\"\n}" +GUID: 2cf51 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Persistence (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 d29d2b2e3..79b99565c 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,265 +41,72 @@ 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) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlaymatApi = {} - 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 + } - -- 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 + -- 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 + }) - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - PlaymatApi.searchAroundPlaymat = function(matColor, filter) + -- filtering the result local objList = {} - for _, mat in pairs(getMatForColor(matColor)) do - for _, obj in ipairs(mat.call("searchAroundSelf", filter)) do - table.insert(objList, obj) + 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 - -- 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 + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - -- Triggers the metadata sync for all playmats - PlaymatApi.syncAllCustomizableCards = function() - for _, mat in pairs(getMatForColor("All")) do - mat.call("syncAllCustomizableCards") - 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 - return PlaymatApi -end -end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local GUIDReferenceApi = {} - - local function getGuidHandler() - return getObjectFromGUID("123456") + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) 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 }) + -- 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 - -- 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 - - return GUIDReferenceApi + return SearchLib end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -809,4 +616,323 @@ 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) 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 9ed1558ba..b067f4b97 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,6 +41,116 @@ 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) @@ -559,6 +669,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -653,6 +764,26 @@ do 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) @@ -738,6 +869,15 @@ do 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 @@ -747,6 +887,22 @@ do 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) @@ -757,7 +913,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -786,34 +942,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 - - return GUIDReferenceApi -end -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 new file mode 100644 index 000000000..8f636be85 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Prismatic Spectacles (2) 3adcf5.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 11400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '114': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008872128556/C009C807744F221A9E7A2F8B67BA9EF291EA17C8/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Lens to the Otherworld +DragSelectable: true +GMNotes: "{\n \"id\": \"10056\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Seeker\",\n \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. + Relic. Cursed.\",\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: 3adcf5 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Prismatic Spectacles (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..300e20ed1 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Providential (2) 2cf42a.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 10200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '102': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378897290922/CDA9AB9A68466987CF29AD56DA4BD4A98B19A638/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10125\",\n \"type\": \"Skill\",\n \"class\": \"Survivor\",\n + \ \"level\": 2,\n \"traits\": \"Innate. Blessed.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 2cf42a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Providential (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml new file mode 100644 index 000000000..d1f378d53 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Purified 294d6a.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 65100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '651': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008871909441/F9E7E4782DF158E035B6692FF54B509467764C2E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10029\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 0,\n \"traits\": \"Innate. Blessed.\",\n \"cycle\": \"The Feast of + Hemlock Vale\"\n}" +GUID: 294d6a +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Purified +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 d9e2f16fb..815974d73 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,6 +41,393 @@ 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) @@ -555,265 +942,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - return GUIDReferenceApi -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 58eac62ab..16f234bd1 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Dark Revelations DragSelectable: true -GMNotes: "{\r\n \"id\": \"98020\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 3,\r\n \"traits\": \"Ally. Artist.\",\r\n \"intellectIcons\": 2,\r\n - \ \"wildIcons\": 1,\r\n \"cycle\": \"Promo\"\r\n}\r" +GMNotes: "{\n \"id\": \"98020\",\n \"type\": \"Asset\",\n \"slot\": \"Ally\",\n + \ \"class\": \"Neutral\",\n \"cost\": 3,\n \"traits\": \"Ally. Artist.\",\n \"intellectIcons\": + 2,\n \"wildIcons\": 1,\n \"cycle\": \"Promo\"\n}" GUID: 782e0a Grid: true GridProjection: false 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 new file mode 100644 index 000000000..db18afe0f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Scrimshaw Charm c1fb2e.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 49100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '491': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136814/A09D725A3E1532BDD790011406D8BB68D1F4D2C5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: From Distant Shores +DragSelectable: true +GMNotes: "{\n \"id\": \"10068\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Rogue\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. + Charm. Cursed.\",\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" +GUID: c1fb2e +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Scrimshaw Charm +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 1f237a9b4..d2c0390d6 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"07115\",\r\n \"type\": \"Skill\",\r\n \"class\": \"Rogue\",\r\n - \ \"level\": 1,\r\n \"traits\": \"Practiced.\",\r\n \"wildIcons\": 1,\r\n \"cycle\": - \"The Innsmouth Conspiracy\"\r\n}\r" +GMNotes: "{\n \"id\": \"07115\",\n \"type\": \"Skill\",\n \"class\": \"Rogue\",\n + \ \"level\": 1,\n \"traits\": \"Practiced.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Innsmouth Conspiracy\"\n}" GUID: d2cd42 Grid: true GridProjection: false 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 new file mode 100644 index 000000000..85eaa41e5 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Snitch (2) add242.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 10800 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '108': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558157/7F564EC50CF2DED0C98A9D3AB8912C2ACA5C49F5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10078\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 2,\n \"traits\": \"Favor. Trick.\",\n \"agilityIcons\": + 1,\n \"intellectIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: add242 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Snitch (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 d019285ab..dea5a881a 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 @@ -19,10 +19,11 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\n \"id\": \"10091\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n - \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent. Ritual.\",\n \"uses\": - [\n {\n \"count\": 6,\n \"type\": \"Offering\",\n \"token\": \"resource\"\n - \ }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10091\",\n \"type\": \"Asset\",\n \"slot\": \"Arcane\",\n + \ \"class\": \"Mystic\",\n \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Talent. + Ritual.\",\n \"uses\": [\n {\n \"count\": 6,\n \"type\": \"Offering\",\n + \ \"token\": \"resource\"\n }\n ],\n \"willpowerIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" GUID: c763aa Grid: true GridProjection: false 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 new file mode 100644 index 000000000..2b8f45911 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Stir the Pot (5) add252.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 131500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1315': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558285/956F8A6681A8C59624AFE2EE21D137D467182515/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10083\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 3,\n \"level\": 5,\n \"traits\": \"Trick. Gambit.\",\n \"intellectIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: add252 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Stir the Pot (5) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml new file mode 100644 index 000000000..e8212bcab --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Stouthearted 265ad2.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 25200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '252': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324073255558420/A4269A773E17F55209B1DEBC2EA627314E1070E5/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10017\",\n \"type\": \"Event\",\n \"class\": \"Neutral\",\n + \ \"cost\": 2,\n \"traits\": \"Spirit.\",\n \"combatIcons\": 1,\n \"wildIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 265ad2 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Stouthearted +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.32 + posY: 3.55 + posZ: -0.84 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..7ba08090f --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Strong-Armed (1) 294d6.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 2100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '21': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186534148818/349C8EF53B9C78E4A0A9C22F7322423DF23AD5C7/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10031\",\n \"type\": \"Skill\",\n \"class\": \"Guardian\",\n + \ \"level\": 1,\n \"traits\": \"Innate.\",\n \"agilityIcons\": 1,\n \"combatIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 294d6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Strong-Armed (1) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 6ddc931fc..3db752743 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,6 +41,393 @@ 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/SummonedServitorUpgradeSheet") end) @@ -567,265 +954,4 @@ function maybeUpdateServitorSlotDisplay() }) end end) -__bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local PlaymatApi = {} - local guidReferenceApi = require("core/GUIDReferenceApi") - - -- 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 - - -- 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 - - -- 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 - - -- 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 Function Optional filter function (return true for desired objects) - 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 - - 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 new file mode 100644 index 000000000..6de97d4e8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Survival Technique (2) 2ea0d4.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 52200 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '522': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186534148947/3C443D851F06103A1FC8D98195AE4B907A442385/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10123\",\n \"type\": \"Asset\",\n \"class\": \"Survivor\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Talent. Science.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 2ea0d4 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Survival Technique (2) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 9.01 + posY: 3.86 + posZ: -16.7 + rotX: 1 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..6a340c2e3 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom The Key of Solomon (4) ae54c6.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 34500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '345': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008871909588/C2A18B9B3FFC42C2420E348FDA928FCE02DF8E71/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Secrets of the Unknown +DragSelectable: true +GMNotes: "{\n \"id\": \"10104\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 4,\n \"traits\": \"Item. + Tome. Blessed. Cursed.\",\n \"intellectIcons\": 1,\n \"wildIcons\": 2,\n \"willpowerIcons\": + 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: ae54c6 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: The Key of Solomon (4) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 4d1864b46..40bf1ca09 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 @@ -19,8 +19,9 @@ CustomDeck: UniqueBack: false Description: John Dee Translation (Advanced) DragSelectable: true -GMNotes: "{\r\n \"id\": \"90003\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"traits\": \"Item. Tome.\",\r\n \"weakness\": true,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"90003\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"traits\": \"Item. Tome.\",\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 95080a915..7de1d2dec 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 @@ -493,6 +493,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -587,6 +588,26 @@ do 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) @@ -672,6 +693,15 @@ do 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 @@ -681,6 +711,22 @@ do 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) @@ -691,7 +737,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -747,9 +793,89 @@ do 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) 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 new file mode 100644 index 000000000..4558916f8 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Throw the Book at Them! d617ab.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '131': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2316603641240722224/B99E98444E70743A1A55DF86CC7EF09C9B4B43FF/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10049\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Gambit. Improvised.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: d617ab +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: '"Throw the Book at Them!"' +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..23c8a95ef --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Token of Faith (3) 2ea0d1.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 52100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '521': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378887536350/F17918D27323F466AD8835E5DCE218FB81BD5804/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10126\",\n \"type\": \"Asset\",\n \"slot\": \"Accessory\",\n + \ \"class\": \"Survivor\",\n \"cost\": 2,\n \"level\": 3,\n \"traits\": \"Item. + Charm. Blessed.\",\n \"intellectIcons\": 1,\n \"willpowerIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: 2ea0d1 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Token of Faith (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 9.01 + posY: 3.86 + posZ: -16.7 + rotX: 1 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml new file mode 100644 index 000000000..2c85012c9 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Transmogrify 9965dd.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 123100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '1231': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875868083/4DA5C631FAAB5B6A2B7FD46DFC47C3EAF9ACB71A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10050\",\n \"type\": \"Event\",\n \"class\": \"Seeker\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Gambit. Science.\",\n \"intellectIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: 9965dd +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Transmogrify +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: -7.16 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..e4453de75 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Trusty Bullwhip ca9a61.yaml @@ -0,0 +1,57 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 13400 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '134': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186517520604/13B2733436FDBFFCAAF9BD76DFE053F96F559A7E/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: Advanced +DragSelectable: true +GMNotes: "{\n \"id\": \"90063\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Neutral\",\n \"cost\": 1,\n \"traits\": \"Item. Weapon. Melee.\",\n + \ \"agilityIcons\": 2,\n \"intellectIcons\": 1,\n \"wildIcons\": 1,\n \"cycle\": + \"Relics of the Past\"\n}" +GUID: ca9a61 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Trusty Bullwhip +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 78.56 + posY: 3.33 + posZ: 7.39 + rotX: 0 + rotY: 270 + rotZ: 1 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..642530663 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp (3) add233.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 14500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '145': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278324186529136955/D4A382DBA69D8CBD9671F2E9F1B55DAFA95F4C3D/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10081\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Trick.\",\n \"wildIcons\": 2,\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: add233 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Vamp (3) +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml new file mode 100644 index 000000000..b4a4e3d6e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Vamp add232.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 10500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '105': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2280574378897291066/DC879288F0D5EFCF4309F03DC305A081902FEB29/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10074\",\n \"type\": \"Event\",\n \"class\": \"Rogue\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Trick.\",\n \"wildIcons\": 1,\n + \ \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GUID: add232 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Vamp +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 13.08 + posY: 3.55 + posZ: 6.5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..c0f60c56b --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Weeping Yurei 541bd9.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 1000 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '10': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279447041528307333/8668BDBDA77DF0DA43A153536C7ED6ED22AC05D0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10014\",\n \"type\": \"Enemy\",\n \"class\": \"Neutral\",\n + \ \"traits\": \"Monster. Geist.\",\n \"weakness\": true,\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" +GUID: 541bd9 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Weeping Yurei +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 9.32 + posY: 3.55 + posZ: -3.11 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 new file mode 100644 index 000000000..41af9f52e --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Well-Dressed c6ac33.yaml @@ -0,0 +1,55 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 362500 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '3625': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2279448008875868194/EE49215440FE21B738BBF0E69644A32701A19FC0/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: '' +DragSelectable: true +GMNotes: "{\n \"id\": \"10130\",\n \"type\": \"Skill\",\n \"class\": \"Neutral\",\n + \ \"level\": 0,\n \"traits\": \"Practiced. Fortune.\",\n \"wildIcons\": 1,\n \"cycle\": + \"The Feast of Hemlock Vale\"\n}" +GUID: c6ac33 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Well-Dressed +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- PlayerCard +Tooltip: true +Transform: + posX: 29.34 + posY: 3.37 + posZ: -58.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/CardCustom Wicked Athame c9fb1f.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Wicked Athame c9fb1f.yaml index fcf0b8bed..44d3083ed 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 @@ -19,9 +19,10 @@ CustomDeck: UniqueBack: false Description: Cursed Blade DragSelectable: true -GMNotes: "{\n \"id\": \"10092\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n - \ \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. Weapon. Melee. Cursed.\",\n - \ \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" +GMNotes: "{\n \"id\": \"10092\",\n \"type\": \"Asset\",\n \"slot\": \"Hand\",\n + \ \"class\": \"Mystic\",\n \"cost\": 2,\n \"level\": 0,\n \"traits\": \"Item. + Weapon. Melee. Cursed.\",\n \"combatIcons\": 1,\n \"cycle\": \"The Feast of Hemlock + Vale\"\n}" GUID: c9fb1f Grid: true GridProjection: false diff --git a/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 54eab5.yaml b/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml similarity index 98% rename from unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 54eab5.yaml rename to unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml index afaa0ff6f..7b3f8e09b 100644 --- a/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 54eab5.yaml +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Wilson Richards 55eab5.yaml @@ -23,7 +23,7 @@ GMNotes: "{\n \"id\": \"10001\",\n \"type\": \"Investigator\",\n \"class\": \ \ \"traits\": \"Drifter.\",\n \"willpowerIcons\": 3,\n \"intellectIcons\": 3,\n \ \"combatIcons\": 3,\n \"agilityIcons\": 3,\n \"cycle\": \"The Feast of Hemlock Vale\"\n}" -GUID: 54eab5 +GUID: 55eab5 Grid: true GridProjection: false Hands: true 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 new file mode 100644 index 000000000..7651b7bc2 --- /dev/null +++ b/unpacked/Bag All Player Cards 15bb07/CardCustom Wolf Mask 975d89.yaml @@ -0,0 +1,58 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +CardID: 74100 +ColorDiffuse: + b: 0.71324 + g: 0.71324 + r: 0.71324 +CustomDeck: + '741': + BackIsHidden: true + BackURL: https://i.imgur.com/EcbhVuh.jpg/ + FaceURL: http://cloud-3.steamusercontent.com/ugc/2278323044302431462/6976437175C83B7356B6C95335C1ED88140CD57A/ + NumHeight: 1 + NumWidth: 1 + Type: 0 + UniqueBack: false +Description: The Moon's Sire +DragSelectable: true +GMNotes: "{\n \"id\": \"10023\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 1,\n \"level\": 0,\n \"traits\": \"Item. Charm. Mask.\",\n \"agilityIcons\": + 1,\n \"combatIcons\": 1,\n \"uses\": [\n {\n \"count\": 2,\n \"type\": + \"Offering\",\n \"token\": \"resource\"\n }\n ],\n \"cycle\": \"The Feast + of Hemlock Vale\"\n}" +GUID: 975d89 +Grid: true +GridProjection: false +Hands: true +HideWhenFaceDown: true +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: CardCustom +Nickname: Wolf Mask +SidewaysCard: false +Snap: true +Sticky: true +Tags: +- Asset +- PlayerCard +Tooltip: true +Transform: + posX: 82.47 + posY: 3.21 + posZ: 18.32 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' 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 e40a42522..91ed10d69 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 @@ -809,4 +809,3 @@ end function AllMemoryBagsInScene:getGuidList() return Global.getTable(self.NAME_OF_GLOBAL_VARIABLE) or {} end - \ No newline at end of file diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.yaml index 718b40f2e..eaf5a5c64 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2.yaml @@ -10,44 +10,46 @@ ColorDiffuse: g: 1 r: 1 ContainedObjects: -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path - to Carcosa 06a742.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet - Keys 11d148.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The - Web of Dreams 1bac4d.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle - Undone 20d53c.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions - 2275ed.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast - of Hemlock Vale 2e50cf.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich - Legacy 38d1cd.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark - Matter 3a08d9.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones - 2020-202 4c47d8.yaml' - !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 01 Night of the Zealot 56a91d.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge - Scenarios 8f7e04.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New - Versions a1b358.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich + Legacy 38d1cd.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path + to Carcosa 06a742.yaml' - !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 04 The Forgotten Age d5cd12.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones - 2016-2020 e227ad.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge - of the Earth e32dc3.yaml' -- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice - in Wonderland ed1d0c.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle + Undone 20d53c.yaml' - !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06A The Dream-Quest f03c2d.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The + Web of Dreams 1bac4d.yaml' - !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 07 The Innsmouth Conspiracy f5f3b5.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge + of the Earth e32dc3.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet + Keys 11d148.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast + of Hemlock Vale 2e50cf.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones + 2016-2020 e227ad.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones + 2020-202 4c47d8.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge + Scenarios 8f7e04.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge + Scenarios dcf492.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark + Matter 3a08d9.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice + in Wonderland ed1d0c.yaml' - !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C3 Cyclopean Foundations f72800.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions + 2275ed.yaml' +- !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New + Versions a1b358.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -77,7 +79,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false LuaScript: !include 'Custom_Model_Bag CYOA Campaign Guides e87ea2.ttslua' -LuaScriptState: '{"ml":{"06a742":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":16.0398769378662},"rot":{"x":0,"y":269.9891,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"11d148":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-25.9601230621338},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"1bac4d":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-7.96012306213379},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"20d53c":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":4.03987693786621},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"2275ed":{"lock":false,"pos":{"x":41.8248138427734,"y":1.56903828582764,"z":-32.9601230621338},"rot":{"x":0,"y":90.0118,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"2e50cf":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-31.9601230621338},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"38d1cd":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":22.0398769378662},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"3a08d9":{"lock":false,"pos":{"x":39.8248138427734,"y":1.24943828582764,"z":28.0398769378662},"rot":{"x":0,"y":270.0101,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"4c47d8":{"lock":false,"pos":{"x":48.3248138427734,"y":1.24943828582764,"z":22.0398769378662},"rot":{"x":0,"y":270.0195,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"56a91d":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":28.0398769378662},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"8f7e04":{"lock":false,"pos":{"x":48.3248138427734,"y":1.24943828582764,"z":4.03987693786621},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"a1b358":{"lock":false,"pos":{"x":35.8248138427734,"y":1.56903828582764,"z":-32.9601230621338},"rot":{"x":0,"y":89.9871,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"d5cd12":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":10.0398769378662},"rot":{"x":0,"y":270.0119,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"e227ad":{"lock":false,"pos":{"x":48.3248138427734,"y":1.24943828582764,"z":28.0398769378662},"rot":{"x":0,"y":269.9818,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"e32dc3":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-19.9601230621338},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"ed1d0c":{"lock":false,"pos":{"x":39.8248138427734,"y":1.24943828582764,"z":22.0398769378662},"rot":{"x":0,"y":269.9964,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f03c2d":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-1.96012306213379},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f5f3b5":{"lock":false,"pos":{"x":56.8248138427734,"y":1.24943828582764,"z":-13.9601230621338},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f72800":{"lock":false,"pos":{"x":39.8248138427734,"y":1.24943828582764,"z":16.0398769378662},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}}}}' +LuaScriptState: '{"ml":{"06a742":{"lock":false,"pos":{"x":65,"y":1.2494,"z":23},"rot":{"x":0,"y":269.9891,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"11d148":{"lock":false,"pos":{"x":65,"y":1.2494,"z":-19},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"1bac4d":{"lock":false,"pos":{"x":65,"y":1.2494,"z":-1},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"20d53c":{"lock":false,"pos":{"x":65,"y":1.2494,"z":11},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"2275ed":{"lock":false,"pos":{"x":50,"y":1.569,"z":-26},"rot":{"x":0,"y":90.0118,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"2e50cf":{"lock":false,"pos":{"x":65,"y":1.2494,"z":-25},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"38d1cd":{"lock":false,"pos":{"x":65,"y":1.2494,"z":29},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"3a08d9":{"lock":false,"pos":{"x":48,"y":1.2494,"z":35},"rot":{"x":0,"y":270.0101,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"4c47d8":{"lock":false,"pos":{"x":56.5,"y":1.2494,"z":29},"rot":{"x":0,"y":270.0195,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"56a91d":{"lock":false,"pos":{"x":65,"y":1.2494,"z":35},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"8f7e04":{"lock":false,"pos":{"x":56.5,"y":1.2494,"z":11},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"a1b358":{"lock":false,"pos":{"x":44,"y":1.569,"z":-26},"rot":{"x":0,"y":89.9871,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"d5cd12":{"lock":false,"pos":{"x":65,"y":1.2494,"z":17},"rot":{"x":0,"y":270.0119,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"dcf492":{"lock":false,"pos":{"x":56.5,"y":1.2494,"z":5},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"e227ad":{"lock":false,"pos":{"x":56.5,"y":1.2494,"z":35},"rot":{"x":0,"y":269.9818,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"e32dc3":{"lock":false,"pos":{"x":65,"y":1.2494,"z":-13},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"ed1d0c":{"lock":false,"pos":{"x":48,"y":1.2494,"z":29},"rot":{"x":0,"y":269.9964,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f03c2d":{"lock":false,"pos":{"x":65,"y":1.2494,"z":5},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f5f3b5":{"lock":false,"pos":{"x":65,"y":1.2494,"z":-7},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}},"f72800":{"lock":false,"pos":{"x":48,"y":1.2494,"z":23},"rot":{"x":0,"y":270,"z":0},"tint":{"a":1,"b":1,"g":1,"r":1}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 @@ -87,9 +89,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 39.49 - posY: 3.79 - posZ: 41.74 + posX: 51.88 + posY: 3.37 + posZ: -44.26 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 01 Night of the Zealot 56a91d.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 01 Night of the Zealot 56a91d.yaml index 332606875..4793ba093 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 01 Night of the Zealot 56a91d.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 01 Night of the Zealot 56a91d.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: 28.04 + posZ: 35 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich Legacy 38d1cd.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich Legacy 38d1cd.yaml index 605f24251..ff8fe1ba4 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich Legacy 38d1cd.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 02 The Dunwich Legacy 38d1cd.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: 22.04 + posZ: 29 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path to Carcosa 06a742.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path to Carcosa 06a742.yaml index f4613913e..a44b8f381 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path to Carcosa 06a742.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 03 The Path to Carcosa 06a742.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: 16.04 + posZ: 23 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 04 The Forgotten Age d5cd12.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 04 The Forgotten Age d5cd12.yaml index 9a2f197ab..0f38b8901 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 04 The Forgotten Age d5cd12.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 04 The Forgotten Age d5cd12.yaml @@ -53,9 +53,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: 10.04 + posZ: 17 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle Undone 20d53c.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle Undone 20d53c.yaml index 0d4bf8126..b38911d15 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle Undone 20d53c.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 05 The Circle Undone 20d53c.yaml @@ -53,9 +53,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: 4.04 + posZ: 11 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06A The Dream-Quest f03c2d.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06A The Dream-Quest f03c2d.yaml index 324a44a28..1ef61feba 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06A The Dream-Quest f03c2d.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06A The Dream-Quest f03c2d.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -1.96 + posZ: 5 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The Web of Dreams 1bac4d.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The Web of Dreams 1bac4d.yaml index 738ff0b7d..ef98adb3f 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The Web of Dreams 1bac4d.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 06B The Web of Dreams 1bac4d.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -7.96 + posZ: -1 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 07 The Innsmouth Conspiracy f5f3b5.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 07 The Innsmouth Conspiracy f5f3b5.yaml index 9fb74fcfb..e2a31b4d3 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 07 The Innsmouth Conspiracy f5f3b5.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 07 The Innsmouth Conspiracy f5f3b5.yaml @@ -53,9 +53,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -13.96 + posZ: -7 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge of the Earth e32dc3.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge of the Earth e32dc3.yaml index 30a932f4a..2a7abc6dc 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge of the Earth e32dc3.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 08 Edge of the Earth e32dc3.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -19.96 + posZ: -13 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet Keys 11d148.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet Keys 11d148.yaml index a5445075e..3c4b7fd06 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet Keys 11d148.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 09 The Scarlet Keys 11d148.yaml @@ -53,9 +53,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -25.96 + posZ: -19 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast of Hemlock Vale 2e50cf.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast of Hemlock Vale 2e50cf.yaml index 44daf644a..a2a12b8d3 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast of Hemlock Vale 2e50cf.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag 10 The Feast of Hemlock Vale 2e50cf.yaml @@ -67,9 +67,9 @@ ContainedObjects: - CleanUpHelper_ignore Tooltip: true Transform: - posX: 67.349 - posY: 3.037 - posZ: -26.971 + posX: 66.083 + posY: 3.036 + posZ: -28.162 rotX: 0 rotY: 270 rotZ: 0 @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 56.83 + posX: 65 posY: 1.25 - posZ: -31.96 + posZ: -25 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark Matter 3a08d9.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark Matter 3a08d9.yaml index 943f13372..93da4aeb7 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark Matter 3a08d9.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C1 Dark Matter 3a08d9.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 39.83 + posX: 48 posY: 1.25 - posZ: 28.04 + posZ: 35 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice in Wonderland ed1d0c.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice in Wonderland ed1d0c.yaml index ff0214bcb..8e88b514b 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice in Wonderland ed1d0c.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C2 Alice in Wonderland ed1d0c.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 39.83 + posX: 48 posY: 1.25 - posZ: 22.04 + posZ: 29 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C3 Cyclopean Foundations f72800.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C3 Cyclopean Foundations f72800.yaml index 5423d3d54..747afd24c 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C3 Cyclopean Foundations f72800.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag C3 Cyclopean Foundations f72800.yaml @@ -117,9 +117,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 43.49 - posY: 3.18 - posZ: -22.8 + posX: 48 + posY: 1.25 + posZ: 23 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios 8f7e04.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios 8f7e04.yaml index ffe83fd0b..d43dfd023 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios 8f7e04.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios 8f7e04.yaml @@ -65,9 +65,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 48.33 + posX: 56.5 posY: 1.25 - posZ: 4.04 + posZ: 11 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492.yaml new file mode 100644 index 000000000..a0b7f7d3a --- /dev/null +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492.yaml @@ -0,0 +1,66 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +Bag: + Order: 0 +ColorDiffuse: + b: 1 + g: 1 + r: 1 +ContainedObjects: +- !include 'Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 02 Relics + of the Past 8950c7.yaml' +- !include 'Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 01 Laid to + Rest 8994ea.yaml' +CustomMesh: + CastShadows: true + ColliderURL: '' + Convex: true + CustomShader: + FresnelStrength: 0 + SpecularColor: + b: 1 + g: 1 + r: 1 + SpecularIntensity: 0 + SpecularSharpness: 2 + DiffuseURL: https://github.com/Antimarkovnikov/TTS_AHC_CYOA/blob/master/P2%20Challenge%20Scenarios.jpg?raw=true + MaterialIndex: 3 + MeshURL: https://github.com/Antimarkovnikov/TTS_AHC_CYOA/blob/master/Book%20Model.obj?raw=true + NormalURL: '' + TypeIndex: 6 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: dcf492 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MaterialIndex: -1 +MeasureMovement: false +MeshIndex: -1 +Name: Custom_Model_Bag +Nickname: P1 Challenge Scenarios +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 56.5 + posY: 1.25 + posZ: 5 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1 + scaleY: 1 + scaleZ: 1 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 01 Laid to Rest 8994ea.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 01 Laid to Rest 8994ea.yaml new file mode 100644 index 000000000..bebc60c93 --- /dev/null +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 01 Laid to Rest 8994ea.yaml @@ -0,0 +1,47 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomPDF: + PDFPage: 0 + PDFPageOffset: 0 + PDFPassword: '' + PDFUrl: https://github.com/Antimarkovnikov/TTS_AHC_CYOA/blob/master/Dual%20Pages%20P2%2001%20Laid%20to%20Rest.pdf?raw=true +Description: Jim Culver +DragSelectable: true +GMNotes: '' +GUID: 8994ea +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_PDF +Nickname: P2 01 Laid to Rest +Snap: true +Sticky: true +Tags: +- CleanUpHelper_ignore +Tooltip: true +Transform: + posX: 56.65 + posY: 3.04 + posZ: 4.0 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1.76 + scaleY: 1 + scaleZ: 1.76 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 02 Relics of the Past 8950c7.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 02 Relics of the Past 8950c7.yaml new file mode 100644 index 000000000..c0502810b --- /dev/null +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag P1 Challenge Scenarios dcf492/Custom_PDF P2 02 Relics of the Past 8950c7.yaml @@ -0,0 +1,47 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomPDF: + PDFPage: 0 + PDFPageOffset: 0 + PDFPassword: '' + PDFUrl: https://github.com/Antimarkovnikov/TTS_AHC_CYOA/blob/master/Dual%20Pages%20P2%2002%20Relics%20of%20the%20Past.pdf?raw=true +Description: Monteray Jack +DragSelectable: true +GMNotes: '' +GUID: 8950c7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_PDF +Nickname: P2 02 Relics of the Past +Snap: true +Sticky: true +Tags: +- CleanUpHelper_ignore +Tooltip: true +Transform: + posX: 55.59 + posY: 3.04 + posZ: 3.22 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1.76 + scaleY: 1 + scaleZ: 1.76 +Value: 0 +XmlUI: '' diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones 2016-2020 e227ad.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones 2016-2020 e227ad.yaml index 1f7860197..b205dbd47 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones 2016-2020 e227ad.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S1 Stand-Alones 2016-2020 e227ad.yaml @@ -63,9 +63,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 48.33 + posX: 56.5 posY: 1.25 - posZ: 28.04 + posZ: 35 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones 2020-202 4c47d8.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones 2020-202 4c47d8.yaml index 6624b0c39..96a99828b 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones 2020-202 4c47d8.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Custom_Model_Bag S2 Stand-Alones 2020-202 4c47d8.yaml @@ -57,9 +57,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 48.33 + posX: 56.5 posY: 1.25 - posZ: 22.04 + posZ: 29 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions 2275ed.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions 2275ed.yaml index 0e343966d..5df6f993d 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions 2275ed.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Return to Expansions 2275ed.yaml @@ -31,9 +31,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 41.83 + posX: 50 posY: 1.57 - posZ: -32.96 + posZ: -26 rotX: 0 rotY: 90 rotZ: 0 diff --git a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New Versions a1b358.yaml b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New Versions a1b358.yaml index 577cba6f9..2375483be 100644 --- a/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New Versions a1b358.yaml +++ b/unpacked/Bag OptionPanel Source 830bd0/Custom_Model_Bag CYOA Campaign Guides e87ea2/Notecard Updating to New Versions a1b358.yaml @@ -7,14 +7,10 @@ ColorDiffuse: b: 1 g: 1 r: 1 -Description: 'To Update to the latest version of my campaign guides and their respective - covers. On windows go to... - - C:\Users\[USERNAME]\Documents\My Games\Tabletop Simulator\Mods - - And search for ANTIMARKOVNIKOV. - - Delete all files find with that in the filename and reload the MOD.' +Description: "To Update to the latest version of my campaign guides and their respective + covers. On windows go to...\r\nC:\\Users\\[USERNAME]\\Documents\\My Games\\Tabletop + Simulator\\Mods\\PDF\r\nAnd search for httpsgithubcomAntimarkovnikov and delete + all files find with that in the filename and reload the MOD." DragSelectable: true GMNotes: '' GUID: a1b358 @@ -34,9 +30,9 @@ Snap: true Sticky: true Tooltip: true Transform: - posX: 35.83 + posX: 44 posY: 1.57 - posZ: -32.96 + posZ: -26 rotX: 0 rotY: 90 rotZ: 0 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 7959489dc..d18b081d8 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,74 @@ 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("accessories/HandHelper") end) @@ -166,6 +234,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -260,6 +329,26 @@ do 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) @@ -345,6 +434,15 @@ do 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 @@ -354,6 +452,22 @@ do 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) @@ -364,7 +478,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -420,6 +534,18 @@ do 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) 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 7de394745..1ba1e0adc 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 @@ -68,6 +68,18 @@ do 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) @@ -75,6 +87,7 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("accessories/SearchAssistant") end) __bundle_register("accessories/SearchAssistant", function(require, _LOADED, __bundle_register, __bundle_modules) +local searchLib = require("util/SearchLib") local playmatApi = require("playermat/PlaymatApi") -- forward declaration of variables that are used across functions @@ -236,17 +249,12 @@ function endSearch(_, _, isRightClick) end -- draw set aside cards (from the ground!) - for _, v in ipairs(searchArea(setAsidePosition)) do - local obj = v.hit_object + for _, obj in ipairs(searchLib.atPosition(setAsidePosition, "isCardOrDeck")) do if obj.type == "Deck" then - Wait.time(function() - obj.deal(#obj.getObjects(), handColor) - end, 1) - break + Wait.time(function() obj.deal(#obj.getObjects(), handColor) end, 1) elseif obj.type == "Card" then obj.setPosition(Player[handColor].getHandTransform().position) obj.flip() - break end end @@ -267,22 +275,12 @@ function endSearch(_, _, isRightClick) Wait.time(function() playmatApi.flipTopCardFromDeck(matColor) end, #handCards * 0.1) end end - --- utility function -function searchArea(position) - return Physics.cast({ - origin = position, - direction = { 0, 1, 0 }, - type = 3, - size = { 2, 2, 2 }, - max_distance = 0 - }) -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 @@ -377,6 +375,26 @@ do 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) @@ -462,6 +480,15 @@ do 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 @@ -471,6 +498,22 @@ do 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) @@ -481,7 +524,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -510,4 +553,72 @@ do 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") \ 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 6a3c722f4..9fa6e42fd 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,60 @@ 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("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -90,6 +144,16 @@ do 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) @@ -98,7 +162,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -215,8 +279,73 @@ do return TokenSpawnTracker end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("accessories/CleanUpHelper") +__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("accessories/CleanUpHelper", function(require, _LOADED, __bundle_register, __bundle_modules) --[[ Cleans up the table for the next scenario in a campaign: @@ -229,6 +358,7 @@ local chaosBagApi = require("chaosbag/ChaosBagApi") local guidReferenceApi = require("core/GUIDReferenceApi") local playAreaApi = require("core/PlayAreaApi") local playmatApi = require("playermat/PlaymatApi") +local searchLib = require("util/SearchLib") local soundCubeApi = require("core/SoundCubeApi") local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") @@ -341,7 +471,6 @@ function cleanUp(_, color) blessCurseManagerApi.removeAll(color) removeLines() discardHands() - tokenSpawnTrackerApi.resetAll() chaosBagApi.returnChaosTokens() chaosBagApi.releaseAllSealedTokens(color) @@ -465,6 +594,9 @@ function tidyPlayareaCoroutine() local trash = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") local playAreaZone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone") + -- reset the playarea image by not providing an image + playAreaApi.updateSurface() + if playAreaZone == nil then printToAll("Scripting zone for main play area could not be found!", "Red") elseif trash == nil then @@ -498,14 +630,15 @@ function tidyPlayerMatCoroutine() local trash = guidReferenceApi.getObjectByOwnerAndType(COLORS[i], "Trash") if trash == nil then printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found!", "Red") - return 1 + break end local objList if i < 5 then objList = playmatApi.searchAroundPlaymat(COLORS[i]) else - objList = searchMythosArea() + -- Victory Display + Mythos Area + objList = searchLib.inArea({ -2, 2, 10 }, { 0, 270, 0 }, { 55, 1, 13.5 }) end for _, obj in ipairs(objList) do @@ -534,6 +667,8 @@ function tidyPlayerMatCoroutine() end end + -- reset spawned data + tokenSpawnTrackerApi.resetAll() local datahelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") if datahelper then datahelper.setTable("SPAWNED_PLAYER_CARD_GUIDS", {}) @@ -542,77 +677,6 @@ function tidyPlayerMatCoroutine() printToAll("Clean up completed!", "Green") return 1 end - ---------------------------------------------------------- --- helper functions ---------------------------------------------------------- - --- find objects in the mythos area -function searchMythosArea() - local searchResult = Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 1, - type = 3, - size = { 55, 1, 13.5 }, - origin = { -2, 2, 10 }, - orientation = { 0, 270, 0 }, - debug = false - }) - - local objList = {} - for _, v in ipairs(searchResult) do - table.insert(objList, v.hit_object) - end - return objList -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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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 @@ -642,7 +706,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -661,6 +725,12 @@ do 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) @@ -677,8 +747,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -717,6 +787,18 @@ do 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) @@ -724,6 +806,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -818,6 +901,26 @@ do 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) @@ -903,6 +1006,15 @@ do 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 @@ -912,6 +1024,22 @@ do 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) @@ -922,7 +1050,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -951,4 +1079,7 @@ do return PlaymatApi end end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("accessories/CleanUpHelper") +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 ea6275c64..8684d0080 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 @@ -139,6 +139,16 @@ do 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) @@ -147,7 +157,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -229,6 +239,18 @@ do 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) 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 3538c6eed..062d23b47 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 @@ -59,9 +59,9 @@ ContainedObjects: = 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\", - function(require, _LOADED, __bundle_register, __bundle_modules)\nlocal fontColor\nlocal - BACKGROUNDS = {\n {\n title = \"Ancestral Knowledge\",\n url = - \"http://cloud-3.steamusercontent.com/ugc/1915746489207287888/2F9F6F211ED0F98E66C9D35D93221E4C7FB6DD3C/\",\n + 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 @@ -104,28 +104,25 @@ ContainedObjects: BACKGROUNDS[i].url == customInfo.diffuse then\n return BACKGROUNDS[i].fontcolor\n \ end\n end\n return { 1, 1, 1 }\nend\n\n-- attempt to load image from below card when dropped\nfunction onDrop(playerColor)\n local pos = self.getPosition():setAt(\"y\", - 2)\n local search = Physics.cast({\n direction = { 0, -1, 0 },\n max_distance - = 2,\n type = 3,\n size = { 0.1, 0.1, 0.1 },\n origin - \ = pos\n })\n\n local syncName\n for _, v in ipairs(search) do\n if - v.hit_object.tag == \"Card\" then\n syncName = v.hit_object.getName()\n break\n - \ end\n end\n\n if not syncName then return end\n\n -- remove level information - fron 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 + 2)\n local searchResult = searchLib.belowPosition(pos, \"isCard\")\n if #searchResult + == 0 then return end\n local syncName = searchResult[1].getName()\n\n -- remove + 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 \ 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.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.tag == \"Deck\" then\n takeDeckOut(object.getGUID(), - self.getPosition() + Vector(0, 0.1, 0))\n elseif object.tag ~= \"Card\" then\n + 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 @@ -176,7 +173,37 @@ ContainedObjects: 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)\nreturn __bundle_require(\"__root\")" + 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 + __bundle_require(\"__root\")" LuaScriptState: '[[],true,true]' MaterialIndex: -1 MeasureMovement: false diff --git a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card Justice · XI c4282a.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card Justice · XI c4282a.ttslua index 8fddee22b..85990f2b9 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card Justice · XI c4282a.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card Justice · XI c4282a.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/Tarotcard") +end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -65,7 +68,4 @@ 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 Chariot · VII f633db.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Chariot · VII f633db.ttslua index 8fddee22b..85990f2b9 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Chariot · VII f633db.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Chariot · VII f633db.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/Tarotcard") +end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -65,7 +68,4 @@ 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 Star · XVII 37153b.ttslua b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Star · XVII 37153b.ttslua index 8fddee22b..85990f2b9 100644 --- a/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Star · XVII 37153b.ttslua +++ b/unpacked/Bag Tarot Deck (Scripted) a230f9/Card The Star · XVII 37153b.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/Tarotcard") +end) __bundle_register("playercards/Tarotcard", function(require, _LOADED, __bundle_register, __bundle_modules) -- context menu to manually fix rotation function onLoad() @@ -65,7 +68,4 @@ 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/BlockSquare Physics Detector b300d8.ttslua b/unpacked/BlockSquare Physics Detector b300d8.ttslua new file mode 100644 index 000000000..f3b2050d7 --- /dev/null +++ b/unpacked/BlockSquare Physics Detector b300d8.ttslua @@ -0,0 +1,56 @@ +-- 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("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("core/PhysicsDetector") +end) +__bundle_register("core/PhysicsDetector", function(require, _LOADED, __bundle_register, __bundle_modules) +-- will notify the user to enable physics if it appears to not be fully enabled + +-- this event should only fire if physics aren't fully enabled +function onCollisionExit() + broadcastToAll("Physics disabled? Check chat log", "Orange") + printToAll("It seems like you don't have 'Physics' fully enabled. From the top menu bar, open Options > Physics and select 'Full' to experience this mod with all features.") +end +end) +return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/BlockSquare Physics Detector b300d8.yaml b/unpacked/BlockSquare Physics Detector b300d8.yaml new file mode 100644 index 000000000..bec61782e --- /dev/null +++ b/unpacked/BlockSquare Physics Detector b300d8.yaml @@ -0,0 +1,40 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 0 + g: 0 + r: 0.92647 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b300d8 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: !include 'BlockSquare Physics Detector b300d8.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: BlockSquare +Nickname: Physics Detector +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.65 + posZ: 16 + rotX: 0 + rotY: 0 + 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 2ceb4a8ba..28286e4a6 100644 --- a/unpacked/Checker_white Configuration 03804b.ttslua +++ b/unpacked/Checker_white Configuration 03804b.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("arkhamdb/Configuration") -end) __bundle_register("arkhamdb/Configuration", function(require, _LOADED, __bundle_register, __bundle_modules) ---@type ArkhamImportConfiguration configuration = { @@ -55,4 +52,7 @@ configuration = { card_bag_guid = "15bb07" } end) +__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) +require("arkhamdb/Configuration") +end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua b/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua index 5b5254590..a37f9f7a4 100644 --- a/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua +++ b/unpacked/Checker_white Token Spawn Tool 36b4ee.ttslua @@ -41,166 +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 - - 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 = {} - 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 - - -- 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 matchTypes 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 = {} @@ -241,6 +81,7 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund 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" @@ -274,19 +115,10 @@ function onScriptingButtonDown(index, playerColor) -- check for subtype of resource based on card below if tokenType == "resource" then - local search = Physics.cast({ - direction = { 0, -1, 0 }, - max_distance = 2, - type = 3, - size = { 0.1, 0.1, 0.1 }, - origin = position:setAt("y", 2) - }) - - for _, v in ipairs(search) do - if v.hit_object.tag == "Card" and not v.hit_object.is_face_down then - local metadata = JSON.decode(v.hit_object.getGMNotes()) or {} + 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 @@ -334,6 +166,7 @@ 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 = { @@ -488,7 +321,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -530,7 +363,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -739,7 +572,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -819,12 +652,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -856,22 +687,257 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - end - 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 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/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 = {} + 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) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Chinese_Checkers_Piece Flex Table Control bd69bd.ttslua b/unpacked/Chinese_Checkers_Piece Flex Table Control bd69bd.ttslua index fc8cf0a17..ac87661fe 100644 --- a/unpacked/Chinese_Checkers_Piece Flex Table Control bd69bd.ttslua +++ b/unpacked/Chinese_Checkers_Piece Flex Table Control bd69bd.ttslua @@ -509,4 +509,4 @@ ref_playerColor = { } --Dummy function, absorbs unwanted triggers -function none() end \ No newline at end of file +function none() end \ No newline at end of file diff --git a/unpacked/Custom_Model Baldur's Gate III 695abd.ttslua b/unpacked/Custom_Model Baldur's Gate III 695abd.ttslua index e6f67c6af..3c2a044ca 100644 --- a/unpacked/Custom_Model Baldur's Gate III 695abd.ttslua +++ b/unpacked/Custom_Model Baldur's Gate III 695abd.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 Clue Counter 032300.ttslua b/unpacked/Custom_Model Clue Counter 032300.ttslua index 1380b391c..9d8fa92e8 100644 --- a/unpacked/Custom_Model Clue Counter 032300.ttslua +++ b/unpacked/Custom_Model Clue Counter 032300.ttslua @@ -41,16 +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("playermat/ClueCounter") +end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) --- Table of items which can be counted in this Bowl --- Each entry has 2 things to enter --- a name (what is in the name field of that object) --- a value (how much it is worth) --- a number in the items description will override the number entry in this table -local validCountItemList = { - ["Clue"] = 1, - [""] = 1 -} +local searchLib = require("util/SearchLib") exposedValue = 0 function onLoad() @@ -64,54 +59,95 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1, -1) + loopID = Wait.time(countItems, 1.5, -1) end -- Activated once per second, counts items in bowls function countItems() local totalValue = 0 - for _, item in ipairs(findValidItemsInSphere()) do - local descValue = tonumber(item.getDescription()) - local stackMult = math.abs(item.getQuantity()) - -- Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - -- Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[item.getName()] * stackMult - end + for _, item in ipairs(getClues()) do + totalValue = totalValue + math.abs(item.getQuantity()) end exposedValue = totalValue self.editButton({ index = 0, label = totalValue }) end -function findValidItemsInSphere() - local items = Physics.cast({ - origin = self.getPosition(), - direction = { 0, 1, 0 }, - type = 2, - max_distance = 0, - size = { 2, 2, 2 } - }) - - local validItemList = {} - for _, entry in ipairs(items) do - if entry.hit_object ~= self then - if validCountItemList[entry.hit_object.getName()] ~= nil then - table.insert(validItemList, entry.hit_object) - end - end - end - return validItemList -end - function removeAllClues(trash) - for _, obj in ipairs(findValidItemsInSphere()) do + for _, obj in ipairs(getClues()) do trash.putObject(obj) end end + +function getClues() + return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") +end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/ClueCounter") +__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 Clue Counter 1769ed.ttslua b/unpacked/Custom_Model Clue Counter 1769ed.ttslua index 5a28bcc23..9d8fa92e8 100644 --- a/unpacked/Custom_Model Clue Counter 1769ed.ttslua +++ b/unpacked/Custom_Model Clue Counter 1769ed.ttslua @@ -45,15 +45,7 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) --- Table of items which can be counted in this Bowl --- Each entry has 2 things to enter --- a name (what is in the name field of that object) --- a value (how much it is worth) --- a number in the items description will override the number entry in this table -local validCountItemList = { - ["Clue"] = 1, - [""] = 1 -} +local searchLib = require("util/SearchLib") exposedValue = 0 function onLoad() @@ -67,51 +59,95 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1, -1) + loopID = Wait.time(countItems, 1.5, -1) end -- Activated once per second, counts items in bowls function countItems() local totalValue = 0 - for _, item in ipairs(findValidItemsInSphere()) do - local descValue = tonumber(item.getDescription()) - local stackMult = math.abs(item.getQuantity()) - -- Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - -- Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[item.getName()] * stackMult - end + for _, item in ipairs(getClues()) do + totalValue = totalValue + math.abs(item.getQuantity()) end exposedValue = totalValue self.editButton({ index = 0, label = totalValue }) end -function findValidItemsInSphere() - local items = Physics.cast({ - origin = self.getPosition(), - direction = { 0, 1, 0 }, - type = 2, - max_distance = 0, - size = { 2, 2, 2 } - }) - - local validItemList = {} - for _, entry in ipairs(items) do - if entry.hit_object ~= self then - if validCountItemList[entry.hit_object.getName()] ~= nil then - table.insert(validItemList, entry.hit_object) - end - end - end - return validItemList -end - function removeAllClues(trash) - for _, obj in ipairs(findValidItemsInSphere()) do + for _, obj in ipairs(getClues()) do trash.putObject(obj) end end + +function getClues() + return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") +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 Clue Counter 37be78.ttslua b/unpacked/Custom_Model Clue Counter 37be78.ttslua index 5a28bcc23..9d8fa92e8 100644 --- a/unpacked/Custom_Model Clue Counter 37be78.ttslua +++ b/unpacked/Custom_Model Clue Counter 37be78.ttslua @@ -45,15 +45,7 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/ClueCounter") end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) --- Table of items which can be counted in this Bowl --- Each entry has 2 things to enter --- a name (what is in the name field of that object) --- a value (how much it is worth) --- a number in the items description will override the number entry in this table -local validCountItemList = { - ["Clue"] = 1, - [""] = 1 -} +local searchLib = require("util/SearchLib") exposedValue = 0 function onLoad() @@ -67,51 +59,95 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1, -1) + loopID = Wait.time(countItems, 1.5, -1) end -- Activated once per second, counts items in bowls function countItems() local totalValue = 0 - for _, item in ipairs(findValidItemsInSphere()) do - local descValue = tonumber(item.getDescription()) - local stackMult = math.abs(item.getQuantity()) - -- Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - -- Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[item.getName()] * stackMult - end + for _, item in ipairs(getClues()) do + totalValue = totalValue + math.abs(item.getQuantity()) end exposedValue = totalValue self.editButton({ index = 0, label = totalValue }) end -function findValidItemsInSphere() - local items = Physics.cast({ - origin = self.getPosition(), - direction = { 0, 1, 0 }, - type = 2, - max_distance = 0, - size = { 2, 2, 2 } - }) - - local validItemList = {} - for _, entry in ipairs(items) do - if entry.hit_object ~= self then - if validCountItemList[entry.hit_object.getName()] ~= nil then - table.insert(validItemList, entry.hit_object) - end - end - end - return validItemList -end - function removeAllClues(trash) - for _, obj in ipairs(findValidItemsInSphere()) do + for _, obj in ipairs(getClues()) do trash.putObject(obj) end end + +function getClues() + return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") +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 Clue Counter d86b7c.ttslua b/unpacked/Custom_Model Clue Counter d86b7c.ttslua index 1380b391c..9d8fa92e8 100644 --- a/unpacked/Custom_Model Clue Counter d86b7c.ttslua +++ b/unpacked/Custom_Model Clue Counter d86b7c.ttslua @@ -41,16 +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("playermat/ClueCounter") +end) __bundle_register("playermat/ClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) --- Table of items which can be counted in this Bowl --- Each entry has 2 things to enter --- a name (what is in the name field of that object) --- a value (how much it is worth) --- a number in the items description will override the number entry in this table -local validCountItemList = { - ["Clue"] = 1, - [""] = 1 -} +local searchLib = require("util/SearchLib") exposedValue = 0 function onLoad() @@ -64,54 +59,95 @@ function onLoad() font_color = { 0, 0, 0 }, font_size = 2000 }) - loopID = Wait.time(countItems, 1, -1) + loopID = Wait.time(countItems, 1.5, -1) end -- Activated once per second, counts items in bowls function countItems() local totalValue = 0 - for _, item in ipairs(findValidItemsInSphere()) do - local descValue = tonumber(item.getDescription()) - local stackMult = math.abs(item.getQuantity()) - -- Use value in description if available - if descValue ~= nil then - totalValue = totalValue + descValue * stackMult - else - -- Otherwise use the value in validCountItemList - totalValue = totalValue + validCountItemList[item.getName()] * stackMult - end + for _, item in ipairs(getClues()) do + totalValue = totalValue + math.abs(item.getQuantity()) end exposedValue = totalValue self.editButton({ index = 0, label = totalValue }) end -function findValidItemsInSphere() - local items = Physics.cast({ - origin = self.getPosition(), - direction = { 0, 1, 0 }, - type = 2, - max_distance = 0, - size = { 2, 2, 2 } - }) - - local validItemList = {} - for _, entry in ipairs(items) do - if entry.hit_object ~= self then - if validCountItemList[entry.hit_object.getName()] ~= nil then - table.insert(validItemList, entry.hit_object) - end - end - end - return validItemList -end - function removeAllClues(trash) - for _, obj in ipairs(findValidItemsInSphere()) do + for _, obj in ipairs(getClues()) do trash.putObject(obj) end end + +function getClues() + return searchLib.inArea(self.getPosition(), self.getRotation(), { 2, 1, 2 }, "isClue") +end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("playermat/ClueCounter") +__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 Encounter Sets 304ffc.ttslua b/unpacked/Custom_Model Encounter Sets 304ffc.ttslua index b9201580b..829a7e2ce 100644 --- a/unpacked/Custom_Model Encounter Sets 304ffc.ttslua +++ b/unpacked/Custom_Model Encounter Sets 304ffc.ttslua @@ -4,4 +4,4 @@ end function download() Global.call('placeholder_download', { url = self.getGMNotes(), replace = self.guid }) -end \ No newline at end of file +end \ No newline at end of file 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 3c2a044ca..e6f67c6af 100644 --- a/unpacked/Custom_Model Return to The Circle Undone 757324.ttslua +++ b/unpacked/Custom_Model Return to The Circle Undone 757324.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 Return to The Circle Undone 757324.yaml b/unpacked/Custom_Model Return to The Circle Undone 757324.yaml index 89bf5fea6..0ee346163 100644 --- a/unpacked/Custom_Model Return to The Circle Undone 757324.yaml +++ b/unpacked/Custom_Model Return to The Circle Undone 757324.yaml @@ -22,7 +22,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1697277388086852852/6FD56D74FDDDA5626A3B72E788993EC651AD25E1/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 0 Description: '' 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 5ba630028..dc35fc816 100644 --- a/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml +++ b/unpacked/Custom_Model Return to The Dunwich Legacy ce9130.yaml @@ -22,7 +22,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/762723517667592476/36D86649503A49A36AA97B7B72C6150E4C2BE333/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 0 Description: '' 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 7a73d9f5c..7731d9efd 100644 --- a/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml +++ b/unpacked/Custom_Model Return to The Forgotten Age 479ff3.yaml @@ -22,7 +22,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1474319121423613924/490D56D20C6AE0547D67D942513396E8D0584A4A/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 0 Description: '' 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 3c2a044ca..e6f67c6af 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,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 Return to The Path to Carcosa e9889a.yaml b/unpacked/Custom_Model Return to The Path to Carcosa e9889a.yaml index c27cebb9b..e36b192ee 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 @@ -22,7 +22,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/762723517667556656/9638E8CE7F209B50634B202C9EF4B0BDB4993BBB/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 0 Description: '' 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 289c68999..264689ce5 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 @@ -22,7 +22,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/762723517667598054/18C06F0F20D9D4651E6736FB609E2D41F4D1964E/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 0 Description: '' diff --git a/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml b/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml deleted file mode 100644 index ee6340511..000000000 --- a/unpacked/Custom_Model_Bag Bless tokens afa06b.yaml +++ /dev/null @@ -1,75 +0,0 @@ -AltLookAngle: - x: 0 - y: 0 - z: 0 -Autoraise: true -Bag: - Order: 0 -ColorDiffuse: - b: 1 - g: 1 - r: 1 -ContainedObjects: -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml' -- !include 'Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.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/1655601092778623873/C9EF4B44CE708DFC5A804FF2912C9F9B47323287/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: afa06b -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -LayoutGroupSortIndex: 0 -Locked: true -LuaScript: '' -LuaScriptState: '' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Bless tokens -Snap: true -Sticky: true -Tags: -- CleanUpHelper_ignore -- displacement_excluded -Tooltip: true -Transform: - posX: 2.84 - posY: 1.64 - posZ: -11.24 - rotX: 0 - rotY: 225 - rotZ: 0 - scaleX: 0.7 - scaleY: 0.7 - scaleZ: 0.7 -Value: 0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml b/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml deleted file mode 100644 index 6c3d99570..000000000 --- a/unpacked/Custom_Model_Bag Curse tokens bd0253.yaml +++ /dev/null @@ -1,75 +0,0 @@ -AltLookAngle: - x: 0 - y: 0 - z: 0 -Autoraise: true -Bag: - Order: 0 -ColorDiffuse: - b: 1 - g: 1 - r: 1 -ContainedObjects: -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml' -- !include 'Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.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/1655601092778633181/7A00AF905BCD6EB5D866F2107CECBC0A49E360F7/ - MaterialIndex: 3 - MeshURL: https://pastebin.com/raw/ALrYhQGb - NormalURL: '' - TypeIndex: 6 -Description: '' -DragSelectable: true -GMNotes: '' -GUID: bd0253 -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -LayoutGroupSortIndex: 0 -Locked: true -LuaScript: '' -LuaScriptState: '' -MaterialIndex: -1 -MeasureMovement: false -MeshIndex: -1 -Name: Custom_Model_Bag -Nickname: Curse tokens -Snap: true -Sticky: true -Tags: -- CleanUpHelper_ignore -- displacement_excluded -Tooltip: true -Transform: - posX: 4.05 - posY: 1.64 - posZ: -12.45 - rotX: 0 - rotY: 225 - rotZ: 0 - scaleX: 0.7 - scaleY: 0.7 - scaleZ: 0.7 -Value: 0 -XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38.yaml b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38.yaml index 47724072a..a89ec0cf5 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38.yaml +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38.yaml @@ -28,8 +28,6 @@ ContainedObjects: Market Helper 3650ea.yaml' - !include 'Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Subject 5U-21 Helper 1335e8.yaml' -- !include 'Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider - a758b2.yaml' - !include 'Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Auto-fail Counter a9a321.yaml' - !include 'Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Elder Sign Counter 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 594fad6e7..03d73b388 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 @@ -45,7 +45,9 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("accessories/UnderworldMarketHelper") end) __bundle_register("accessories/UnderworldMarketHelper", function(require, _LOADED, __bundle_register, __bundle_modules) -function onload(saved_data) +local searchLib = require("util/SearchLib") + +function onload(savedData) revealCardPositions = { Vector(3.5, 0.25, 0), Vector(-3.5, 0.25, 0) @@ -75,8 +77,8 @@ function onload(saved_data) self.addContextMenuItem('Reset helper', resetHelper) - if saved_data != '' then - local loaded_data = JSON.decode(saved_data) + if savedData ~= '' then + local loaded_data = JSON.decode(savedData) hiddenCards = loaded_data.saved_hiddenCards isSetup = true @@ -223,17 +225,8 @@ function getRevealedCards() local revealedCards = {} for _, pos in ipairs(revealCardPositions) do - local hitList = Physics.cast({ - origin = self.positionToWorld(pos) + Vector(0, 0.25, 0), - direction = {0,-1,0}, - type = 1, - max_distance = 2 - }) - - for _, hit in ipairs(hitList) do - if hit.hit_object != self and hit.hit_object.tag == "Card" then - table.insert(revealedCards, hit.hit_object.getGUID()) - end + for _, obj in ipairs(searchLib.atPosition(self.positionToWorld(pos), "isCard")) do + table.insert(revealedCards, obj.getGUID()) end end @@ -330,4 +323,72 @@ function resetHelper() print('Underworld Market Helper: Helper has been reset.') 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 Fan-Made Accessories aa8b38/Custom_Tile Descriptive Phase Tracker b171c8.ttslua b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Descriptive Phase Tracker b171c8.ttslua index 00fc3ccaf..8deb6db87 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Descriptive Phase Tracker b171c8.ttslua +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Descriptive Phase Tracker b171c8.ttslua @@ -11,4 +11,4 @@ end function toPhaseTwo() self.setState(2) -end \ No newline at end of file +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.ttslua b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.ttslua index 10ef1c235..b7009949d 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.ttslua +++ b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile Generic Difficulty Selector 8112ff.ttslua @@ -35,4 +35,4 @@ end function clickFun(difficulty) Global.call("setChaosBagState", tokenData[difficulty]) -end \ No newline at end of file +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.ttslua b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.ttslua deleted file mode 100644 index 1c5bf9663..000000000 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.ttslua +++ /dev/null @@ -1,120 +0,0 @@ --- 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("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("accessories/PlayermatHider") -end) -__bundle_register("accessories/PlayermatHider", function(require, _LOADED, __bundle_register, __bundle_modules) -local guidReferenceApi = require("core/GUIDReferenceApi") -local objects - -function onClick_hideShow(player, matColor) - objects = guidReferenceApi.getObjectsByOwner(matColor) - local actionTokens = searchMat(objects.Playermat.positionToWorld({-1.1, 0.05, -0.27}), {4, 1, 1}, isActionToken) - local pos = objects.Playermat.getPosition() - local mod = (pos.y > 0) and -2 or 2 - - -- move all objects - for _, obj in pairs(objects) do - obj.setPosition(obj.getPosition() + Vector(0, mod, 0)) - end - - -- move action tokens - for _, obj in ipairs(actionTokens) do - obj.setLock(pos.y > 0) - obj.setPosition(obj.getPosition() + Vector(0, mod, 0)) - end -end - -function isActionToken(x) return x.getDescription() == 'Action Token' end - -function searchMat(origin, size, filter) - local searchResult = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = objects.Playermat.getRotation(), - type = 3, - size = size, - max_distance = 0 - }) - - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or (filter and filter(v.hit_object)) then - table.insert(objList, v.hit_object) - end - end - return objList -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 - - return GUIDReferenceApi -end -end) -return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.xml b/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.xml deleted file mode 100644 index c4343b67a..000000000 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - Playermat 2 (Orange) - - - - - - - - - - Playermat 3 (Green) - - - - - - - - - - Playermat 4 (Red) - - - - - - - - - \ No newline at end of file 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 899f199f3..c232d1851 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 @@ -45,6 +45,8 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("accessories/Subject5U-21Helper") end) __bundle_register("accessories/Subject5U-21Helper", function(require, _LOADED, __bundle_register, __bundle_modules) +local searchLib = require("util/SearchLib") + local classOrder = { "Guardian", "Seeker", @@ -122,17 +124,8 @@ function updateDisplayButtons(_, playerColor) end function getNotesFromCardsAndContainers() - local search = Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0, - type = 3, - size = self.getBounds().size:setAt("y", 1), - origin = self.getPosition() + Vector(0, 0.5, 0), - }) - local notesList = {} - for _, hit in ipairs(search) do - local obj = hit.hit_object + for _, obj in ipairs(searchLib.onObject(self)) do local notes = {} if obj.type == "Card" then notes = JSON.decode(obj.getGMNotes()) or {} @@ -153,4 +146,72 @@ 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 360864a47..5ac8e0188 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Ally. Detective. Police. DragSelectable: true -GMNotes: "{\r\n \"id\": \"b5151\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Ally. Detective. Police.\",\r\n - \ \"intellectIcons\": 1,\r\n \"combatIcons\": 1,\r\n \"cycle\": \"Beta\"\r\n}\r" +GMNotes: "{\n \"id\": \"b5151\",\n \"type\": \"Asset\",\n \"class\": \"Guardian\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Ally. Detective. Police.\",\n \"intellectIcons\": + 1,\n \"combatIcons\": 1,\n \"cycle\": \"Beta\"\n}" GUID: 94f23b Grid: true GridProjection: false 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 d873f709e..3cb67ba72 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: Item. Weapon. Melee. DragSelectable: true -GMNotes: "{\r\n \"id\": \"b8060\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Guardian|Mystic\",\r\n - \ \"cost\": 3,\r\n \"level\": 3,\r\n \"traits\": \"Item. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"willpowerIcons\": 1,\r\n \"cycle\": \"Beta\"\r\n}\r" +GMNotes: "{\n \"id\": \"b8060\",\n \"type\": \"Asset\",\n \"class\": \"Guardian|Mystic\",\n + \ \"cost\": 3,\n \"level\": 3,\n \"traits\": \"Item. Weapon. Melee.\",\n \"combatIcons\": + 1,\n \"willpowerIcons\": 1,\n \"cycle\": \"Beta\"\n}" GUID: a20aef Grid: true GridProjection: false 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 fa9d53aa3..7e1e52e21 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"B2023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Neutral\",\r\n - \ \"cost\": 1,\r\n \"level\": 3,\r\n \"traits\": \"Item. Clothing.\",\r\n \"agilityIcons\": - 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"B2023\",\n \"type\": \"Asset\",\n \"class\": \"Neutral\",\n + \ \"cost\": 1,\n \"level\": 3,\n \"traits\": \"Item. Clothing.\",\n \"agilityIcons\": + 1,\n \"cycle\": \"Standalone\"\n}" GUID: 5cb973 Grid: true GridProjection: false 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 8e6b43461..f6b349a90 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 @@ -19,9 +19,9 @@ CustomDeck: UniqueBack: false Description: '' DragSelectable: true -GMNotes: "{\r\n \"id\": \"A2023\",\r\n \"type\": \"Asset\",\r\n \"class\": \"Mystic\",\r\n - \ \"cost\": 2,\r\n \"level\": 2,\r\n \"traits\": \"Item. Relic. Weapon. Melee.\",\r\n - \ \"combatIcons\": 1,\r\n \"cycle\": \"Standalone\"\r\n}\r" +GMNotes: "{\n \"id\": \"A2023\",\n \"type\": \"Asset\",\n \"class\": \"Mystic\",\n + \ \"cost\": 2,\n \"level\": 2,\n \"traits\": \"Item. Relic. Weapon. Melee.\",\n + \ \"combatIcons\": 1,\n \"cycle\": \"Standalone\"\n}" GUID: 9c32e2 Grid: true GridProjection: false diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua index 5e3a3f62d..7ba1823d7 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.ttslua @@ -501,4 +501,4 @@ end 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 +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 index d6580fef7..137c45d35 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8.yaml @@ -28,7 +28,7 @@ CustomMesh: SpecularSharpness: 2 DiffuseURL: http://cloud-3.steamusercontent.com/ugc/1758068588410895356/0B5F0CCD29DEC12514840D7B9CD2329B635A79A6/ MaterialIndex: 3 - MeshURL: http://pastebin.com/raw.php?i=uWAmuNZ2 + MeshURL: http://cloud-3.steamusercontent.com/ugc/2278324073260846176/33EFCAF30567F8756F665BE5A2A6502E9C61C7F7/ NormalURL: '' TypeIndex: 6 Description: '' @@ -43,7 +43,7 @@ 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}}}}\r" +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 diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua index 7a8c1b8c9..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.ttslua @@ -500,4 +500,4 @@ end 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 +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml index 7b625a4ee..72096618b 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801.yaml @@ -10,15 +10,17 @@ ColorDiffuse: g: 1 r: 1 ContainedObjects: -- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing - 72ab92.yaml' -- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml' -- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml' -- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest - e2dd57.yaml' -- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the + Past 0d6da1.yaml' - !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Red Tide Rising 5302f2.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Read or Die 9e73fa.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Laid to Rest + e2dd57.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model By the Book cc7eb3.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Bad Blood 451eaa.yaml' +- !include 'Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model All or Nothing + 72ab92.yaml' CustomMesh: CastShadows: true ColliderURL: '' @@ -48,7 +50,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false LuaScript: !include 'Custom_Model_Bag Challenge Scenarios 9f6801.ttslua' -LuaScriptState: '{"ml":{"451eaa":{"lock":false,"pos":{"x":12.252,"y":1.4815,"z":11.986},"rot":{"x":0,"y":269.9999,"z":0}},"5302f2":{"lock":false,"pos":{"x":12.2505,"y":1.4815,"z":-20.0137},"rot":{"x":0,"y":270.0014,"z":0}},"72ab92":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":19.986},"rot":{"x":0,"y":269.9999,"z":0}},"9e73fa":{"lock":false,"pos":{"x":12.2501,"y":1.4815,"z":-12.0137},"rot":{"x":0,"y":269.9998,"z":0}},"cc7eb3":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":3.986},"rot":{"x":0,"y":269.9999,"z":0}},"e2dd57":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-4.014},"rot":{"x":0,"y":270,"z":0}}}}' +LuaScriptState: '{"ml":{"0d6da1":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-28.014},"rot":{"x":0,"y":270.0014,"z":0}},"451eaa":{"lock":false,"pos":{"x":12.252,"y":1.4815,"z":11.986},"rot":{"x":0,"y":269.9999,"z":0}},"5302f2":{"lock":false,"pos":{"x":12.2505,"y":1.4815,"z":-20.0137},"rot":{"x":0,"y":270.0014,"z":0}},"72ab92":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":19.986},"rot":{"x":0,"y":269.9999,"z":0}},"9e73fa":{"lock":false,"pos":{"x":12.2501,"y":1.4815,"z":-12.0137},"rot":{"x":0,"y":269.9998,"z":0}},"cc7eb3":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":3.986},"rot":{"x":0,"y":269.9999,"z":0}},"e2dd57":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-4.014},"rot":{"x":0,"y":270,"z":0}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 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 Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.ttslua new file mode 100644 index 000000000..3c2a044ca --- /dev/null +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.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("__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() + + -- 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) +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 Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml new file mode 100644 index 000000000..717f370ee --- /dev/null +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Challenge Scenarios 9f6801/Custom_Model Relics of the Past 0d6da1.yaml @@ -0,0 +1,73 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +AttachedDecals: +- CustomDecal: + ImageURL: http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/ + Name: dunwich_back + Size: 7.4 + Transform: + posX: -0.0021877822 + posY: -0.08963572 + posZ: -0.00288731651 + rotX: 270 + rotY: 359.869568 + rotZ: 0 + scaleX: 2.00000215 + scaleY: 2.00000238 + scaleZ: 2.00000262 +Autoraise: true +ColorDiffuse: + a: 0.27451 + b: 1 + g: 1 + r: 1 +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/2299716459828640802/A224024254ABCFB818F12B50C1E5E0B32060F972/ + MaterialIndex: 3 + MeshURL: https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj + NormalURL: '' + TypeIndex: 0 +Description: Challenge Scenario +DragSelectable: true +GMNotes: scenarios/challenge_relics_of_the_past.json +GUID: 0d6da1 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: !include 'Custom_Model Relics of the Past 0d6da1.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Model +Nickname: Relics of the Past +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 12.25 + posY: 1.48 + posZ: -28.01 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 2.21 + scaleY: 0.46 + scaleZ: 2.42 +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 Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua index 7a8c1b8c9..c99612b1a 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua @@ -500,4 +500,4 @@ end 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 +end \ No newline at end of file diff --git a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml index bce132075..ef91c1f14 100644 --- a/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml +++ b/unpacked/Custom_Model_Bag Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9.yaml @@ -59,7 +59,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: false LuaScript: !include 'Custom_Model_Bag Standalone Scenarios 77a5f9.ttslua' -LuaScriptState: "{\"ml\":{\"01d780\":{\"lock\":false,\"pos\":{\"x\":12.252,\"y\":1.4815,\"z\":11.986},\"rot\":{\"x\":0,\"y\":270.0001,\"z\":0}},\"0dce91\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":-28.014},\"rot\":{\"x\":0,\"y\":269.9792,\"z\":0}},\"23dd51\":{\"lock\":false,\"pos\":{\"x\":12.249,\"y\":1.4815,\"z\":35.986},\"rot\":{\"x\":0,\"y\":270,\"z\":0}},\"3c4f3c\":{\"lock\":false,\"pos\":{\"x\":12.251,\"y\":1.4815,\"z\":-20.014},\"rot\":{\"x\":0,\"y\":269.9867,\"z\":0}},\"4c173f\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":3.986},\"rot\":{\"x\":0,\"y\":269.9998,\"z\":0}},\"4dee5a\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":-4.014},\"rot\":{\"x\":0,\"y\":269.9999,\"z\":0}},\"d02940\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":-36.014},\"rot\":{\"x\":0,\"y\":270.0045,\"z\":0}},\"db7039\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":27.986},\"rot\":{\"x\":0,\"y\":270.0001,\"z\":0}},\"ee987d\":{\"lock\":false,\"pos\":{\"x\":12.25,\"y\":1.4815,\"z\":19.986},\"rot\":{\"x\":0,\"y\":270.0001,\"z\":0}},\"fc7674\":{\"lock\":false,\"pos\":{\"x\":12.247,\"y\":1.4815,\"z\":-12.016},\"rot\":{\"x\":0,\"y\":270.0001,\"z\":0}}}}\r" +LuaScriptState: '{"ml":{"01d780":{"lock":false,"pos":{"x":12.252,"y":1.4815,"z":11.986},"rot":{"x":0,"y":270.0001,"z":0}},"0dce91":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-28.014},"rot":{"x":0,"y":269.9792,"z":0}},"23dd51":{"lock":false,"pos":{"x":12.249,"y":1.4815,"z":35.986},"rot":{"x":0,"y":270,"z":0}},"3c4f3c":{"lock":false,"pos":{"x":12.251,"y":1.4815,"z":-20.014},"rot":{"x":0,"y":269.9867,"z":0}},"4c173f":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":3.986},"rot":{"x":0,"y":269.9998,"z":0}},"4dee5a":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-4.014},"rot":{"x":0,"y":269.9999,"z":0}},"d02940":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-36.014},"rot":{"x":0,"y":270.0045,"z":0}},"db7039":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":27.986},"rot":{"x":0,"y":270.0001,"z":0}},"ee987d":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":19.986},"rot":{"x":0,"y":270.0001,"z":0}},"fc7674":{"lock":false,"pos":{"x":12.247,"y":1.4815,"z":-12.016},"rot":{"x":0,"y":270.0001,"z":0}}}}' MaterialIndex: -1 MeasureMovement: false MeshIndex: -1 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 Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.ttslua index e6f67c6af..3c2a044ca 100644 --- 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 Official StandaloneChallenge Scenarios 0ef5c8/Custom_Model_Bag Standalone Scenarios 77a5f9/Custom_Model Machinations Through Time 3c4f3c.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_Bag Trash 147e80.ttslua b/unpacked/Custom_Model_Bag Trash 147e80.ttslua index 3a4a5ed8c..de7afd1c2 100644 --- a/unpacked/Custom_Model_Bag Trash 147e80.ttslua +++ b/unpacked/Custom_Model_Bag Trash 147e80.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_Model_Bag Trash 70b9f6.ttslua b/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua index 3a4a5ed8c..de7afd1c2 100644 --- a/unpacked/Custom_Model_Bag Trash 70b9f6.ttslua +++ b/unpacked/Custom_Model_Bag Trash 70b9f6.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 1e6b0143e..e6c822eff 100644 --- a/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.ttslua +++ b/unpacked/Custom_Tile ArkhamDB Deck Importer a28140.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("arkhamdb/DeckImporterMain") -end) __bundle_register("arkhamdb/DeckImporterMain", function(require, _LOADED, __bundle_register, __bundle_modules) require("arkhamdb/DeckImporterUi") require("playercards/PlayerCardSpawner") @@ -54,6 +51,8 @@ local playAreaApi = require("core/PlayAreaApi") local playmatApi = require("playermat/PlaymatApi") local zones = require("playermat/Zones") +local startsInPlayCount = 0 + function onLoad(script_state) initializeUi(JSON.decode(script_state)) math.randomseed(os.time()) @@ -78,7 +77,7 @@ function getDefaultCardZone(cardMetadata, bondedList) elseif cardMetadata.type == "UpgradeSheet" then return "SetAside4" elseif cardMetadata.startsInPlay then - return "BlankTop" + return startsInPlayTracker() elseif cardMetadata.permanent then return "SetAside1" elseif bondedList[cardMetadata.id] then @@ -89,6 +88,16 @@ function getDefaultCardZone(cardMetadata, bondedList) end end +function startsInPlayTracker() + startsInPlayCount = startsInPlayCount + 1 + if startsInPlayCount > 6 then + broadcastToAll("Card that should start in play was placed with permanents because no blank slots remained") + return "SetAside1" + else + return "Blank" .. startsInPlayCount + end +end + function buildDeck(playerColor, deckId) local uiState = getUiState() arkhamDb.getDecklist( @@ -118,8 +127,10 @@ end ---@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 yPos = {} local cardsToSpawn = {} + + -- reset the startsInPlayCount + startsInPlayCount = 0 for cardId, cardCount in pairs(slots) do local card = allCardsBagApi.getCardById(cardId) if card ~= nil then @@ -201,6 +212,7 @@ function deckSpawned(deck, playerColor) local player = Player[playmatApi.getPlayerColor(playerColor)] local handPos = player.getHandTransform(1).position -- Only one hand zone per player local deckCards = deck.getData().ContainedObjects + -- Process in reverse order so taking cards out doesn't upset the indexing for i = #deckCards, 1, -1 do local cardMetadata = JSON.decode(deckCards[i].GMNotes) or { } @@ -208,6 +220,11 @@ function deckSpawned(deck, playerColor) deck.takeObject({ index = i - 1, position = handPos, flip = true, smooth = true}) end end + + -- add the "PlayerCard" tag to the deck + if deck and deck.type == "Deck" and deck.getQuantity() > 1 then + deck.addTag("PlayerCard") + end end -- Converts the Raven Quill's selections from card IDs to card names. This could be more elegant @@ -244,7 +261,7 @@ function getCardName(cardId) end -- Split a single list of cards into a separate table of lists, keyed by the zone ----@param cards: Table of {cardData, cardMetadata, zone} +---@param cards Table Table of {cardData, cardMetadata, zone} ---@return: Table of {zoneName=card list} function buildZoneLists(cards) local zoneList = {} @@ -415,7 +432,7 @@ 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 Table Deck's meta table, extracted from ArkhamDB's deck structure +---@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 @@ -461,6 +478,9 @@ function handleCustomizableUpgrades(cardList, customizations) elseif baseId == "09079" then -- Living Ink skill selection -- All skills, regardless of row, are placed in upgrade slot 1 as a comma-delimited -- list + if selectedUpgrades[1] == nil then + selectedUpgrades[1] = { } + end if selectedUpgrades[1].text == nil then selectedUpgrades[1].text = str else @@ -488,13 +508,13 @@ function handlePeteSignatureAssets(investigatorId, cardList) if investigatorId == "02005" or investigatorId == "02005-pb" then -- regular Pete's front for i, card in ipairs(cardList) do if card.metadata.id == "02014" then -- Duke - card.zone = "BlankTop" + card.zone = startsInPlayTracker() end end elseif investigatorId == "02005-p" or investigatorId == "02005-pf" then -- parallel Pete's front for i, card in ipairs(cardList) do if card.metadata.id == "90047" then -- Pete's Guitar - card.zone = "BlankTop" + card.zone = startsInPlayTracker() end end end @@ -517,6 +537,923 @@ 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 RANDOM_WEAKNESS_ID = "01000" + + local tabooList = { } + --Forward declaration + ---@type Request + local Request = {} + local configuration + + -- Sets up the ArkhamDb interface. Should be called from the parent object on load. + ArkhamDb.initialize = function() + configuration = internal.getConfiguration() + 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 + cards[card.code] = true + end + + tabooList[taboo.id] = { + date = taboo.date_start, + cards = cards + } + end + return true, nil + end) + end + + -- 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 + --- investigatorCode String. ID of the investigator in this deck + --- customizations Table. The decoded table of customization upgrades in this deck + --- playerColor String. Color this deck is being loaded for + ArkhamDb.getDecklist = function( + playerColor, + deckId, + isPrivate, + loadNewest, + loadInvestigators, + callback) + -- Get a simple card to see if the bag indexes are complete. If not, abort + -- the deck load. The called method will handle player notification. + local checkCard = allCardsBagApi.getCardById("01001") + if (checkCard ~= nil and checkCard.data == nil) then + return + end + + 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" }) + end + local json = JSON.decode(status.text) + + if not json then + internal.maybePrint("Deck ID " .. deckId .. " not found", playerColor) + return false, "Deck not found!" + end + + return true, json + end) + + deck:with(internal.onDeckResult, playerColor, loadNewest, loadInvestigators, callback) + end + + -- 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 + ArkhamDb.logCardNotFound = function(cardId, playerColor) + local request = Request.start({ + configuration.api_uri, + configuration.cards, + cardId + }, + function(result) + local adbCardInfo = JSON.decode(internal.fixUtf16String(result.text)) + local cardName = adbCardInfo.real_name + if (cardName ~= nil) then + if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then + cardName = cardName .. " (" .. adbCardInfo.xp .. ")" + end + internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) + else + internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) + end + end) + end + + -- Callback when the deck information is received from ArkhamDB. Parses the + -- 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 + --- 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 + --- 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 + if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then + buildDeck(playerColor, deck.next_deck) + return + end + + internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor) + + -- Initialize deck slot table and perform common transformations. The order of these should not + -- be changed, as later steps may act on cards added in each. For example, a random weakness or + -- investigator may have bonded cards or taboo entries, and should be present + local slots = deck.slots + internal.maybeDrawRandomWeakness(slots, playerColor) + local loadAltInvestigator = "normal" + if loadInvestigators then + loadAltInvestigator = internal.addInvestigatorCards(deck, slots) + end + + internal.maybeModifyDeckFromDescription(slots, deck.description_md) + internal.maybeAddSummonedServitor(slots) + internal.maybeAddOnTheMend(slots, playerColor) + internal.maybeAddRealityAcidReference(slots) + local bondList = internal.extractBondedCards(slots) + internal.checkTaboos(deck.taboo_id, slots, playerColor) + internal.maybeAddUpgradeSheets(slots) + + -- get upgrades for customizable cards + local customizations = {} + if deck.meta then + customizations = JSON.decode(deck.meta) + end + + callback(slots, deck.investigator_code, bondList, customizations, playerColor, loadAltInvestigator) + end + + -- 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 + --- of those cards which will be spawned + ---@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 + slots[RANDOM_WEAKNESS_ID] = nil + + if randomWeaknessAmount ~= 0 then + for i=1, randomWeaknessAmount do + local weaknessId = allCardsBagApi.getRandomWeaknessId() + slots[weaknessId] = (slots[weaknessId] or 0) + 1 + end + internal.maybePrint("Added " .. randomWeaknessAmount .. " random basic weakness(es) to deck", playerColor) + end + 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 + --- 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 + local altFrontId = tonumber(deckMeta.alternate_front) or 0 + local altBackId = tonumber(deckMeta.alternate_back) or 0 + local altArt = { front = "normal", back = "normal" } + + -- translating front ID + if altFrontId > 90000 and altFrontId < 90100 then + altArt.front = "parallel" + elseif altFrontId > 01500 and altFrontId < 01506 then + altArt.front = "revised" + elseif altFrontId > 98000 then + altArt.front = "promo" + end + + -- translating back ID + if altBackId > 90000 and altBackId < 90100 then + altArt.back = "parallel" + elseif altBackId > 01500 and altBackId < 01506 then + altArt.back = "revised" + elseif altBackId > 98000 then + altArt.back = "promo" + end + + -- updating investigatorID based on alt investigator selection + -- precedence: parallel > promo > revised + if altArt.front == "parallel" then + if altArt.back == "parallel" then + investigatorId = investigatorId .. "-p" + else + investigatorId = investigatorId .. "-pf" + end + elseif altArt.back == "parallel" then + investigatorId = investigatorId .. "-pb" + elseif altArt.front == "promo" or altArt.back == "promo" then + loadAltInvestigator = "promo" + elseif altArt.front == "revised" or altArt.back == "revised" then + loadAltInvestigator = "revised" + end + end + slots[investigatorId] = 1 + deck.investigator_code = investigatorId + return loadAltInvestigator + 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 + -- of those cards which will be spawned + internal.maybeAddUpgradeSheets = function(slots) + for cardId, _ in pairs(slots) do + -- upgrade sheets for customizable cards + local upgradesheet = allCardsBagApi.getCardById(cardId .. "-c") + if upgradesheet ~= nil then + slots[cardId .. "-c"] = 1 + end + end + end + + -- 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 + -- of those cards which will be spawned + internal.maybeAddSummonedServitor = function(slots) + if slots["09080"] ~= nil then + slots["09080-m"] = 1 + end + end + + -- 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 + -- 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 + internal.maybeAddOnTheMend = function(slots, playerColor) + if slots["09006"] ~= nil then + local investigatorCount = playAreaApi.getInvestigatorCount() + if investigatorCount ~= nil then + slots["09006"] = investigatorCount + else + internal.maybePrint("Something went wrong with the load, adding 4 copies of On the Mend", playerColor) + slots["09006"] = 4 + end + end + 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 + -- of those cards which will be spawned + internal.maybeAddRealityAcidReference = function(slots) + if slots["89004"] ~= nil then + slots["89005"] = 1 + end + 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) + -- 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) + + -- parse each line in instructions + for line in tempStr:gmatch("([^\n]+)") do + -- remove dashes at the start + line = line:gsub("%- ", "") + + -- remove spaces + line = line:gsub("%s", "") + + -- get instructor + local instructor = "" + for word in line:gmatch("%a+:") do + instructor = word + break + end + + if instructor == "" or (instructor ~= "add:" and instructor ~= "remove:") then return 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) + end + end + 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 + internal.extractBondedCards = function(slots) + -- Create a list of bonded cards first so we don't modify slots while iterating + local bondedCards = { } + local bondedList = { } + for cardId, cardCount in pairs(slots) do + local card = allCardsBagApi.getCardById(cardId) + if (card ~= nil and card.metadata.bonded ~= nil) then + for _, bond in ipairs(card.metadata.bonded) do + -- add a bonded card for each copy of the parent card (except for Pendant of the Queen) + if bond.id == "06022" then + bondedCards[bond.id] = bond.count + else + bondedCards[bond.id] = bond.count * cardCount + end + -- We need to know which cards are bonded to determine their position, remember them + bondedList[bond.id] = true + -- Also adding taboo versions of bonded cards to the list + bondedList[bond.id .. "-t"] = true + end + end + end + -- Add any bonded cards to the main slots list + for bondedId, bondedCount in pairs(bondedCards) do + slots[bondedId] = bondedCount + end + + return bondedList + 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 + internal.checkTaboos = function(tabooId, slots, playerColor) + if tabooId then + for cardId, _ in pairs(tabooList[tabooId].cards) do + if slots[cardId] ~= nil then + -- Make sure there's a taboo version of the card before we replace it + -- SCED only maintains the most recent taboo cards. If a deck is using + -- an older taboo list it's possible the card isn't a taboo any more + local tabooCard = allCardsBagApi.getCardById(cardId .. "-t") + if tabooCard == nil then + local basicCard = allCardsBagApi.getCardById(cardId) + internal.maybePrint("Taboo version for " .. basicCard.data.Nickname .. " is not available. Using standard version", playerColor) + else + slots[cardId .. "-t"] = slots[cardId] + slots[cardId] = nil + end + end + end + end + end + + internal.maybePrint = function(message, playerColor) + if playerColor ~= "None" then + printToAll(message, playerColor) + end + end + + -- Gets the ArkhamDB config info from the configuration object. + ---@return Table. Configuration data + internal.getConfiguration = function() + local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") + printPriority = configuration.priority + return configuration + end + + internal.fixUtf16String = function(str) + return str:gsub("\\u(%w%w%w%w)", function(match) + return string.char(tonumber(match, 16)) + 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) + ---@return Request + function Request:new(uri, configure) + local this = {} + + setmetatable(this, self) + self.__index = self + + if type(uri) == "table" then + uri = table.concat(uri, "/") + end + + this.uri = uri + + 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[] + ---@return Request + function Request.deferred(uri, on_success, on_error, ...) + local parameters = table.pack(...) + return Request:new(uri, function(request, status) + if (status.is_done) then + if (status.is_error) then + request.error_message = on_error and on_error(status, table.unpack(parameters)) or status.error + request.is_successful = false + request.is_done = true + else + on_success(request, status) + end + end + 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[] + ---@return Request + function Request.start(uri, on_success, on_error, ...) + local parameters = table.pack(...) + return Request.deferred(uri, function(request, status) + local result, message = on_success(status, table.unpack(parameters)) + if not result then request.error_message = message else request.content = message end + request.is_successful = result + request.is_done = true + end, on_error, table.unpack(parameters)) + end + + ---@param requests Request[] + ---@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 + if request.is_successful then + table.insert(results, request.content) + else + table.insert(errors, request) + end + end + + if (#errors <= 0) then + on_success(results, table.unpack(parameters)) + elseif on_error == nil then + for _, request in ipairs(errors) do + internal.maybePrint(table.concat({ "[ERROR]", request.uri, ":", request.error_message })) + end + else + on_error(requests, table.unpack(parameters)) + end + end, function() + for _, request in ipairs(requests) do + if not request.is_done then return false end + end + return true + end) + end + + ---@param callback fun(content: any, vararg any) + function Request:with(callback, ...) + local arguments = table.pack(...) + Wait.condition(function() + if self.is_successful then + callback(self.content, table.unpack(arguments)) + end + end, function() return self.is_done + end) + end + + return ArkhamDb +end +end) __bundle_register("arkhamdb/DeckImporterUi", function(require, _LOADED, __bundle_register, __bundle_modules) local allCardsBagApi = require("playercards/AllCardsBagApi") @@ -731,974 +1668,6 @@ function loadDecks() 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 card: 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("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. --- BlankTop: used for assets that start in play (e.g. Duke) --- Tarot, Hand1, Hand2, Ally, BlankBottom, 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["BlankTop"] = { 1.758, 0, 0.040 } - commonZones["BlankBottom"] = { 1.754, 0, 0.563 } - 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"]["BlankTop"] = commonZones["BlankTop"] - zoneData["White"]["BlankBottom"] = commonZones["BlankBottom"] - 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"]["BlankTop"] = commonZones["BlankTop"] - zoneData["Orange"]["BlankBottom"] = commonZones["BlankBottom"] - 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 metadata. - ---@param playerColor: Color name of the player mat to get the rotation for (e.g. "Red") - ---@param cardMetadata: Table of card metadata. Metadata fields type and permanent are required; all others are optional. - ---@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, zone) - local cardRotation = playmatApi.returnRotation(playerColor) - if zone == "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 - - return GUIDReferenceApi -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 RANDOM_WEAKNESS_ID = "01000" - - local tabooList = { } - --Forward declaration - ---@type Request - local Request = {} - local configuration - - -- Sets up the ArkhamDb interface. Should be called from the parent object on load. - ArkhamDb.initialize = function() - configuration = internal.getConfiguration() - 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 - cards[card.code] = true - end - - tabooList[taboo.id] = { - date = taboo.date_start, - cards = cards - } - end - return true, nil - end) - end - - -- 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 - --- investigatorCode String. ID of the investigator in this deck - --- customizations Table. The decoded table of customization upgrades in this deck - --- playerColor String. Color this deck is being loaded for - ArkhamDb.getDecklist = function( - playerColor, - deckId, - isPrivate, - loadNewest, - loadInvestigators, - callback) - -- Get a simple card to see if the bag indexes are complete. If not, abort - -- the deck load. The called method will handle player notification. - local checkCard = allCardsBagApi.getCardById("01001") - if (checkCard ~= nil and checkCard.data == nil) then - return - end - - 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" }) - end - local json = JSON.decode(status.text) - - if not json then - internal.maybePrint("Deck ID " .. deckId .. " not found", playerColor) - return false, "Deck not found!" - end - - return true, json - end) - - deck:with(internal.onDeckResult, playerColor, loadNewest, loadInvestigators, callback) - end - - -- 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 - ArkhamDb.logCardNotFound = function(cardId, playerColor) - local request = Request.start({ - configuration.api_uri, - configuration.cards, - cardId - }, - function(result) - local adbCardInfo = JSON.decode(internal.fixUtf16String(result.text)) - local cardName = adbCardInfo.real_name - if (cardName ~= nil) then - if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then - cardName = cardName .. " (" .. adbCardInfo.xp .. ")" - end - internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) - else - internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) - end - end) - end - - -- Callback when the deck information is received from ArkhamDB. Parses the - -- 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 - --- 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 - --- 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 - if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then - buildDeck(playerColor, deck.next_deck) - return - end - - internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor) - - -- Initialize deck slot table and perform common transformations. The order of these should not - -- be changed, as later steps may act on cards added in each. For example, a random weakness or - -- investigator may have bonded cards or taboo entries, and should be present - local slots = deck.slots - internal.maybeDrawRandomWeakness(slots, playerColor) - local loadAltInvestigator = "normal" - if loadInvestigators then - loadAltInvestigator = internal.addInvestigatorCards(deck, slots) - end - - internal.maybeAddSummonedServitor(slots) - internal.maybeAddOnTheMend(slots, playerColor) - internal.maybeAddRealityAcidReference(slots) - local bondList = internal.extractBondedCards(slots) - internal.checkTaboos(deck.taboo_id, slots, playerColor) - internal.maybeAddUpgradeSheets(slots) - - -- get upgrades for customizable cards - local customizations = {} - if deck.meta then - customizations = JSON.decode(deck.meta) - end - - callback(slots, deck.investigator_code, bondList, customizations, playerColor, loadAltInvestigator) - end - - -- 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 - --- of those cards which will be spawned - ---@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 - slots[RANDOM_WEAKNESS_ID] = nil - - if randomWeaknessAmount ~= 0 then - for i=1, randomWeaknessAmount do - local weaknessId = allCardsBagApi.getRandomWeaknessId() - slots[weaknessId] = (slots[weaknessId] or 0) + 1 - end - internal.maybePrint("Added " .. randomWeaknessAmount .. " random basic weakness(es) to deck", playerColor) - end - 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 - --- 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 - local altFrontId = tonumber(deckMeta.alternate_front) or 0 - local altBackId = tonumber(deckMeta.alternate_back) or 0 - local altArt = { front = "normal", back = "normal" } - - -- translating front ID - if altFrontId > 90000 and altFrontId < 90100 then - altArt.front = "parallel" - elseif altFrontId > 01500 and altFrontId < 01506 then - altArt.front = "revised" - elseif altFrontId > 98000 then - altArt.front = "promo" - end - - -- translating back ID - if altBackId > 90000 and altBackId < 90100 then - altArt.back = "parallel" - elseif altBackId > 01500 and altBackId < 01506 then - altArt.back = "revised" - elseif altBackId > 98000 then - altArt.back = "promo" - end - - -- updating investigatorID based on alt investigator selection - -- precedence: parallel > promo > revised - if altArt.front == "parallel" then - if altArt.back == "parallel" then - investigatorId = investigatorId .. "-p" - else - investigatorId = investigatorId .. "-pf" - end - elseif altArt.back == "parallel" then - investigatorId = investigatorId .. "-pb" - elseif altArt.front == "promo" or altArt.back == "promo" then - loadAltInvestigator = "promo" - elseif altArt.front == "revised" or altArt.back == "revised" then - loadAltInvestigator = "revised" - end - end - slots[investigatorId] = 1 - deck.investigator_code = investigatorId - return loadAltInvestigator - 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 - -- of those cards which will be spawned - internal.maybeAddUpgradeSheets = function(slots) - for cardId, _ in pairs(slots) do - -- upgrade sheets for customizable cards - local upgradesheet = allCardsBagApi.getCardById(cardId .. "-c") - if upgradesheet ~= nil then - slots[cardId .. "-c"] = 1 - end - end - end - - -- 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 - -- of those cards which will be spawned - internal.maybeAddSummonedServitor = function(slots) - if slots["09080"] ~= nil then - slots["09080-m"] = 1 - end - end - - -- 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 - -- 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 - internal.maybeAddOnTheMend = function(slots, playerColor) - if slots["09006"] ~= nil then - local investigatorCount = playAreaApi.getInvestigatorCount() - if investigatorCount ~= nil then - slots["09006"] = investigatorCount - else - internal.maybePrint("Something went wrong with the load, adding 4 copies of On the Mend", playerColor) - slots["09006"] = 4 - end - end - 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 - -- of those cards which will be spawned - internal.maybeAddRealityAcidReference = function(slots) - if slots["89004"] ~= nil then - slots["89005"] = 1 - 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 - internal.extractBondedCards = function(slots) - -- Create a list of bonded cards first so we don't modify slots while iterating - local bondedCards = { } - local bondedList = { } - for cardId, cardCount in pairs(slots) do - local card = allCardsBagApi.getCardById(cardId) - if (card ~= nil and card.metadata.bonded ~= nil) then - for _, bond in ipairs(card.metadata.bonded) do - -- add a bonded card for each copy of the parent card (except for Pendant of the Queen) - if bond.id == "06022" then - bondedCards[bond.id] = bond.count - else - bondedCards[bond.id] = bond.count * cardCount - end - -- We need to know which cards are bonded to determine their position, remember them - bondedList[bond.id] = true - -- Also adding taboo versions of bonded cards to the list - bondedList[bond.id .. "-t"] = true - end - end - end - -- Add any bonded cards to the main slots list - for bondedId, bondedCount in pairs(bondedCards) do - slots[bondedId] = bondedCount - end - - return bondedList - 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 - internal.checkTaboos = function(tabooId, slots, playerColor) - if tabooId then - for cardId, _ in pairs(tabooList[tabooId].cards) do - if slots[cardId] ~= nil then - -- Make sure there's a taboo version of the card before we replace it - -- SCED only maintains the most recent taboo cards. If a deck is using - -- an older taboo list it's possible the card isn't a taboo any more - local tabooCard = allCardsBagApi.getCardById(cardId .. "-t") - if tabooCard == nil then - local basicCard = allCardsBagApi.getCardById(cardId) - internal.maybePrint("Taboo version for " .. basicCard.data.Nickname .. " is not available. Using standard version", playerColor) - else - slots[cardId .. "-t"] = slots[cardId] - slots[cardId] = nil - end - end - end - end - end - - internal.maybePrint = function(message, playerColor) - if playerColor ~= "None" then - printToAll(message, playerColor) - end - end - - -- Gets the ArkhamDB config info from the configuration object. - ---@return Table. Configuration data - internal.getConfiguration = function() - local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") - printPriority = configuration.priority - return configuration - end - - internal.fixUtf16String = function(str) - return str:gsub("\\u(%w%w%w%w)", function(match) - return string.char(tonumber(match, 16)) - 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) - ---@return Request - function Request:new(uri, configure) - local this = {} - - setmetatable(this, self) - self.__index = self - - if type(uri) == "table" then - uri = table.concat(uri, "/") - end - - this.uri = uri - - 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[] - ---@return Request - function Request.deferred(uri, on_success, on_error, ...) - local parameters = table.pack(...) - return Request:new(uri, function(request, status) - if (status.is_done) then - if (status.is_error) then - request.error_message = on_error and on_error(status, table.unpack(parameters)) or status.error - request.is_successful = false - request.is_done = true - else - on_success(request, status) - end - end - 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[] - ---@return Request - function Request.start(uri, on_success, on_error, ...) - local parameters = table.pack(...) - return Request.deferred(uri, function(request, status) - local result, message = on_success(status, table.unpack(parameters)) - if not result then request.error_message = message else request.content = message end - request.is_successful = result - request.is_done = true - end, on_error, table.unpack(parameters)) - end - - ---@param requests Request[] - ---@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 - if request.is_successful then - table.insert(results, request.content) - else - table.insert(errors, request) - end - end - - if (#errors <= 0) then - on_success(results, table.unpack(parameters)) - elseif on_error == nil then - for _, request in ipairs(errors) do - internal.maybePrint(table.concat({ "[ERROR]", request.uri, ":", request.error_message })) - end - else - on_error(requests, table.unpack(parameters)) - end - end, function() - for _, request in ipairs(requests) do - if not request.is_done then return false end - end - return true - end) - end - - ---@param callback fun(content: any, vararg any) - function Request:with(callback, ...) - local arguments = table.pack(...) - Wait.condition(function() - if self.is_successful then - callback(self.content, table.unpack(arguments)) - end - end, function() return self.is_done - end) - end - - return ArkhamDb -end -end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} @@ -1748,6 +1717,16 @@ do 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) @@ -1756,7 +1735,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -1815,6 +1794,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -1909,6 +1889,26 @@ do 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) @@ -1994,6 +1994,15 @@ do 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 @@ -2003,6 +2012,22 @@ do 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) @@ -2013,7 +2038,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -2042,4 +2067,195 @@ do 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") \ No newline at end of file diff --git a/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua index f380e2e9c..1324b445e 100644 --- a/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua +++ b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.ttslua @@ -41,25 +41,322 @@ 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/CampaignImporterExporter") -end) -__bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) -do - local OptionPanelApi = {} +__bundle_register("accessories/CampaignImporterExporter", function(require, _LOADED, __bundle_register, __bundle_modules) +local blessCurseApi = require("chaosbag/BlessCurseManagerApi") +local chaosBagApi = require("chaosbag/ChaosBagApi") +local deckImporterApi = require("arkhamdb/DeckImporterApi") +local guidReferenceApi = require("core/GUIDReferenceApi") +local optionPanelApi = require("core/OptionPanelApi") +local playAreaApi = require("core/PlayAreaApi") +local playmatApi = require("playermat/PlaymatApi") - -- loads saved options - ---@param options Table New options table - OptionPanelApi.loadSettings = function(options) - return Global.call("loadSettings", options) +local checkWarning = true + +local campaignTokenData = { + Name = "Custom_Model_Bag", + Transform = { + posX = -21.25, + posY = 1.68, + posZ = 55.59, + rotX = 0, + rotY = 270, + rotZ = 0, + scaleX = 2, + scaleY = 2, + scaleZ = 2 + }, + Description = "SCED Importer Token", + Tags = { + "ImporterToken" + }, + CustomMesh = { + MeshURL = "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/", + DiffuseURL = "http://cloud-3.steamusercontent.com/ugc/254843371583188147/920981125E37B5CEB6C400E3FD353A2C428DA969/", + NormalURL = "", + ColliderURL = "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/", + Convex = true, + MaterialIndex = 2, + TypeIndex = 6, + CustomShader = { + SpecularColor = { + r = 0.7222887, + g = 0.507659256, + b = 0.339915335 + }, + SpecularIntensity = 0.4, + SpecularSharpness = 7.0, + FresnelStrength = 0.0 + }, + CastShadows = true + } +} +local COLORS = { "White", "Orange", "Green", "Red" } + +function onLoad() + self.createButton({ + click_function = "createCampaignToken", + function_owner = self, + label = "Export", + tooltip = "Create a campaign save token!", + position = { x = -1, y = 0.21, z = 0 }, + font_size = 400, + width = 1400, + height = 600, + scale = { 0.5, 1, 0.5 }, + }) +end + +function onObjectLeaveContainer(container, object) + if container.hasTag("ImporterToken") and checkWarning then + broadcastToAll( + "Removing objects from the Save Coin bag will break functionality. Please replace the objects in the same order they were removed.", + Color.Yellow + ) + end +end + +function onObjectEnterContainer(container, object) + if container.hasTag("ImporterToken") and checkWarning then + broadcastToAll( + "Adding objects to the Save Coin bag will break functionality. Please remove the objects.", + Color.Yellow + ) + end +end + +--------------------------------------------------------- +-- main import functions (split up to allow for Wait conditions) +--------------------------------------------------------- + +function onCollisionEnter(info) + if info.collision_object.hasTag("ImporterToken") then + importFromToken(info.collision_object) + end +end + +-- Identifies import token, determines campaign box and downloads it (if needed) +function importFromToken(coin) + broadcastToAll("Campaign Import Initiated") + local importData = JSON.decode(coin.getGMNotes()) + + local campaignBoxGUID = importData["box"] + local campaignBox = getObjectFromGUID(campaignBoxGUID) + if not campaignBox then + broadcastToAll("Campaign Box not present on table!", Color.Red) + return + end + if campaignBox.type == "Generic" then + campaignBox.call("buttonClick_download") + end + Wait.condition( + function() + if #campaignBox.getObjects() > 0 then + placeCampaignFromToken(importData, coin) + else + restoreCampaignData(importData, coin) + end + end, + function() + local obj = getObjectFromGUID(campaignBoxGUID) + if obj == nil then + return false + else + return obj.type == "Bag" and obj.getLuaScript() ~= "" + end + end, + 2, + function() broadcastToAll("Error loading campaign box") end + ) +end + +-- After box has been downloaded, places content on table +function placeCampaignFromToken(importData, coin) + getObjectFromGUID(importData["box"]).call("buttonClick_place") + Wait.condition( + function() restoreCampaignData(importData, coin) end, + function() return findUniqueObjectWithTag("CampaignLog") ~= nil end, + 2, + function() broadcastToAll("Error placing campaign box") end + ) +end + +-- After content is placed on table, conducts all the other import operations +function restoreCampaignData(importData, coin) + + checkWarning = false + if importData["additionalIndex"] then + guidReferenceApi.getObjectByOwnerAndType("Mythos", "AdditionalPlayerCardsBag").destruct() + if coin.type == "Bag" then + coin.takeObject({index = 0, position = importData["additionalIndex"], callback_function = function(obj) obj.setLock(true) end}) + else + spawnObjectJSON({json = importData["additionalIndex"]}) + end end - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") + -- destroy existing campaign log and load saved campaign log + findUniqueObjectWithTag("CampaignLog").destruct() + if coin.type == "Bag" then + local newLog = coin.takeObject({index = 0, position = importData["log"], callback_function = function(obj) obj.setLock(true) end}) + else + spawnObjectData({ data = importData["log"] }) end - return OptionPanelApi + coin.destruct() + checkWarning = true + + chaosBagApi.setChaosBagState(importData["bag"]) + + -- populate trauma values + if importData["trauma"] then + setTrauma(importData["trauma"]) + end + + -- populate ArkhamDB deck IDs + if importData["decks"] then + deckImporterApi.setUiState(importData["decks"]) + end + + playAreaApi.setInvestigatorCount(importData["clueCount"]) + + -- set campaign guide page + local guide = findUniqueObjectWithTag("CampaignGuide") + if guide then + Wait.condition( + -- Called after the condition function returns true + function() log("Campaign Guide import successful!") end, + -- Condition function that is called continiously until returs true or timeout is reached + function() return guide.Book.setPage(importData["guide"]) end, + -- Amount of time in seconds until the Wait times out + 2, + -- Called if the Wait times out + function() log("Campaign Guide import failed!") end + ) + end + + Wait.time(function() optionPanelApi.loadSettings(importData["options"]) end, 0.5) + + -- destroy Tour Starter token + local tourStarter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TourStarter") + if tourStarter then + tourStarter.destruct() + end + + -- restore PlayArea image + playAreaApi.updateSurface(importData["playarea"]) + + broadcastToAll("Campaign successfully imported!", Color.Green) +end + +-- Creates a campaign token with save data encoded into GM Notes based on the current state of the table +function createCampaignToken(_, playerColor, _) + + -- find active campaign + local campaignBox + for _, obj in ipairs(getObjectsWithTag("CampaignBox")) do + if obj.type == "Bag" and #obj.getObjects() == 0 then + if not campaignBox then + campaignBox = obj + else + broadcastToAll("Multiple empty campaign box detected; delete all but one.", Color.Red) + return + end + end + end + if not campaignBox then + broadcastToAll("Campaign box with all placed objects not found!", Color.Red) + return + end + + local campaignLog = findUniqueObjectWithTag("CampaignLog") + if campaignLog == nil then + broadcastToAll("Campaign log not found!", Color.Red) + return + end + + local additionalIndex = guidReferenceApi.getObjectByOwnerAndType("Mythos", "AdditionalPlayerCardsBag") + + local traumaValues = { } + local trauma = campaignLog.getVar("returnTrauma") + + if trauma ~= nil then + printToAll("Trauma values found in campaign log!", "Green") + trauma = campaignLog.call("returnTrauma") + for _, val in ipairs(trauma) do + table.insert(traumaValues, val) + end + else + printToAll("Trauma values could not be found in campaign log!", "Yellow") + end + + local campaignGuide = findUniqueObjectWithTag("CampaignGuide") + if campaignGuide == nil then + broadcastToAll("Campaign guide not found!", Color.Red) + return + end + + -- clean up chaos tokens + blessCurseApi.removeAll(playerColor) + chaosBagApi.releaseAllSealedTokens(playerColor) + + local campaignData = { + box = campaignBox.getGUID(), + log = campaignLog.getPosition(), + bag = chaosBagApi.getChaosBagState(), + trauma = traumaValues, + decks = deckImporterApi.getUiState(), + clueCount = playAreaApi.getInvestigatorCount(), + playarea = playAreaApi.getSurface(), + options = optionPanelApi.getOptions(), + guide = campaignGuide.Book.getPage(), + additionalIndex = additionalIndex.getPosition() + } + campaignTokenData.GMNotes = JSON.encode(campaignData) + campaignTokenData.Nickname = campaignBox.getName() .. os.date(" %b %d") .. " Save" + campaignTokenData.ContainedObjects = { } + local indexData = additionalIndex.getData() + indexData.Locked = false + table.insert(campaignTokenData.ContainedObjects, indexData) + local logData = campaignLog.getData() + logData.Locked = false + table.insert(campaignTokenData.ContainedObjects, logData) + spawnObjectData({ data = campaignTokenData }) + broadcastToAll("Campaign successfully exported! Save coin object to import on a fresh save", Color.Green) +end + +--------------------------------------------------------- +-- helper functions +--------------------------------------------------------- + +function findUniqueObjectWithTag(tag) + local objects = getObjectsWithTag(tag) + if not objects then return end + + if #objects == 1 then + return objects[1] + else + broadcastToAll("More than 1 " .. tag .. " detected; delete all but one.", Color.Red) + return nil + end +end + +function setTrauma(trauma) + for i = 1, 4 do + playmatApi.updateCounter(COLORS[i], "DamageCounter", trauma[i]) + playmatApi.updateCounter(COLORS[i], "HorrorCounter", trauma[i + 4]) + end +end + +-- gets data from campaign log if possible +function loadTrauma(log) + local trauma = log.getVar("returnTrauma") + + if trauma ~= nil then + printToAll("Trauma values found in campaign log!", "Green") + trauma = log.call("returnTrauma") + return trauma + else + return nil + end end end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -111,6 +408,16 @@ do 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) @@ -119,7 +426,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -174,363 +481,72 @@ do return PlayAreaApi end end) -__bundle_register("accessories/CampaignImporterExporter", function(require, _LOADED, __bundle_register, __bundle_modules) -local blessCurseApi = require("chaosbag/BlessCurseManagerApi") -local chaosBagApi = require("chaosbag/ChaosBagApi") -local deckImporterApi = require("arkhamdb/DeckImporterApi") -local guidReferenceApi = require("core/GUIDReferenceApi") -local optionPanelApi = require("core/OptionPanelApi") -local playAreaApi = require("core/PlayAreaApi") -local playmatApi = require("playermat/PlaymatApi") - -local campaignTokenData = { - Name = "Custom_Model", - Transform = { - posX = -21.25, - posY = 1.68, - posZ = 55.59, - rotX = 0, - rotY = 270, - rotZ = 0, - scaleX = 2, - scaleY = 2, - scaleZ = 2 - }, - Description = "SCED Importer Token", - Tags = { - "ImporterToken" - }, - CustomMesh = { - MeshURL = "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/", - DiffuseURL = "http://cloud-3.steamusercontent.com/ugc/254843371583188147/920981125E37B5CEB6C400E3FD353A2C428DA969/", - NormalURL = "", - ColliderURL = "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/", - Convex = true, - MaterialIndex = 2, - TypeIndex = 0, - CustomShader = { - SpecularColor = { - r = 0.7222887, - g = 0.507659256, - b = 0.339915335 - }, - SpecularIntensity = 0.4, - SpecularSharpness = 7.0, - FresnelStrength = 0.0 - }, - CastShadows = 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 } -} -local COLORS = { "White", "Orange", "Green", "Red" } -function onLoad() - self.createButton({ - click_function = "findCampaignFromToken", - function_owner = self, - label = "Import", - tooltip = "Load in a campaign save from a token!\n\n(Token can be anywhere on the table, but ensure there is only 1!)", - position = { x = -1, y = 0.2, z = 0 }, - font_size = 400, - width = 1400, - height = 600, - scale = { 0.5, 1, 0.5 }, - }) - self.createButton({ - click_function = "createCampaignToken", - function_owner = self, - label = "Export", - tooltip = "Create a campaign save token!\n\n(Ensure all chaos tokens have been unsealed!)", - position = { x = 1, y = 0.2, z = 0 }, - font_size = 400, - width = 1400, - height = 600, - scale = { 0.5, 1, 0.5 }, - }) -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 + }) ---------------------------------------------------------- --- main import functions (split up to allow for Wait conditions) ---------------------------------------------------------- - --- Identifies import token, determines campaign box and downloads it (if needed) -function findCampaignFromToken(_, _, _) - local coin = nil - local coinObjects = getObjectsWithTag("ImporterToken") - if #coinObjects == 0 then - broadcastToAll("Could not find importer token", Color.Red) - elseif #coinObjects > 1 then - broadcastToAll("More than 1 importer token found. Please delete all but 1 importer token", Color.Yellow) - else - coin = coinObjects[1] - - local importData = JSON.decode(coin.getGMNotes()) - campaignBoxGUID = importData["box"] - - local campaignBox = getObjectFromGUID(campaignBoxGUID) - if campaignBox.type == "Generic" then - campaignBox.call("buttonClick_download") - end - Wait.condition( - function() - if #campaignBox.getObjects() > 0 then - placeCampaignFromToken(importData) - else - createCampaignFromToken(importData) - end - end, - function() - local obj = getObjectFromGUID(campaignBoxGUID) - if obj == nil then - return false - else - return obj.type == "Bag" and obj.getLuaScript() ~= "" - end - end, - 2, - function() broadcastToAll("Error loading campaign box") end - ) - end -end - --- After box has been downloaded, places content on table -function placeCampaignFromToken(importData) - getObjectFromGUID(importData["box"]).call("buttonClick_place") - Wait.condition( - function() createCampaignFromToken(importData) end, - function() return findUniqueObjectWithTag("CampaignLog") ~= nil end, - 2, - function() broadcastToAll("Error placing campaign box") end - ) -end - --- After content is placed on table, conducts all the other import operations -function createCampaignFromToken(importData) - -- destroy existing campaign log and load saved campaign log - findUniqueObjectWithTag("CampaignLog").destruct() - spawnObjectData({ data = importData["log"] }) - - chaosBagApi.setChaosBagState(importData["bag"]) - - -- populate trauma values - if importData["trauma"] then - setTrauma(importData["trauma"]) - end - - -- populate ArkhamDB deck IDs - if importData["decks"] then - deckImporterApi.setUiState(importData["decks"]) - end - - playAreaApi.setInvestigatorCount(importData["clueCount"]) - - -- set campaign guide page - local guide = findUniqueObjectWithTag("CampaignGuide") - if guide then - Wait.condition( - -- Called after the condition function returns true - function() log("Campaign Guide import successful!") end, - -- Condition function that is called continiously until returs true or timeout is reached - function() return guide.Book.setPage(importData["guide"]) end, - -- Amount of time in seconds until the Wait times out - 1, - -- Called if the Wait times out - function() log("Campaign Guide import failed!") end - ) - end - - Wait.time(function() optionPanelApi.loadSettings(importData["options"]) end, 0.5) - - -- destroy Tour Starter token - local tourStarter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "TourStarter") - tourStarter.destruct() - - -- restore PlayArea image - playAreaApi.updateSurface(importData["playmat"]) - - broadcastToAll("Campaign successfully imported!", Color.Green) -end - --- Creates a campaign token with save data encoded into GM Notes based on the current state of the table -function createCampaignToken(_, playerColor, _) - -- clean up chaos tokens - blessCurseApi.removeAll(playerColor) - chaosBagApi.releaseAllSealedTokens(playerColor) - - -- find active campaign - local campaignBox - for _, obj in ipairs(getObjectsWithTag("CampaignBox")) do - if obj.type == "Bag" and #obj.getObjects() == 0 then - if not campaignBox then - campaignBox = obj - else - broadcastToAll("Multiple empty campaign box detected; delete all but one.", Color.Red) - return + -- 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 - end - if not campaignBox then - broadcastToAll("Campaign box with all placed objects not found!", Color.Red) - return + return objList end - local campaignLog = findUniqueObjectWithTag("CampaignLog") - if campaignLog == nil then - broadcastToAll("Campaign log not found!", Color.Red) - return + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - local traumaValues = { - 0, 0, 0, 0, - 0, 0, 0, 0 - } - local counterData = campaignLog.getVar("ref_buttonData") - if counterData ~= nil then - printToAll("Trauma values found in campaign log!", "Green") - for i = 1, 10, 3 do - traumaValues[1 + (i - 1) / 3] = counterData.counter[i].value - traumaValues[5 + (i - 1) / 3] = counterData.counter[i + 1].value - end - else - printToAll("Trauma values could not be found in campaign log!", "Yellow") - printToAll("Default values for health and sanity loaded.", "Yellow") + -- 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 - local campaignGuide = findUniqueObjectWithTag("CampaignGuide") - if campaignGuide == nil then - broadcastToAll("Campaign guide not found!", Color.Red) - return + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) end - local campaignData = { - box = campaignBox.getGUID(), - log = campaignLog.getData(), - bag = chaosBagApi.getChaosBagState(), - trauma = traumaValues, - decks = deckImporterApi.getUiState(), - clueCount = playAreaApi.getInvestigatorCount(), - guide = campaignGuide.Book.getPage(), - options = optionPanelApi.getOptions(), - playmat = playAreaApi.getSurface() - } - campaignTokenData.GMNotes = JSON.encode(campaignData) - campaignTokenData.Nickname = os.date("%b %d ") .. campaignBox.getName() .. " Save" - spawnObjectData({ data = campaignTokenData }) - broadcastToAll("Campaign successfully exported! Save coin object to import on a fresh save", Color.Green) -end - ---------------------------------------------------------- --- helper functions ---------------------------------------------------------- - -function findUniqueObjectWithTag(tag) - local objects = getObjectsWithTag(tag) - if not objects then return end - - if #objects == 1 then - return objects[1] - else - broadcastToAll("More than 1 " .. tag .. " detected; delete all but one.", Color.Red) - return nil - end -end - -function setTrauma(trauma) - for i = 1, 4 do - playmatApi.updateCounter(COLORS[i], "DamageCounter", trauma[i]) - playmatApi.updateCounter(COLORS[i], "HorrorCounter", trauma[i + 4]) - end -end -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") + -- 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 - -- 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) - getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) - end - - return BlessCurseManagerApi + return SearchLib end end) __bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -561,7 +577,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -580,6 +596,12 @@ do 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) @@ -596,8 +618,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -636,13 +658,44 @@ do 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 @@ -737,6 +790,26 @@ do 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) @@ -822,6 +895,15 @@ do 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 @@ -831,6 +913,22 @@ do 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) @@ -841,7 +939,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -870,4 +968,105 @@ do 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 ImporterExporter 334ee3.yaml b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.yaml index 6b9b8edcb..2bf3355f4 100644 --- a/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.yaml +++ b/unpacked/Custom_Tile Campaign ImporterExporter 334ee3.yaml @@ -2,6 +2,11 @@ AltLookAngle: x: 0 y: 0 z: 0 +AttachedSnapPoints: +- Position: + x: -0.95 + y: 0.2 + z: 0 Autoraise: true ColorDiffuse: b: 1 @@ -24,14 +29,15 @@ Description: 'Saves the state of the table to enable loading the campaign into a This tool will track which campaign you''re playing, the entire contents of your campaign log, the contents of your chaos bag, update your health/sanity according to trauma, your ArkhamDB deck IDs, the number of investigators, the page of your - campaign guide, and any options you have selected in the options panel. + campaign guide, cards in the Additional Player Cards bag and any options you have + selected in the options panel. For saving trauma values to correct seats, ensure investigators in the campaign log are in the following order: White, Orange, Green, Red - (For custom campaigns, ensure: 1) Campaign Box, Campaign Log, and Campaign Guide + For custom campaigns, ensure: 1) Campaign Box, Campaign Log, and Campaign Guide each have the corresponding tag, 2)The Campaign Box is on the table when you import or export.' DragSelectable: true diff --git a/unpacked/Custom_Tile Mythos Area 9f334f.ttslua b/unpacked/Custom_Tile Mythos Area 9f334f.ttslua index 23c2cd01a..931723ea3 100644 --- a/unpacked/Custom_Tile Mythos Area 9f334f.ttslua +++ b/unpacked/Custom_Tile Mythos Area 9f334f.ttslua @@ -42,8 +42,10 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) __bundle_register("core/MythosArea", function(require, _LOADED, __bundle_register, __bundle_modules) +local deckLib = require("util/DeckLib") local guidReferenceApi = require("core/GUIDReferenceApi") local playAreaApi = require("core/PlayAreaApi") +local searchLib = require("util/SearchLib") local tokenArrangerApi = require("accessories/TokenArrangerApi") local tokenChecker = require("core/token/TokenChecker") local tokenSpawnTrackerApi = require("core/token/TokenSpawnTrackerApi") @@ -61,16 +63,9 @@ 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 - --- scenario metadata local currentScenario, useFrontData, tokenData - --- object references local TRASH, DATA_HELPER --- we use this to turn off collision handling until onLoad() is complete -local collisionEnabled = false - function onLoad(saveState) if saveState ~= nil then local loadedState = JSON.decode(saveState) or {} @@ -80,7 +75,6 @@ function onLoad(saveState) end TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - collisionEnabled = true end function onSave() @@ -91,9 +85,12 @@ function onSave() }) end +--------------------------------------------------------- +-- collison and container event handling +--------------------------------------------------------- + -- 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 if object.getName() == "Scenario" then @@ -126,7 +123,6 @@ end -- TTS event handler. Handles scenario name event triggering function onCollisionExit(collisionInfo) - if not collisionEnabled then return end local object = collisionInfo.collision_object -- reset token metadata if scenario reference card is removed @@ -148,8 +144,15 @@ end -- fires if the scenario title changes function fireScenarioChangedEvent() + -- maybe show the title splash screen Wait.frames(function() Global.call('titleSplash', currentScenario) end, 20) + + -- set the scenario for the playarea (connections might be disabled) playAreaApi.onScenarioChanged(currentScenario) + + -- maybe update the playarea image + local playAreaImageSelector = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaImageSelector") + playAreaImageSelector.call("maybeUpdatePlayAreaImage", currentScenario) end -- fires if the scenario title or the difficulty changes @@ -173,36 +176,35 @@ end -- gets the encounter deck (for internal functions and Api calls) function getEncounterDeck() - local search = searchArea(ENCOUNTER_DECK_POS, { 3, 1, 4 }, isCardOrDeck) + local searchResult = searchLib.atPosition(ENCOUNTER_DECK_POS, "isCardOrDeck") - for _, v in ipairs(search) do - local obj = v.hit_object - if obj.type == 'Deck' then - return obj - end - end - - -- if no deck was found, return the first hit (a card) - if #search > 0 then - return search[1].hit_object + if #searchResult > 0 then + return searchResult[1] end end -- 'params' contains the position, rotation and a boolean to force a faceup draw function drawEncounterCard(params) - local card - local deck = getEncounterDeck() + local encounterDeck = getEncounterDeck() - if deck then - if deck.type == "Deck" then - card = deck.takeObject() + if encounterDeck then + reshuffledAlready = false + local card + if encounterDeck.type == "Deck" then + card = encounterDeck.takeObject() else - card = deck + card = encounterDeck end actualEncounterCardDraw(card, params) else -- nothing here, time to reshuffle - reshuffleEncounterDeck(params) + if reshuffledAlready == true then + reshuffledAlready = false + return + end + reshuffleEncounterDeck() -- if there is no discard pile either, reshuffleEncounterDeck will give an error message already + reshuffledAlready = true + drawEncounterCard(params) end end @@ -214,40 +216,49 @@ function actualEncounterCardDraw(card, params) faceUpRotation = 180 end end - card.setPositionSmooth(params.pos, false, false) - card.setRotationSmooth({ 0, params.rotY, faceUpRotation }, false, false) + + local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625} + local pos = params.mat.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) + local rotY = params.mat.getRotation().y + + deckLib.placeOrMergeIntoDeck(card, pos, { 0, rotY, faceUpRotation }) end -function reshuffleEncounterDeck(params) +function reshuffleEncounterDeck() -- flag to avoid multiple calls if isReshuffling then return end isReshuffling = true - - -- shuffle and flip deck, draw card after completion - local discarded = searchArea(ENCOUNTER_DISCARD_POSITION, { 3, 1, 4 }, isDeck) - if #discarded > 0 then - local deck = discarded[1].hit_object - if not deck.is_face_down then deck.flip() end - deck.shuffle() - deck.setPositionSmooth(Vector(ENCOUNTER_DECK_POS) + Vector(0, 2, 0), false, true) - Wait.time(function() actualEncounterCardDraw(deck.takeObject({ index = 0 }), params) end, 0.5) + local encounterDeck = getEncounterDeck() + local discardPile = searchLib.atPosition(ENCOUNTER_DISCARD_POSITION, "isCardOrDeck") + + if #discardPile > 0 then + local discardDeck = discardPile[1] + if not discardDeck.is_face_down then --flips discard pile + discardDeck.setRotation({0, -90, 180}) + end + if encounterDeck == nil then + discardDeck.setPosition(Vector(ENCOUNTER_DECK_POS) + Vector({0, 1, 0})) + discardDeck.shuffle() + else + encounterDeck.putObject(discardDeck) + encounterDeck.shuffle() + end + broadcastToAll("Shuffled encounter discard into deck.", "White") else - printToAll("Couldn't find encounter discard pile to reshuffle.", { 1, 0, 0 }) + broadcastToAll("Encounter discard pile is already empty.", "Red") end -- disable flag Wait.time(function() isReshuffling = false end, 1) end - --------------------------------------------------------- -- helper functions --------------------------------------------------------- --- 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 --- bounds definition. ----@return Boolean. True if the point is in the area defined by bounds +-- 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 function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -257,8 +268,7 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) - for _, v in ipairs(searchArea(object.getPosition(), { 3, 1, 4 })) do - local obj = v.hit_object + for _, obj in ipairs(searchLib.onObject(object)) do if obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and @@ -270,35 +280,6 @@ function removeTokensFromObject(object) end end end - --- searches an area and optionally filters the result -function searchArea(origin, size, filter) - local objList = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = self.getRotation(), - type = 3, - size = size, - max_distance = 1 - }) - - if filter then - local filteredList = {} - for _, obj in ipairs(objList) do - if filter(obj.hit_object) then - table.insert(filteredList, obj) - end - end - return filteredList - else - return objList - end -end - --- filter functions for searchArea -function isDeck(x) return x.tag == 'Deck' end - -function isCardOrDeck(x) return x.tag == 'Card' or x.tag == 'Deck' end end) __bundle_register("accessories/TokenArrangerApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -316,7 +297,7 @@ do end -- updates the token modifiers with the provided data - ---@param tokenData Table Contains the chaos token metadata + ---@param fullData Table Contains the chaos token metadata TokenArrangerApi.onTokenDataChanged = function(fullData) callIfExistent("onTokenDataChanged", fullData) end @@ -334,6 +315,126 @@ 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 = {} @@ -361,6 +462,18 @@ do 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) @@ -413,6 +526,16 @@ do 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) @@ -421,7 +544,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -550,7 +673,4 @@ do return TokenSpawnTracker end end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/MythosArea") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile Mythos Area 9f334f.xml b/unpacked/Custom_Tile Mythos Area 9f334f.xml new file mode 100644 index 000000000..4d2625ffc --- /dev/null +++ b/unpacked/Custom_Tile Mythos Area 9f334f.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/unpacked/Custom_Tile Mythos Area 9f334f.yaml b/unpacked/Custom_Tile Mythos Area 9f334f.yaml index e541aef50..d909ad948 100644 --- a/unpacked/Custom_Tile Mythos Area 9f334f.yaml +++ b/unpacked/Custom_Tile Mythos Area 9f334f.yaml @@ -34,6 +34,10 @@ CustomImage: ImageSecondaryURL: '' ImageURL: http://cloud-3.steamusercontent.com/ugc/952965089462071147/F586DAA07E810B16A62C23AE2EA526BE3C7FD7FB/ WidthScale: 0 +CustomUIAssets: +- Name: font_teutonic-arkham + Type: 1 + URL: http://cloud-3.steamusercontent.com/ugc/2027213118467703445/89328E273B4C5180BF491516CE998DE3C604E162/ Description: '' DragSelectable: true GMNotes: '' @@ -66,4 +70,4 @@ Transform: scaleY: 1 scaleZ: 6.5 Value: 0 -XmlUI: '' +XmlUI: !include 'Custom_Tile Mythos Area 9f334f.xml' diff --git a/unpacked/Custom_Tile Player Cards 2d30ee.ttslua b/unpacked/Custom_Tile Player Cards 2d30ee.ttslua index 88cccd8aa..84f0b6e99 100644 --- a/unpacked/Custom_Tile Player Cards 2d30ee.ttslua +++ b/unpacked/Custom_Tile Player Cards 2d30ee.ttslua @@ -41,628 +41,251 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) -__bundle_register("arkhamdb/ArkhamDb", 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 allCardsBagApi = require("playercards/AllCardsBagApi") - local playAreaApi = require("core/PlayAreaApi") - - local ArkhamDb = { } + + local SpawnBag = { } local internal = { } - local RANDOM_WEAKNESS_ID = "01000" + -- To assist debugging, will draw a box around the recall zone when it's set up + local SHOW_RECALL_ZONE = false - local tabooList = { } - --Forward declaration - ---@type Request - local Request = {} - local configuration + -- Distance to expand the recall zone around any added object. + local RECALL_BUFFER_X = 0.9 + local RECALL_BUFFER_Z = 0.5 - -- Sets up the ArkhamDb interface. Should be called from the parent object on load. - ArkhamDb.initialize = function() - configuration = internal.getConfiguration() - 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 - cards[card.code] = true - end - - tabooList[taboo.id] = { - date = taboo.date_start, - cards = cards - } - end - return true, nil - end) - end - - -- 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 - --- investigatorCode String. ID of the investigator in this deck - --- customizations Table. The decoded table of customization upgrades in this deck - --- playerColor String. Color this deck is being loaded for - ArkhamDb.getDecklist = function( - playerColor, - deckId, - isPrivate, - loadNewest, - loadInvestigators, - callback) - -- Get a simple card to see if the bag indexes are complete. If not, abort - -- the deck load. The called method will handle player notification. - local checkCard = allCardsBagApi.getCardById("01001") - if (checkCard ~= nil and checkCard.data == nil) then - return - end - - 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" }) - end - local json = JSON.decode(status.text) - - if not json then - internal.maybePrint("Deck ID " .. deckId .. " not found", playerColor) - return false, "Deck not found!" - end - - return true, json - end) - - deck:with(internal.onDeckResult, playerColor, loadNewest, loadInvestigators, callback) - end - - -- 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 - ArkhamDb.logCardNotFound = function(cardId, playerColor) - local request = Request.start({ - configuration.api_uri, - configuration.cards, - cardId + -- 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, }, - function(result) - local adbCardInfo = JSON.decode(internal.fixUtf16String(result.text)) - local cardName = adbCardInfo.real_name - if (cardName ~= nil) then - if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then - cardName = cardName .. " (" .. adbCardInfo.xp .. ")" - end - internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) - else - internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) - end - end) - end - - -- Callback when the deck information is received from ArkhamDB. Parses the - -- 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 - --- 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 - --- 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 - if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then - buildDeck(playerColor, deck.next_deck) - return - end - - internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor) - - -- Initialize deck slot table and perform common transformations. The order of these should not - -- be changed, as later steps may act on cards added in each. For example, a random weakness or - -- investigator may have bonded cards or taboo entries, and should be present - local slots = deck.slots - internal.maybeDrawRandomWeakness(slots, playerColor) - local loadAltInvestigator = "normal" - if loadInvestigators then - loadAltInvestigator = internal.addInvestigatorCards(deck, slots) - end - - internal.maybeAddSummonedServitor(slots) - internal.maybeAddOnTheMend(slots, playerColor) - internal.maybeAddRealityAcidReference(slots) - local bondList = internal.extractBondedCards(slots) - internal.checkTaboos(deck.taboo_id, slots, playerColor) - internal.maybeAddUpgradeSheets(slots) - - -- get upgrades for customizable cards - local customizations = {} - if deck.meta then - customizations = JSON.decode(deck.meta) - end - - callback(slots, deck.investigator_code, bondList, customizations, playerColor, loadAltInvestigator) - end - - -- 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 - --- of those cards which will be spawned - ---@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 - slots[RANDOM_WEAKNESS_ID] = nil - - if randomWeaknessAmount ~= 0 then - for i=1, randomWeaknessAmount do - local weaknessId = allCardsBagApi.getRandomWeaknessId() - slots[weaknessId] = (slots[weaknessId] or 0) + 1 - end - internal.maybePrint("Added " .. randomWeaknessAmount .. " random basic weakness(es) to deck", playerColor) - end - 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 - --- 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 - local altFrontId = tonumber(deckMeta.alternate_front) or 0 - local altBackId = tonumber(deckMeta.alternate_back) or 0 - local altArt = { front = "normal", back = "normal" } - - -- translating front ID - if altFrontId > 90000 and altFrontId < 90100 then - altArt.front = "parallel" - elseif altFrontId > 01500 and altFrontId < 01506 then - altArt.front = "revised" - elseif altFrontId > 98000 then - altArt.front = "promo" - end - - -- translating back ID - if altBackId > 90000 and altBackId < 90100 then - altArt.back = "parallel" - elseif altBackId > 01500 and altBackId < 01506 then - altArt.back = "revised" - elseif altBackId > 98000 then - altArt.back = "promo" - end - - -- updating investigatorID based on alt investigator selection - -- precedence: parallel > promo > revised - if altArt.front == "parallel" then - if altArt.back == "parallel" then - investigatorId = investigatorId .. "-p" - else - investigatorId = investigatorId .. "-pf" - end - elseif altArt.back == "parallel" then - investigatorId = investigatorId .. "-pb" - elseif altArt.front == "promo" or altArt.back == "promo" then - loadAltInvestigator = "promo" - elseif altArt.front == "revised" or altArt.back == "revised" then - loadAltInvestigator = "revised" - end - end - slots[investigatorId] = 1 - deck.investigator_code = investigatorId - return loadAltInvestigator - 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 - -- of those cards which will be spawned - internal.maybeAddUpgradeSheets = function(slots) - for cardId, _ in pairs(slots) do - -- upgrade sheets for customizable cards - local upgradesheet = allCardsBagApi.getCardById(cardId .. "-c") - if upgradesheet ~= nil then - slots[cardId .. "-c"] = 1 - end - end - end - - -- 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 - -- of those cards which will be spawned - internal.maybeAddSummonedServitor = function(slots) - if slots["09080"] ~= nil then - slots["09080-m"] = 1 - end - end - - -- 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 - -- 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 - internal.maybeAddOnTheMend = function(slots, playerColor) - if slots["09006"] ~= nil then - local investigatorCount = playAreaApi.getInvestigatorCount() - if investigatorCount ~= nil then - slots["09006"] = investigatorCount - else - internal.maybePrint("Something went wrong with the load, adding 4 copies of On the Mend", playerColor) - slots["09006"] = 4 - end - end - 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 - -- of those cards which will be spawned - internal.maybeAddRealityAcidReference = function(slots) - if slots["89004"] ~= nil then - slots["89005"] = 1 - 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 - internal.extractBondedCards = function(slots) - -- Create a list of bonded cards first so we don't modify slots while iterating - local bondedCards = { } - local bondedList = { } - for cardId, cardCount in pairs(slots) do - local card = allCardsBagApi.getCardById(cardId) - if (card ~= nil and card.metadata.bonded ~= nil) then - for _, bond in ipairs(card.metadata.bonded) do - -- add a bonded card for each copy of the parent card (except for Pendant of the Queen) - if bond.id == "06022" then - bondedCards[bond.id] = bond.count - else - bondedCards[bond.id] = bond.count * cardCount - end - -- We need to know which cards are bonded to determine their position, remember them - bondedList[bond.id] = true - -- Also adding taboo versions of bonded cards to the list - bondedList[bond.id .. "-t"] = true - end - end - end - -- Add any bonded cards to the main slots list - for bondedId, bondedCount in pairs(bondedCards) do - slots[bondedId] = bondedCount - end - - return bondedList - 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 - internal.checkTaboos = function(tabooId, slots, playerColor) - if tabooId then - for cardId, _ in pairs(tabooList[tabooId].cards) do - if slots[cardId] ~= nil then - -- Make sure there's a taboo version of the card before we replace it - -- SCED only maintains the most recent taboo cards. If a deck is using - -- an older taboo list it's possible the card isn't a taboo any more - local tabooCard = allCardsBagApi.getCardById(cardId .. "-t") - if tabooCard == nil then - local basicCard = allCardsBagApi.getCardById(cardId) - internal.maybePrint("Taboo version for " .. basicCard.data.Nickname .. " is not available. Using standard version", playerColor) - else - slots[cardId .. "-t"] = slots[cardId] - slots[cardId] = nil - end - end - end - end - end - - internal.maybePrint = function(message, playerColor) - if playerColor ~= "None" then - printToAll(message, playerColor) - end - end - - -- Gets the ArkhamDB config info from the configuration object. - ---@return Table. Configuration data - internal.getConfiguration = function() - local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") - printPriority = configuration.priority - return configuration - end - - internal.fixUtf16String = function(str) - return str:gsub("\\u(%w%w%w%w)", function(match) - return string.char(tonumber(match, 16)) - end) - end - - ---@type Request - Request = { - is_done = false, - is_successful = false + ColorDiffuse = { + r = 0, + g = 0, + b = 0, + a = 0, + }, + Locked = true, + Grid = true, + Snap = false, + Tooltip = 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) - ---@return Request - function Request:new(uri, configure) - local this = {} + -- Tracks what has been placed by this "bag" so they can be recalled + local placedSpecs = { } + local placedObjectGuids = { } + local recallZone = nil - setmetatable(this, self) - self.__index = self + -- 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 - if type(uri) == "table" then - uri = table.concat(uri, "/") + -- 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 - this.uri = uri - - WebRequest.get(uri, function(status) - configure(this, status) - end) - - return this + -- 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 - -- 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[] - ---@return Request - function Request.deferred(uri, on_success, on_error, ...) - local parameters = table.pack(...) - return Request:new(uri, function(request, status) - if (status.is_done) then - if (status.is_error) then - request.error_message = on_error and on_error(status, table.unpack(parameters)) or status.error - request.is_successful = false - request.is_done = true - else - on_success(request, status) + -- 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 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[] - ---@return Request - function Request.start(uri, on_success, on_error, ...) - local parameters = table.pack(...) - return Request.deferred(uri, function(request, status) - local result, message = on_success(status, table.unpack(parameters)) - if not result then request.error_message = message else request.content = message end - request.is_successful = result - request.is_done = true - end, on_error, table.unpack(parameters)) + -- 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 - ---@param requests Request[] - ---@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 = {} + -- 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 - ---@type Request[] - local errors = {} - - for _, request in ipairs(requests) do - if request.is_successful then - table.insert(results, request.content) - else - table.insert(errors, request) - 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 - if (#errors <= 0) then - on_success(results, table.unpack(parameters)) - elseif on_error == nil then - for _, request in ipairs(errors) do - internal.maybePrint(table.concat({ "[ERROR]", request.uri, ":", request.error_message })) - end - else - on_error(requests, table.unpack(parameters)) - end - end, function() - for _, request in ipairs(requests) do - if not request.is_done then return false 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) + 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 - ---@param callback fun(content: any, vararg any) - function Request:with(callback, ...) - local arguments = table.pack(...) - Wait.condition(function() - if self.is_successful then - callback(self.content, table.unpack(arguments)) - end - end, function() return self.is_done - end) + internal.reverseList = function(list) + local reversed = { } + for i = 1, #list do + reversed[i] = list[#list - i + 1] + end + + return reversed end - return ArkhamDb -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 - - -- 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 matchTypes 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 - - -- 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 - - return GUIDReferenceApi + return SpawnBag end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1121,8 +744,7 @@ function spawnInvestigators(groupName) local position = getInvestigatorRowStartPos(investigatorCount, row) for i, investigatorName in ipairs(INVESTIGATOR_GROUPS[groupName]) do - for _, spawnSpec in ipairs(buildInvestigatorSpawnSpec( - investigatorName, INVESTIGATORS[investigatorName], position, false)) do + for _, spawnSpec in ipairs(buildInvestigatorSpawnSpec(investigatorName, INVESTIGATORS[investigatorName], position)) do spawnBag.spawn(spawnSpec) end position:add(investigatorPositionShiftCol) @@ -1427,6 +1049,533 @@ function spawnRandomWeakness() }) 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 RANDOM_WEAKNESS_ID = "01000" + + local tabooList = { } + --Forward declaration + ---@type Request + local Request = {} + local configuration + + -- Sets up the ArkhamDb interface. Should be called from the parent object on load. + ArkhamDb.initialize = function() + configuration = internal.getConfiguration() + 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 + cards[card.code] = true + end + + tabooList[taboo.id] = { + date = taboo.date_start, + cards = cards + } + end + return true, nil + end) + end + + -- 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 + --- investigatorCode String. ID of the investigator in this deck + --- customizations Table. The decoded table of customization upgrades in this deck + --- playerColor String. Color this deck is being loaded for + ArkhamDb.getDecklist = function( + playerColor, + deckId, + isPrivate, + loadNewest, + loadInvestigators, + callback) + -- Get a simple card to see if the bag indexes are complete. If not, abort + -- the deck load. The called method will handle player notification. + local checkCard = allCardsBagApi.getCardById("01001") + if (checkCard ~= nil and checkCard.data == nil) then + return + end + + 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" }) + end + local json = JSON.decode(status.text) + + if not json then + internal.maybePrint("Deck ID " .. deckId .. " not found", playerColor) + return false, "Deck not found!" + end + + return true, json + end) + + deck:with(internal.onDeckResult, playerColor, loadNewest, loadInvestigators, callback) + end + + -- 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 + ArkhamDb.logCardNotFound = function(cardId, playerColor) + local request = Request.start({ + configuration.api_uri, + configuration.cards, + cardId + }, + function(result) + local adbCardInfo = JSON.decode(internal.fixUtf16String(result.text)) + local cardName = adbCardInfo.real_name + if (cardName ~= nil) then + if (adbCardInfo.xp ~= nil and adbCardInfo.xp > 0) then + cardName = cardName .. " (" .. adbCardInfo.xp .. ")" + end + internal.maybePrint("Card not found: " .. cardName .. ", ArkhamDB ID " .. cardId, playerColor) + else + internal.maybePrint("Card not found in ArkhamDB, ID " .. cardId, playerColor) + end + end) + end + + -- Callback when the deck information is received from ArkhamDB. Parses the + -- 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 + --- 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 + --- 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 + if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then + buildDeck(playerColor, deck.next_deck) + return + end + + internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor) + + -- Initialize deck slot table and perform common transformations. The order of these should not + -- be changed, as later steps may act on cards added in each. For example, a random weakness or + -- investigator may have bonded cards or taboo entries, and should be present + local slots = deck.slots + internal.maybeDrawRandomWeakness(slots, playerColor) + local loadAltInvestigator = "normal" + if loadInvestigators then + loadAltInvestigator = internal.addInvestigatorCards(deck, slots) + end + + internal.maybeModifyDeckFromDescription(slots, deck.description_md) + internal.maybeAddSummonedServitor(slots) + internal.maybeAddOnTheMend(slots, playerColor) + internal.maybeAddRealityAcidReference(slots) + local bondList = internal.extractBondedCards(slots) + internal.checkTaboos(deck.taboo_id, slots, playerColor) + internal.maybeAddUpgradeSheets(slots) + + -- get upgrades for customizable cards + local customizations = {} + if deck.meta then + customizations = JSON.decode(deck.meta) + end + + callback(slots, deck.investigator_code, bondList, customizations, playerColor, loadAltInvestigator) + end + + -- 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 + --- of those cards which will be spawned + ---@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 + slots[RANDOM_WEAKNESS_ID] = nil + + if randomWeaknessAmount ~= 0 then + for i=1, randomWeaknessAmount do + local weaknessId = allCardsBagApi.getRandomWeaknessId() + slots[weaknessId] = (slots[weaknessId] or 0) + 1 + end + internal.maybePrint("Added " .. randomWeaknessAmount .. " random basic weakness(es) to deck", playerColor) + end + 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 + --- 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 + local altFrontId = tonumber(deckMeta.alternate_front) or 0 + local altBackId = tonumber(deckMeta.alternate_back) or 0 + local altArt = { front = "normal", back = "normal" } + + -- translating front ID + if altFrontId > 90000 and altFrontId < 90100 then + altArt.front = "parallel" + elseif altFrontId > 01500 and altFrontId < 01506 then + altArt.front = "revised" + elseif altFrontId > 98000 then + altArt.front = "promo" + end + + -- translating back ID + if altBackId > 90000 and altBackId < 90100 then + altArt.back = "parallel" + elseif altBackId > 01500 and altBackId < 01506 then + altArt.back = "revised" + elseif altBackId > 98000 then + altArt.back = "promo" + end + + -- updating investigatorID based on alt investigator selection + -- precedence: parallel > promo > revised + if altArt.front == "parallel" then + if altArt.back == "parallel" then + investigatorId = investigatorId .. "-p" + else + investigatorId = investigatorId .. "-pf" + end + elseif altArt.back == "parallel" then + investigatorId = investigatorId .. "-pb" + elseif altArt.front == "promo" or altArt.back == "promo" then + loadAltInvestigator = "promo" + elseif altArt.front == "revised" or altArt.back == "revised" then + loadAltInvestigator = "revised" + end + end + slots[investigatorId] = 1 + deck.investigator_code = investigatorId + return loadAltInvestigator + 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 + -- of those cards which will be spawned + internal.maybeAddUpgradeSheets = function(slots) + for cardId, _ in pairs(slots) do + -- upgrade sheets for customizable cards + local upgradesheet = allCardsBagApi.getCardById(cardId .. "-c") + if upgradesheet ~= nil then + slots[cardId .. "-c"] = 1 + end + end + end + + -- 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 + -- of those cards which will be spawned + internal.maybeAddSummonedServitor = function(slots) + if slots["09080"] ~= nil then + slots["09080-m"] = 1 + end + end + + -- 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 + -- 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 + internal.maybeAddOnTheMend = function(slots, playerColor) + if slots["09006"] ~= nil then + local investigatorCount = playAreaApi.getInvestigatorCount() + if investigatorCount ~= nil then + slots["09006"] = investigatorCount + else + internal.maybePrint("Something went wrong with the load, adding 4 copies of On the Mend", playerColor) + slots["09006"] = 4 + end + end + 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 + -- of those cards which will be spawned + internal.maybeAddRealityAcidReference = function(slots) + if slots["89004"] ~= nil then + slots["89005"] = 1 + end + 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) + -- 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) + + -- parse each line in instructions + for line in tempStr:gmatch("([^\n]+)") do + -- remove dashes at the start + line = line:gsub("%- ", "") + + -- remove spaces + line = line:gsub("%s", "") + + -- get instructor + local instructor = "" + for word in line:gmatch("%a+:") do + instructor = word + break + end + + if instructor == "" or (instructor ~= "add:" and instructor ~= "remove:") then return 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) + end + end + 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 + internal.extractBondedCards = function(slots) + -- Create a list of bonded cards first so we don't modify slots while iterating + local bondedCards = { } + local bondedList = { } + for cardId, cardCount in pairs(slots) do + local card = allCardsBagApi.getCardById(cardId) + if (card ~= nil and card.metadata.bonded ~= nil) then + for _, bond in ipairs(card.metadata.bonded) do + -- add a bonded card for each copy of the parent card (except for Pendant of the Queen) + if bond.id == "06022" then + bondedCards[bond.id] = bond.count + else + bondedCards[bond.id] = bond.count * cardCount + end + -- We need to know which cards are bonded to determine their position, remember them + bondedList[bond.id] = true + -- Also adding taboo versions of bonded cards to the list + bondedList[bond.id .. "-t"] = true + end + end + end + -- Add any bonded cards to the main slots list + for bondedId, bondedCount in pairs(bondedCards) do + slots[bondedId] = bondedCount + end + + return bondedList + 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 + internal.checkTaboos = function(tabooId, slots, playerColor) + if tabooId then + for cardId, _ in pairs(tabooList[tabooId].cards) do + if slots[cardId] ~= nil then + -- Make sure there's a taboo version of the card before we replace it + -- SCED only maintains the most recent taboo cards. If a deck is using + -- an older taboo list it's possible the card isn't a taboo any more + local tabooCard = allCardsBagApi.getCardById(cardId .. "-t") + if tabooCard == nil then + local basicCard = allCardsBagApi.getCardById(cardId) + internal.maybePrint("Taboo version for " .. basicCard.data.Nickname .. " is not available. Using standard version", playerColor) + else + slots[cardId .. "-t"] = slots[cardId] + slots[cardId] = nil + end + end + end + end + end + + internal.maybePrint = function(message, playerColor) + if playerColor ~= "None" then + printToAll(message, playerColor) + end + end + + -- Gets the ArkhamDB config info from the configuration object. + ---@return Table. Configuration data + internal.getConfiguration = function() + local configuration = getObjectsWithTag("import_configuration_provider")[1]:getTable("configuration") + printPriority = configuration.priority + return configuration + end + + internal.fixUtf16String = function(str) + return str:gsub("\\u(%w%w%w%w)", function(match) + return string.char(tonumber(match, 16)) + 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) + ---@return Request + function Request:new(uri, configure) + local this = {} + + setmetatable(this, self) + self.__index = self + + if type(uri) == "table" then + uri = table.concat(uri, "/") + end + + this.uri = uri + + 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[] + ---@return Request + function Request.deferred(uri, on_success, on_error, ...) + local parameters = table.pack(...) + return Request:new(uri, function(request, status) + if (status.is_done) then + if (status.is_error) then + request.error_message = on_error and on_error(status, table.unpack(parameters)) or status.error + request.is_successful = false + request.is_done = true + else + on_success(request, status) + end + end + 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[] + ---@return Request + function Request.start(uri, on_success, on_error, ...) + local parameters = table.pack(...) + return Request.deferred(uri, function(request, status) + local result, message = on_success(status, table.unpack(parameters)) + if not result then request.error_message = message else request.content = message end + request.is_successful = result + request.is_done = true + end, on_error, table.unpack(parameters)) + end + + ---@param requests Request[] + ---@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 + if request.is_successful then + table.insert(results, request.content) + else + table.insert(errors, request) + end + end + + if (#errors <= 0) then + on_success(results, table.unpack(parameters)) + elseif on_error == nil then + for _, request in ipairs(errors) do + internal.maybePrint(table.concat({ "[ERROR]", request.uri, ":", request.error_message })) + end + else + on_error(requests, table.unpack(parameters)) + end + end, function() + for _, request in ipairs(requests) do + if not request.is_done then return false end + end + return true + end) + end + + ---@param callback fun(content: any, vararg any) + function Request:with(callback, ...) + local arguments = table.pack(...) + Wait.condition(function() + if self.is_successful then + callback(self.content, table.unpack(arguments)) + end + end, function() return self.is_done + end) + end + + return ArkhamDb +end +end) __bundle_register("playercards/AllCardsBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local AllCardsBagApi = {} @@ -1519,6 +1668,8 @@ BONDED_CARD_LIST = { "06033", -- Augur "06331", -- Dream Parasite "06015a", -- Dream-Gate + "10006", -- Aetheric Current (Yuggoth) + "10007", -- Aetheric Current (Yoth) "10045" -- Uncanny Growth } @@ -1576,7 +1727,8 @@ INVESTIGATOR_GROUPS = { "Harvey Walters", "Amanda Sharpe", "Norman Withers", - "Vincent Lee" + "Vincent Lee", + "Kate Winthrop" }, ["Rogue"] = { "\"Skids\" O'Toole", @@ -1603,7 +1755,8 @@ INVESTIGATOR_GROUPS = { "Dexter Drake", "Lily Chen", "Amina Zidane", - "Gloria Goldberg" + "Gloria Goldberg", + "Kōhaku Narukami" }, ["Survivor"] = { "Wendy Adams", @@ -1615,7 +1768,8 @@ INVESTIGATOR_GROUPS = { "Stella Clark", "Silas Marsh", "Bob Jenkins", - "Darrell Simmons" + "Darrell Simmons", + "Hank Samson" }, ["Neutral"] = { "Lola Hayes", @@ -1697,13 +1851,16 @@ INVESTIGATOR_GROUPS = { "Charlie Kane" }, ["The Feast of Hemlock Vale"] = { + "Wilson Richards", + "Kate Winthrop", "Alessandra Zorzi", - "Wilson Richards" + "Kōhaku Narukami", + "Hank Samson" } } INVESTIGATORS = {} ---Core-- +-- Core Box INVESTIGATORS["Roland Banks"] = { cards = { "01001", "01001-p", "01001-pf", "01001-pb" }, minicards = { "01001-m" }, @@ -1734,7 +1891,7 @@ INVESTIGATORS["Wendy Adams"] = { signatures = { "01014", "01015", "01515", "90039", "90040", "90038" }, starterDeck = "2624949" } ---Dunwich-- +-- The Dunwich Legacy INVESTIGATORS["Zoey Samaras"] = { cards = { "02001", "02001-p", "02001-pf", "02001-pb" }, minicards = { "02001-m" }, @@ -1765,7 +1922,7 @@ INVESTIGATORS["\"Ashcan\" Pete"] = { signatures = { "02014", "02015", "90047", "90048" }, starterDeck = "2624969" } ---Carcosa-- +-- The Path to Carcosa INVESTIGATORS["Mark Harrigan"] = { cards = { "03001" }, minicards = { "03001-m" }, @@ -1802,7 +1959,7 @@ INVESTIGATORS["Lola Hayes"] = { signatures = { "03018", "03018", "03019", "03019", "03019-t", "03019-t" }, starterDeck = "2624990" } ---Forgotten-- +-- The Forgotten Age INVESTIGATORS["Leo Anderson"] = { cards = { "04001" }, minicards = { "04001-m" }, @@ -1833,7 +1990,7 @@ INVESTIGATORS["Calvin Wright"] = { signatures = { "04015", "04016" }, starterDeck = "2625007" } ---Circle-- +-- The Circle Undone INVESTIGATORS["Carolyn Fern"] = { cards = { "05001" }, minicards = { "05001-m" }, @@ -1870,7 +2027,7 @@ INVESTIGATORS["Marie Lambeau"] = { signatures = { "05018", "05019" }, starterDeck = "2626395" } ---Dream-- +-- The Dream-Eaters INVESTIGATORS["Tommy Muldoon"] = { cards = { "06001" }, minicards = { "06001-m" }, @@ -1901,7 +2058,7 @@ INVESTIGATORS["Patrice Hathaway"] = { signatures = { "06016", "06017" }, starterDeck = "2626461" } ---Starter-- +-- Starter Decks INVESTIGATORS["Nathaniel Cho"] = { cards = { "60101" }, minicards = { "60101-m" }, @@ -1932,7 +2089,7 @@ INVESTIGATORS["Stella Clark"] = { signatures = { "60502", "60502", "60502", "60503" }, starterDeck = "2643934" } ---Innsmouth-- +-- The Innsmouth Conspiracy INVESTIGATORS["Sister Mary"] = { cards = { "07001" }, minicards = { "07001-m" }, @@ -1963,7 +2120,7 @@ INVESTIGATORS["Silas Marsh"] = { signatures = { "07014", "07015", "07016", "98014", "98015" }, starterDeck = "2626685" } ---Edge-- +-- Edge of the Earth INVESTIGATORS["Daniela Reyes"] = { cards = { "08001" }, minicards = { "08001-m" }, @@ -1977,9 +2134,9 @@ INVESTIGATORS["Norman Withers"] = { starterDeck = "2634603" } INVESTIGATORS["Monterey Jack"] = { - cards = { "08007" }, + cards = { "08007", "08007-p", "08007-pf", "08007-pb" }, minicards = { "08007-m" }, - signatures = { "08008", "08009" }, + signatures = { "08008", "08009", "90063", "90064" }, starterDeck = "2634652" } INVESTIGATORS["Lily Chen"] = { @@ -1994,7 +2151,7 @@ INVESTIGATORS["Bob Jenkins"] = { signatures = { "08017", "08018" }, starterDeck = "2634643" } ---Scarlet-- +-- The Scarlet Keys INVESTIGATORS["Carson Sinclair"] = { cards = { "09001" }, minicards = { "09001-m" }, @@ -2031,27 +2188,45 @@ INVESTIGATORS["Charlie Kane"] = { signatures = { "09019", "09020" }, starterDeck = "2634706" } ---Hemlock Vale-- -INVESTIGATORS["Alessandra Zorzi"] = { - cards = { "10009" }, - minicards = { "10009-m" }, - signatures = { "10010", "10010", "10010", "10011" }, - starterDeck = "2643931" --winifred deck as placeholder -} +-- The Feast of Hemlock Vale INVESTIGATORS["Wilson Richards"] = { cards = { "10001" }, minicards = { "10001-m" }, signatures = { "10002", "10003" }, starterDeck = "2634667" --carson deck as placeholder } ---PnP-- +INVESTIGATORS["Kate Winthrop"] = { + cards = { "10004" }, + minicards = { "10004-m" }, + signatures = { "10005", "10006", "10007", "10008" }, + starterDeck = "2643928" --harvey deck as placeholder +} +INVESTIGATORS["Alessandra Zorzi"] = { + cards = { "10009" }, + minicards = { "10009-m" }, + signatures = { "10010", "10010", "10010", "10011" }, + starterDeck = "2643931" --winifred deck as placeholder +} +INVESTIGATORS["Kōhaku Narukami"] = { + cards = { "10012" }, + minicards = { "10012-m" }, + signatures = { "10013", "10014" }, + starterDeck = "2636199" --gloria deck as placeholder +} +INVESTIGATORS["Hank Samson"] = { + cards = { "10015", "10015-b1", "10015-b2" }, + minicards = { "10015-m" }, + signatures = { "10017", "10018"}, + starterDeck = "2643934" --stella deck as placeholder +} +-- PnP content INVESTIGATORS["Subject 5U-21"] = { cards = { "89001" }, minicards = { "89001-m" }, signatures = { "89002", "89003", "89003", "89003", "89004", "89004", "89004", "89005" }, starterDeck = "2624990" -- Lola's deck id until Suzi is on ArkhamDB } ---Promo-- +-- Promo content INVESTIGATORS["Gloria Goldberg"] = { cards = { "98019" }, minicards = { "98019-m" }, @@ -2060,251 +2235,168 @@ INVESTIGATORS["Gloria Goldberg"] = { } ------------------ END INVESTIGATOR DATA DEFINITION ------------------ end) -__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 +__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local allCardsBagApi = require("playercards/AllCardsBagApi") + local PlayAreaApi = {} + local guidReferenceApi = require("core/GUIDReferenceApi") - 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 + local function getPlayArea() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") 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, - } + local function getInvestigatorCounter() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") 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 + -- 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 - -- 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 + -- 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 - -- 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 + -- 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 - -- 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() + PlayAreaApi.shiftContentsDown = function(playerColor) + return getPlayArea().call("shiftContentsDown", playerColor) 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) + PlayAreaApi.shiftContentsLeft = function(playerColor) + return getPlayArea().call("shiftContentsLeft", playerColor) 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 + PlayAreaApi.shiftContentsRight = function(playerColor) + return getPlayArea().call("shiftContentsRight", playerColor) 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) + -- Reset the play area's tracking of which cards have had tokens spawned. + PlayAreaApi.resetSpawnedCards = function() + return getPlayArea().call("resetSpawnedCards") end - internal.reverseList = function(list) - local reversed = { } - for i = 1, #list do - reversed[i] = list[#list - i + 1] - end - - return reversed + -- Sets whether location connections should be drawn + PlayAreaApi.setConnectionDrawState = function(state) + getPlayArea().call("setConnectionDrawState", state) end - return SpawnBag + -- 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/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("playercards/PlayerCardSpawner", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -2441,7 +2533,7 @@ end -- "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 card: Data for the card to be inserted +---@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 diff --git a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua index 9114a7254..58ea5ed34 100644 --- a/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua +++ b/unpacked/Custom_Tile Playermat 1 White 8b081b.ttslua @@ -41,33 +41,257 @@ 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/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("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/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("__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") local guidReferenceApi = require("core/GUIDReferenceApi") local mythosAreaApi = require("core/MythosAreaApi") local navigationOverlayApi = require("core/NavigationOverlayApi") +local searchLib = require("util/SearchLib") local tokenChecker = require("core/token/TokenChecker") local tokenManager = require("core/token/TokenManager") --- set true to enable debug logging and show Physics.cast() -local DEBUG = false - -- we use this to turn off collision handling until onLoad() is complete local collisionEnabled = false --- position offsets relative to mat [x, y, z] -local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625} -local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58} - -- x-Values for discard buttons local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91} local SEARCH_AROUND_SELF_X_BUFFER = 8 --- defined areas for "inArea()" and "Physics.cast()" +-- defined areas for object searching local MAIN_PLAY_AREA = { upperLeft = { x = 1.98, @@ -148,7 +372,7 @@ function onSave() end function onLoad(saveState) - self.interactable = DEBUG + self.interactable = false -- get object references to owned objects ownedObjects = guidReferenceApi.getObjectsByOwner(matColor) @@ -206,29 +430,9 @@ end -- searches an area and optionally filters the result function searchArea(origin, size, filter) - local searchResult = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = self.getRotation(), - type = 3, - size = size, - max_distance = 0 - }) - - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or (filter and filter(v.hit_object)) then - table.insert(objList, v.hit_object) - end - end - return objList + return searchLib.inArea(origin, self.getRotation(), size, filter) end --- filter functions for searchArea() -function isCard(x) return x.type == 'Card' end -function isDeck(x) return x.type == 'Deck' end -function isCardOrDeck(x) return x.type == 'Card' or x.type == 'Deck' end - -- finds all objects on the playmat and associated set aside zone. function searchAroundSelf(filter) local bounds = self.getBoundsNormalized() @@ -277,16 +481,15 @@ end ---@param objList Table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do - if isCardOrDeck(obj) then + if obj.type == "Card" or obj.type == "Deck" then if obj.hasTag("PlayerCard") then - placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) else - placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) + deckLib.placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) end -- put chaos tokens back into bag (e.g. Unrelenting) elseif tokenChecker.isChaosToken(obj) then - local chaosBag = chaosBagApi.findChaosBag() - chaosBag.putObject(obj) + chaosBagApi.returnChaosTokenToBag(obj) -- don't touch locked objects (like the table etc.) elseif not obj.getLock() then ownedObjects.Trash.putObject(obj) @@ -294,46 +497,6 @@ function discardListOfObjects(objList) end end --- places a card/deck at a position or merges into an existing deck --- rotation is optional -function placeOrMergeIntoDeck(obj, pos, rot) - if not pos then return end - - local offset = 0.5 - - -- search the new position for existing card/deck - local searchResult = searchArea(pos, { 1, 1, 1 }, isCardOrDeck) - - -- get new position - local newPos - 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 - -- build a discard button to discard from searchPosition (number must be unique) function makeDiscardButton(xValue, number) local position = { xValue, 0.1, -0.94} @@ -367,7 +530,6 @@ function doUpkeepFromHotkey(color) end function doUpkeep(_, clickedByColor, isRightClick) - -- right-click allow color changing if isRightClick then changeColor(clickedByColor) return @@ -527,7 +689,7 @@ end -- get the draw deck and discard pile objects and returns the references function getDeckAreaObjects() local deckAreaObjects = {} - for _, object in ipairs(searchDeckAndDiscardArea(isCardOrDeck)) do + for _, object in ipairs(searchDeckAndDiscardArea("isCardOrDeck")) do if self.positionToLocal(object.getPosition()).z > 0.5 then deckAreaObjects.discard = object -- Norman Withers handling @@ -600,7 +762,7 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) - placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -660,7 +822,7 @@ end -- called when a checkbox is added or removed in-game (which should be rare), and is bounded by the -- number of customizable cards in play. function syncAllCustomizableCards() - for _, card in ipairs(searchAroundSelf(isCard)) do + for _, card in ipairs(searchAroundSelf("isCard")) do syncCustomizableMetadata(card) end end @@ -670,7 +832,7 @@ function syncCustomizableMetadata(card) if cardMetadata == nil or cardMetadata.customizations == nil then return end - for _, upgradeSheet in ipairs(searchAroundSelf(isCard)) do + for _, upgradeSheet in ipairs(searchAroundSelf("isCard")) do local upgradeSheetMetadata = JSON.decode(upgradeSheet.getGMNotes()) or { } if upgradeSheetMetadata.id == (cardMetadata.id .. "-c") then for i, customization in ipairs(cardMetadata.customizations) do @@ -707,7 +869,7 @@ function onCollisionEnter(collisionInfo) if not collisionEnabled then return end -- only continue for cards - if not isCard(object) then return end + if object.type ~= "Card" then return end -- detect if "Dream-Enhancing Serum" is placed if object.getName() == "Dream-Enhancing Serum" then isDES = true end @@ -762,7 +924,7 @@ function shouldSpawnTokens(card) end function onObjectEnterContainer(container, object) - if not isCard(object) then return end + if object.type ~= "Card" then return end local localCardPos = self.positionToLocal(object.getPosition()) if inArea(localCardPos, DECK_DISCARD_AREA) then @@ -773,15 +935,23 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) - for _, obj in ipairs(searchArea(object.getPosition(), { 3, 1, 4 })) do - if obj.getGUID() ~= "4ee1f2" and -- table + if object.hasTag("CardThatSeals") then + local func = object.getVar("resetSealedTokens") -- check if function exists (it won't for older custom content) + if func ~= nil then + object.call("resetSealedTokens") + end + end + + for _, obj in ipairs(searchLib.onObject(object)) do + if tokenChecker.isChaosToken(obj) then + chaosBagApi.returnChaosTokenToBag(obj) + elseif obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and obj.type ~= "Card" and obj.memo ~= nil and obj.getLock() == false and - obj.getDescription() ~= "Action Token" and - not tokenChecker.isChaosToken(obj) then + obj.getDescription() ~= "Action Token" then ownedObjects.Trash.putObject(obj) end end @@ -896,13 +1066,11 @@ end --------------------------------------------------------- function drawChaosTokenButton(_, _, isRightClick) - chaosBagApi.drawChaosToken(self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick) + chaosBagApi.drawChaosToken(self, isRightClick) end function drawEncounterCard(_, _, isRightClick) - local pos = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) - local rotY = self.getRotation().y - mythosAreaApi.drawEncounterCard(pos, rotY, isRightClick) + mythosAreaApi.drawEncounterCard(self, isRightClick) end function returnGlobalDiscardPosition() @@ -1043,268 +1211,12 @@ 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 - - -- 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 to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) - end - - return MythosAreaApi -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/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 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 = {} - - 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 - - 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 - - return NavigationOverlayApi -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 = { @@ -1459,7 +1371,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -1501,7 +1413,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -1710,7 +1622,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -1790,12 +1702,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -1827,134 +1737,298 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - end - return TokenManager end end) -__bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local PlayAreaApi = {} + 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("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 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) + return TokenSpawnTracker +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 - -- Reset the play area's tracking of which cards have had tokens spawned. - PlayAreaApi.resetSpawnedCards = function() - return getPlayArea().call("resetSpawnedCards") + -- 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 - -- 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) + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") 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. - PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - getPlayArea().call("setLimitSnapsByType", matchCardTypes) + -- returns a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") 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 }) + -- returns all sealed tokens on cards to the chaos bag + ChaosBagApi.releaseAllSealedTokens = function(playerColor) + return Global.call("releaseAllSealedTokens", playerColor) end - -- counts the VP on locations in the play area - PlayAreaApi.countVP = function() - return getPlayArea().call("countVP") + -- returns all drawn tokens to the chaos bag + ChaosBagApi.returnChaosTokens = function(playerColor) + return Global.call("returnChaosTokens", playerColor) 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) + -- 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 - -- Checks if an object is in the play area (returns true or false) - PlayAreaApi.isInPlayArea = function(object) - return getPlayArea().call("isInPlayArea", object) + -- 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 - PlayAreaApi.getSurface = function() - return getPlayArea().getCustomObject().image + -- 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 - 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) + -- 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 - PlayAreaApi.getCustomDataHelper = function() - return getPlayArea().getVar("customDataHelper") + -- called by playermats (by the "Draw chaos token" button) + ChaosBagApi.drawChaosToken = function(mat, drawAdditional) + return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional}) end - return PlayAreaApi + -- 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 end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua index 5e8826225..fcb6ba0b6 100644 --- a/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua +++ b/unpacked/Custom_Tile Playermat 2 Orange bd0ff4.ttslua @@ -84,6 +84,7 @@ 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 = { @@ -238,7 +239,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -280,7 +281,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -489,7 +490,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -569,12 +570,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -606,325 +605,124 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - end - return TokenManager end end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local TokenSpawnTracker = {} - local guidReferenceApi = require("core/GUIDReferenceApi") + local DeckLib = {} + local searchLib = require("util/SearchLib") - local function getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") - end + -- 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 - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) - end + -- search the new position for existing card/deck + local searchResult = searchLib.atPosition(pos, "isCardOrDeck") - 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("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) + -- 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 chaosBagContents + + -- 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 - -- 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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 + return DeckLib 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 - - 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 - - -- 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 to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp + -- 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 - return MythosAreaApi -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) + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - -- returns option panel table - OptionPanelApi.getOptions = function() - return Global.getTable("optionPanel") + -- 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 - 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") + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) end - local function getInvestigatorCounter() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") + -- 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 - -- 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 - - -- 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 matchTypes 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 SearchLib end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -932,28 +730,23 @@ 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") local guidReferenceApi = require("core/GUIDReferenceApi") local mythosAreaApi = require("core/MythosAreaApi") local navigationOverlayApi = require("core/NavigationOverlayApi") +local searchLib = require("util/SearchLib") local tokenChecker = require("core/token/TokenChecker") local tokenManager = require("core/token/TokenManager") --- set true to enable debug logging and show Physics.cast() -local DEBUG = false - -- we use this to turn off collision handling until onLoad() is complete local collisionEnabled = false --- position offsets relative to mat [x, y, z] -local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625} -local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58} - -- x-Values for discard buttons local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91} local SEARCH_AROUND_SELF_X_BUFFER = 8 --- defined areas for "inArea()" and "Physics.cast()" +-- defined areas for object searching local MAIN_PLAY_AREA = { upperLeft = { x = 1.98, @@ -1034,7 +827,7 @@ function onSave() end function onLoad(saveState) - self.interactable = DEBUG + self.interactable = false -- get object references to owned objects ownedObjects = guidReferenceApi.getObjectsByOwner(matColor) @@ -1092,29 +885,9 @@ end -- searches an area and optionally filters the result function searchArea(origin, size, filter) - local searchResult = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = self.getRotation(), - type = 3, - size = size, - max_distance = 0 - }) - - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or (filter and filter(v.hit_object)) then - table.insert(objList, v.hit_object) - end - end - return objList + return searchLib.inArea(origin, self.getRotation(), size, filter) end --- filter functions for searchArea() -function isCard(x) return x.type == 'Card' end -function isDeck(x) return x.type == 'Deck' end -function isCardOrDeck(x) return x.type == 'Card' or x.type == 'Deck' end - -- finds all objects on the playmat and associated set aside zone. function searchAroundSelf(filter) local bounds = self.getBoundsNormalized() @@ -1163,16 +936,15 @@ end ---@param objList Table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do - if isCardOrDeck(obj) then + if obj.type == "Card" or obj.type == "Deck" then if obj.hasTag("PlayerCard") then - placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) else - placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) + deckLib.placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) end -- put chaos tokens back into bag (e.g. Unrelenting) elseif tokenChecker.isChaosToken(obj) then - local chaosBag = chaosBagApi.findChaosBag() - chaosBag.putObject(obj) + chaosBagApi.returnChaosTokenToBag(obj) -- don't touch locked objects (like the table etc.) elseif not obj.getLock() then ownedObjects.Trash.putObject(obj) @@ -1180,46 +952,6 @@ function discardListOfObjects(objList) end end --- places a card/deck at a position or merges into an existing deck --- rotation is optional -function placeOrMergeIntoDeck(obj, pos, rot) - if not pos then return end - - local offset = 0.5 - - -- search the new position for existing card/deck - local searchResult = searchArea(pos, { 1, 1, 1 }, isCardOrDeck) - - -- get new position - local newPos - 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 - -- build a discard button to discard from searchPosition (number must be unique) function makeDiscardButton(xValue, number) local position = { xValue, 0.1, -0.94} @@ -1253,7 +985,6 @@ function doUpkeepFromHotkey(color) end function doUpkeep(_, clickedByColor, isRightClick) - -- right-click allow color changing if isRightClick then changeColor(clickedByColor) return @@ -1413,7 +1144,7 @@ end -- get the draw deck and discard pile objects and returns the references function getDeckAreaObjects() local deckAreaObjects = {} - for _, object in ipairs(searchDeckAndDiscardArea(isCardOrDeck)) do + for _, object in ipairs(searchDeckAndDiscardArea("isCardOrDeck")) do if self.positionToLocal(object.getPosition()).z > 0.5 then deckAreaObjects.discard = object -- Norman Withers handling @@ -1486,7 +1217,7 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) - placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1546,7 +1277,7 @@ end -- called when a checkbox is added or removed in-game (which should be rare), and is bounded by the -- number of customizable cards in play. function syncAllCustomizableCards() - for _, card in ipairs(searchAroundSelf(isCard)) do + for _, card in ipairs(searchAroundSelf("isCard")) do syncCustomizableMetadata(card) end end @@ -1556,7 +1287,7 @@ function syncCustomizableMetadata(card) if cardMetadata == nil or cardMetadata.customizations == nil then return end - for _, upgradeSheet in ipairs(searchAroundSelf(isCard)) do + for _, upgradeSheet in ipairs(searchAroundSelf("isCard")) do local upgradeSheetMetadata = JSON.decode(upgradeSheet.getGMNotes()) or { } if upgradeSheetMetadata.id == (cardMetadata.id .. "-c") then for i, customization in ipairs(cardMetadata.customizations) do @@ -1593,7 +1324,7 @@ function onCollisionEnter(collisionInfo) if not collisionEnabled then return end -- only continue for cards - if not isCard(object) then return end + if object.type ~= "Card" then return end -- detect if "Dream-Enhancing Serum" is placed if object.getName() == "Dream-Enhancing Serum" then isDES = true end @@ -1648,7 +1379,7 @@ function shouldSpawnTokens(card) end function onObjectEnterContainer(container, object) - if not isCard(object) then return end + if object.type ~= "Card" then return end local localCardPos = self.positionToLocal(object.getPosition()) if inArea(localCardPos, DECK_DISCARD_AREA) then @@ -1659,15 +1390,23 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) - for _, obj in ipairs(searchArea(object.getPosition(), { 3, 1, 4 })) do - if obj.getGUID() ~= "4ee1f2" and -- table + if object.hasTag("CardThatSeals") then + local func = object.getVar("resetSealedTokens") -- check if function exists (it won't for older custom content) + if func ~= nil then + object.call("resetSealedTokens") + end + end + + for _, obj in ipairs(searchLib.onObject(object)) do + if tokenChecker.isChaosToken(obj) then + chaosBagApi.returnChaosTokenToBag(obj) + elseif obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and obj.type ~= "Card" and obj.memo ~= nil and obj.getLock() == false and - obj.getDescription() ~= "Action Token" and - not tokenChecker.isChaosToken(obj) then + obj.getDescription() ~= "Action Token" then ownedObjects.Trash.putObject(obj) end end @@ -1782,13 +1521,11 @@ end --------------------------------------------------------- function drawChaosTokenButton(_, _, isRightClick) - chaosBagApi.drawChaosToken(self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick) + chaosBagApi.drawChaosToken(self, isRightClick) end function drawEncounterCard(_, _, isRightClick) - local pos = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) - local rotY = self.getRotation().y - mythosAreaApi.drawEncounterCard(pos, rotY, isRightClick) + mythosAreaApi.drawEncounterCard(self, isRightClick) end function returnGlobalDiscardPosition() @@ -1929,6 +1666,88 @@ 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 = {} @@ -1954,7 +1773,262 @@ do 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 = {} + + 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/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("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) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua index 739e7d66c..cf496aeb6 100644 --- a/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua +++ b/unpacked/Custom_Tile Playermat 3 Green 383d8b.ttslua @@ -41,30 +41,312 @@ 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 = {} + 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("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 = {} + 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("playermat/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") +local deckLib = require("util/DeckLib") local guidReferenceApi = require("core/GUIDReferenceApi") local mythosAreaApi = require("core/MythosAreaApi") local navigationOverlayApi = require("core/NavigationOverlayApi") +local searchLib = require("util/SearchLib") local tokenChecker = require("core/token/TokenChecker") local tokenManager = require("core/token/TokenManager") --- set true to enable debug logging and show Physics.cast() -local DEBUG = false - -- we use this to turn off collision handling until onLoad() is complete local collisionEnabled = false --- position offsets relative to mat [x, y, z] -local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625} -local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58} - -- x-Values for discard buttons local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91} local SEARCH_AROUND_SELF_X_BUFFER = 8 --- defined areas for "inArea()" and "Physics.cast()" +-- defined areas for object searching local MAIN_PLAY_AREA = { upperLeft = { x = 1.98, @@ -145,7 +427,7 @@ function onSave() end function onLoad(saveState) - self.interactable = DEBUG + self.interactable = false -- get object references to owned objects ownedObjects = guidReferenceApi.getObjectsByOwner(matColor) @@ -203,29 +485,9 @@ end -- searches an area and optionally filters the result function searchArea(origin, size, filter) - local searchResult = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = self.getRotation(), - type = 3, - size = size, - max_distance = 0 - }) - - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or (filter and filter(v.hit_object)) then - table.insert(objList, v.hit_object) - end - end - return objList + return searchLib.inArea(origin, self.getRotation(), size, filter) end --- filter functions for searchArea() -function isCard(x) return x.type == 'Card' end -function isDeck(x) return x.type == 'Deck' end -function isCardOrDeck(x) return x.type == 'Card' or x.type == 'Deck' end - -- finds all objects on the playmat and associated set aside zone. function searchAroundSelf(filter) local bounds = self.getBoundsNormalized() @@ -274,16 +536,15 @@ end ---@param objList Table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do - if isCardOrDeck(obj) then + if obj.type == "Card" or obj.type == "Deck" then if obj.hasTag("PlayerCard") then - placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) else - placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) + deckLib.placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) end -- put chaos tokens back into bag (e.g. Unrelenting) elseif tokenChecker.isChaosToken(obj) then - local chaosBag = chaosBagApi.findChaosBag() - chaosBag.putObject(obj) + chaosBagApi.returnChaosTokenToBag(obj) -- don't touch locked objects (like the table etc.) elseif not obj.getLock() then ownedObjects.Trash.putObject(obj) @@ -291,46 +552,6 @@ function discardListOfObjects(objList) end end --- places a card/deck at a position or merges into an existing deck --- rotation is optional -function placeOrMergeIntoDeck(obj, pos, rot) - if not pos then return end - - local offset = 0.5 - - -- search the new position for existing card/deck - local searchResult = searchArea(pos, { 1, 1, 1 }, isCardOrDeck) - - -- get new position - local newPos - 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 - -- build a discard button to discard from searchPosition (number must be unique) function makeDiscardButton(xValue, number) local position = { xValue, 0.1, -0.94} @@ -364,7 +585,6 @@ function doUpkeepFromHotkey(color) end function doUpkeep(_, clickedByColor, isRightClick) - -- right-click allow color changing if isRightClick then changeColor(clickedByColor) return @@ -524,7 +744,7 @@ end -- get the draw deck and discard pile objects and returns the references function getDeckAreaObjects() local deckAreaObjects = {} - for _, object in ipairs(searchDeckAndDiscardArea(isCardOrDeck)) do + for _, object in ipairs(searchDeckAndDiscardArea("isCardOrDeck")) do if self.positionToLocal(object.getPosition()).z > 0.5 then deckAreaObjects.discard = object -- Norman Withers handling @@ -597,7 +817,7 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) - placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -657,7 +877,7 @@ end -- called when a checkbox is added or removed in-game (which should be rare), and is bounded by the -- number of customizable cards in play. function syncAllCustomizableCards() - for _, card in ipairs(searchAroundSelf(isCard)) do + for _, card in ipairs(searchAroundSelf("isCard")) do syncCustomizableMetadata(card) end end @@ -667,7 +887,7 @@ function syncCustomizableMetadata(card) if cardMetadata == nil or cardMetadata.customizations == nil then return end - for _, upgradeSheet in ipairs(searchAroundSelf(isCard)) do + for _, upgradeSheet in ipairs(searchAroundSelf("isCard")) do local upgradeSheetMetadata = JSON.decode(upgradeSheet.getGMNotes()) or { } if upgradeSheetMetadata.id == (cardMetadata.id .. "-c") then for i, customization in ipairs(cardMetadata.customizations) do @@ -704,7 +924,7 @@ function onCollisionEnter(collisionInfo) if not collisionEnabled then return end -- only continue for cards - if not isCard(object) then return end + if object.type ~= "Card" then return end -- detect if "Dream-Enhancing Serum" is placed if object.getName() == "Dream-Enhancing Serum" then isDES = true end @@ -759,7 +979,7 @@ function shouldSpawnTokens(card) end function onObjectEnterContainer(container, object) - if not isCard(object) then return end + if object.type ~= "Card" then return end local localCardPos = self.positionToLocal(object.getPosition()) if inArea(localCardPos, DECK_DISCARD_AREA) then @@ -770,15 +990,23 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) - for _, obj in ipairs(searchArea(object.getPosition(), { 3, 1, 4 })) do - if obj.getGUID() ~= "4ee1f2" and -- table + if object.hasTag("CardThatSeals") then + local func = object.getVar("resetSealedTokens") -- check if function exists (it won't for older custom content) + if func ~= nil then + object.call("resetSealedTokens") + end + end + + for _, obj in ipairs(searchLib.onObject(object)) do + if tokenChecker.isChaosToken(obj) then + chaosBagApi.returnChaosTokenToBag(obj) + elseif obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and obj.type ~= "Card" and obj.memo ~= nil and obj.getLock() == false and - obj.getDescription() ~= "Action Token" and - not tokenChecker.isChaosToken(obj) then + obj.getDescription() ~= "Action Token" then ownedObjects.Trash.putObject(obj) end end @@ -893,13 +1121,11 @@ end --------------------------------------------------------- function drawChaosTokenButton(_, _, isRightClick) - chaosBagApi.drawChaosToken(self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick) + chaosBagApi.drawChaosToken(self, isRightClick) end function drawEncounterCard(_, _, isRightClick) - local pos = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) - local rotY = self.getRotation().y - mythosAreaApi.drawEncounterCard(pos, rotY, isRightClick) + mythosAreaApi.drawEncounterCard(self, isRightClick) end function returnGlobalDiscardPosition() @@ -1040,34 +1266,86 @@ function updatePlayerCards(args) tokenManager.addPlayerCardData(playerCardData) end end) -__bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local GUIDReferenceApi = {} + local ChaosBagApi = {} - local function getGuidHandler() - return getObjectFromGUID("123456") + -- 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 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 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 - -- 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) + -- checks scripting zone for chaos bag (also called by a lot of objects!) + ChaosBagApi.findChaosBag = function() + return Global.call("findChaosBag") 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 a table of object references to the tokens in play (does not include sealed tokens!) + ChaosBagApi.getTokensInPlay = function() + return Global.call("getChaosTokensinPlay") end - return GUIDReferenceApi + -- 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) @@ -1113,6 +1391,7 @@ 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 = { @@ -1267,7 +1546,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -1309,7 +1588,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -1518,7 +1797,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -1598,12 +1877,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -1635,58 +1912,93 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - end - return TokenManager end end) -__bundle_register("core/token/TokenSpawnTrackerApi", function(require, _LOADED, __bundle_register, __bundle_modules) +__bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do - local TokenSpawnTracker = {} - 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 getSpawnTracker() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "TokenSpawnTracker") + -- 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 - TokenSpawnTracker.hasSpawnedTokens = function(cardGuid) - return getSpawnTracker().call("hasSpawnedTokens", cardGuid) + -- searches the specified area + SearchLib.inArea = function(pos, rot, size, filter) + return returnSearchResult(pos, rot, size, filter) end - TokenSpawnTracker.markTokensSpawned = function(cardGuid) - return getSpawnTracker().call("markTokensSpawned", cardGuid) + -- 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 - TokenSpawnTracker.resetTokensSpawned = function(cardGuid) - return getSpawnTracker().call("resetTokensSpawned", cardGuid) + -- searches the specified position (a single point) + SearchLib.atPosition = function(pos, filter) + size = { 0.1, 2, 0.1 } + return returnSearchResult(pos, _, size, filter) end - TokenSpawnTracker.resetAllAssetAndEvents = function() - return getSpawnTracker().call("resetAllAssetAndEvents") + -- 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 - TokenSpawnTracker.resetAllLocations = function() - return getSpawnTracker().call("resetAllLocations") + 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 - TokenSpawnTracker.resetAll = function() - return getSpawnTracker().call("resetAll") + -- returns option panel table + OptionPanelApi.getOptions = function() + return Global.getTable("optionPanel") end - return TokenSpawnTracker + return OptionPanelApi end end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) @@ -1711,250 +2023,12 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- 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 - }) - 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 - - return NavigationOverlayApi -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 - - -- 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 matchTypes 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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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/Custom_Tile Playermat 4 Red 0840d5.ttslua b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua index 7141e5b27..844c7df2d 100644 --- a/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua +++ b/unpacked/Custom_Tile Playermat 4 Red 0840d5.ttslua @@ -41,45 +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("playermat/Playmat") -end) __bundle_register("core/MythosAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local MythosAreaApi = {} @@ -99,89 +60,20 @@ do return getMythosArea().call("getEncounterDeck") end - -- draw an encounter card to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) + -- 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/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/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 - - return NavigationOverlayApi -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 = { @@ -336,7 +228,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -378,7 +270,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -587,7 +479,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -667,12 +559,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -704,21 +594,6 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - end - return TokenManager end end) @@ -740,142 +615,25 @@ do 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 - - -- 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 matchTypes 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/Playmat", function(require, _LOADED, __bundle_register, __bundle_modules) local chaosBagApi = require("chaosbag/ChaosBagApi") +local deckLib = require("util/DeckLib") local guidReferenceApi = require("core/GUIDReferenceApi") local mythosAreaApi = require("core/MythosAreaApi") local navigationOverlayApi = require("core/NavigationOverlayApi") +local searchLib = require("util/SearchLib") local tokenChecker = require("core/token/TokenChecker") local tokenManager = require("core/token/TokenManager") --- set true to enable debug logging and show Physics.cast() -local DEBUG = false - -- we use this to turn off collision handling until onLoad() is complete local collisionEnabled = false --- position offsets relative to mat [x, y, z] -local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625} -local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58} - -- x-Values for discard buttons local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91} local SEARCH_AROUND_SELF_X_BUFFER = 8 --- defined areas for "inArea()" and "Physics.cast()" +-- defined areas for object searching local MAIN_PLAY_AREA = { upperLeft = { x = 1.98, @@ -956,7 +714,7 @@ function onSave() end function onLoad(saveState) - self.interactable = DEBUG + self.interactable = false -- get object references to owned objects ownedObjects = guidReferenceApi.getObjectsByOwner(matColor) @@ -1014,29 +772,9 @@ end -- searches an area and optionally filters the result function searchArea(origin, size, filter) - local searchResult = Physics.cast({ - origin = origin, - direction = { 0, 1, 0 }, - orientation = self.getRotation(), - type = 3, - size = size, - max_distance = 0 - }) - - local objList = {} - for _, v in ipairs(searchResult) do - if not filter or (filter and filter(v.hit_object)) then - table.insert(objList, v.hit_object) - end - end - return objList + return searchLib.inArea(origin, self.getRotation(), size, filter) end --- filter functions for searchArea() -function isCard(x) return x.type == 'Card' end -function isDeck(x) return x.type == 'Deck' end -function isCardOrDeck(x) return x.type == 'Card' or x.type == 'Deck' end - -- finds all objects on the playmat and associated set aside zone. function searchAroundSelf(filter) local bounds = self.getBoundsNormalized() @@ -1085,16 +823,15 @@ end ---@param objList Table List of objects to discard function discardListOfObjects(objList) for _, obj in ipairs(objList) do - if isCardOrDeck(obj) then + if obj.type == "Card" or obj.type == "Deck" then if obj.hasTag("PlayerCard") then - placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation()) else - placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) + deckLib.placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0}) end -- put chaos tokens back into bag (e.g. Unrelenting) elseif tokenChecker.isChaosToken(obj) then - local chaosBag = chaosBagApi.findChaosBag() - chaosBag.putObject(obj) + chaosBagApi.returnChaosTokenToBag(obj) -- don't touch locked objects (like the table etc.) elseif not obj.getLock() then ownedObjects.Trash.putObject(obj) @@ -1102,46 +839,6 @@ function discardListOfObjects(objList) end end --- places a card/deck at a position or merges into an existing deck --- rotation is optional -function placeOrMergeIntoDeck(obj, pos, rot) - if not pos then return end - - local offset = 0.5 - - -- search the new position for existing card/deck - local searchResult = searchArea(pos, { 1, 1, 1 }, isCardOrDeck) - - -- get new position - local newPos - 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 - -- build a discard button to discard from searchPosition (number must be unique) function makeDiscardButton(xValue, number) local position = { xValue, 0.1, -0.94} @@ -1175,7 +872,6 @@ function doUpkeepFromHotkey(color) end function doUpkeep(_, clickedByColor, isRightClick) - -- right-click allow color changing if isRightClick then changeColor(clickedByColor) return @@ -1335,7 +1031,7 @@ end -- get the draw deck and discard pile objects and returns the references function getDeckAreaObjects() local deckAreaObjects = {} - for _, object in ipairs(searchDeckAndDiscardArea(isCardOrDeck)) do + for _, object in ipairs(searchDeckAndDiscardArea("isCardOrDeck")) do if self.positionToLocal(object.getPosition()).z > 0.5 then deckAreaObjects.discard = object -- Norman Withers handling @@ -1408,7 +1104,7 @@ function doDiscardOne() -- get a random non-hidden card (from the "choices" table) local num = math.random(1, #choices) - placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) + deckLib.placeOrMergeIntoDeck(hand[choices[num]], returnGlobalDiscardPosition(), self.getRotation()) broadcastToAll(playerColor .. " randomly discarded card " .. choices[num] .. "/" .. #hand .. ".", "White") end end @@ -1468,7 +1164,7 @@ end -- called when a checkbox is added or removed in-game (which should be rare), and is bounded by the -- number of customizable cards in play. function syncAllCustomizableCards() - for _, card in ipairs(searchAroundSelf(isCard)) do + for _, card in ipairs(searchAroundSelf("isCard")) do syncCustomizableMetadata(card) end end @@ -1478,7 +1174,7 @@ function syncCustomizableMetadata(card) if cardMetadata == nil or cardMetadata.customizations == nil then return end - for _, upgradeSheet in ipairs(searchAroundSelf(isCard)) do + for _, upgradeSheet in ipairs(searchAroundSelf("isCard")) do local upgradeSheetMetadata = JSON.decode(upgradeSheet.getGMNotes()) or { } if upgradeSheetMetadata.id == (cardMetadata.id .. "-c") then for i, customization in ipairs(cardMetadata.customizations) do @@ -1515,7 +1211,7 @@ function onCollisionEnter(collisionInfo) if not collisionEnabled then return end -- only continue for cards - if not isCard(object) then return end + if object.type ~= "Card" then return end -- detect if "Dream-Enhancing Serum" is placed if object.getName() == "Dream-Enhancing Serum" then isDES = true end @@ -1570,7 +1266,7 @@ function shouldSpawnTokens(card) end function onObjectEnterContainer(container, object) - if not isCard(object) then return end + if object.type ~= "Card" then return end local localCardPos = self.positionToLocal(object.getPosition()) if inArea(localCardPos, DECK_DISCARD_AREA) then @@ -1581,15 +1277,23 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) - for _, obj in ipairs(searchArea(object.getPosition(), { 3, 1, 4 })) do - if obj.getGUID() ~= "4ee1f2" and -- table + if object.hasTag("CardThatSeals") then + local func = object.getVar("resetSealedTokens") -- check if function exists (it won't for older custom content) + if func ~= nil then + object.call("resetSealedTokens") + end + end + + for _, obj in ipairs(searchLib.onObject(object)) do + if tokenChecker.isChaosToken(obj) then + chaosBagApi.returnChaosTokenToBag(obj) + elseif obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and obj.type ~= "Deck" and obj.type ~= "Card" and obj.memo ~= nil and obj.getLock() == false and - obj.getDescription() ~= "Action Token" and - not tokenChecker.isChaosToken(obj) then + obj.getDescription() ~= "Action Token" then ownedObjects.Trash.putObject(obj) end end @@ -1704,13 +1408,11 @@ end --------------------------------------------------------- function drawChaosTokenButton(_, _, isRightClick) - chaosBagApi.drawChaosToken(self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick) + chaosBagApi.drawChaosToken(self, isRightClick) end function drawEncounterCard(_, _, isRightClick) - local pos = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET) - local rotY = self.getRotation().y - mythosAreaApi.drawEncounterCard(pos, rotY, isRightClick) + mythosAreaApi.drawEncounterCard(self, isRightClick) end function returnGlobalDiscardPosition() @@ -1879,7 +1581,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -1898,6 +1600,12 @@ do 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) @@ -1914,8 +1622,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -1927,6 +1635,360 @@ do 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/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/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("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("playermat/Playmat") +end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} @@ -1954,6 +2016,18 @@ do 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) diff --git a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.yaml b/unpacked/Custom_Tile Tokencache_+1 a15273.yaml similarity index 55% rename from unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.yaml rename to unpacked/Custom_Tile Tokencache_+1 a15273.yaml index 3fcd2bc3d..3dbca3441 100644 --- a/unpacked/Custom_Model_Bag Fan-Made Accessories aa8b38/Custom_Tile PlayermatHider a758b2.yaml +++ b/unpacked/Custom_Tile Tokencache_+1 a15273.yaml @@ -12,41 +12,39 @@ CustomImage: Stackable: false Stretch: true Thickness: 0.1 - Type: 3 + Type: 2 ImageScalar: 1 ImageSecondaryURL: '' - ImageURL: http://cloud-3.steamusercontent.com/ugc/2115061845796985108/F0ADB7094641DA966FFA3AF0CC6987D33D2D9591/ + ImageURL: https://i.imgur.com/uIx8jbY.png WidthScale: 0 -Description: Use the buttons to show / hide a playmat. +Description: '' DragSelectable: true GMNotes: '' -GUID: a758b2 +GUID: a15273 Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 -Locked: false -LuaScript: !include 'Custom_Tile PlayermatHider a758b2.ttslua' +Locked: true +LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Custom_Tile -Nickname: PlayermatHider +Nickname: Tokencache_+1 Snap: true Sticky: true -Tags: -- CleanUpHelper_ignore Tooltip: true Transform: - posX: 0 - posY: 2 - posZ: 0 + posX: 78 + posY: 1.54 + posZ: -36 rotX: 0 rotY: 270 rotZ: 0 - scaleX: 5 + scaleX: 0.81 scaleY: 1 - scaleZ: 5 + scaleZ: 0.81 Value: 0 -XmlUI: !include 'Custom_Tile PlayermatHider a758b2.xml' +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-1 b644d2.yaml b/unpacked/Custom_Tile Tokencache_-1 b644d2.yaml new file mode 100644 index 000000000..5a83ee0b7 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-1 b644d2.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/w3XbrCC.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b644d2 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-1 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.54 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-2 8af600.yaml b/unpacked/Custom_Tile Tokencache_-2 8af600.yaml new file mode 100644 index 000000000..e6618e4cd --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-2 8af600.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/bfTg2hb.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 8af600 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-2 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.75 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-3 a7a9cb.yaml b/unpacked/Custom_Tile Tokencache_-3 a7a9cb.yaml new file mode 100644 index 000000000..f9f8db2a6 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-3 a7a9cb.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/yfs8gHq.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: a7a9cb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-3 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.0 + posY: 2.25 + posZ: -36.0 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-4 984eec.yaml b/unpacked/Custom_Tile Tokencache_-4 984eec.yaml new file mode 100644 index 000000000..b23f5d554 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-4 984eec.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/qrgGQRD.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 984eec +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-4 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.84 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-5 1df0a5.yaml b/unpacked/Custom_Tile Tokencache_-5 1df0a5.yaml new file mode 100644 index 000000000..04a50e11a --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-5 1df0a5.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/3Ym1IeG.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1df0a5 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-5 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.0 + posY: 2.15 + posZ: -36.0 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-6 2460df.yaml b/unpacked/Custom_Tile Tokencache_-6 2460df.yaml new file mode 100644 index 000000000..c368c127b --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-6 2460df.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/c9qdSzS.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 2460df +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-6 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78.0 + posY: 1.34 + posZ: -36.0 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-7 81a1d7.yaml b/unpacked/Custom_Tile Tokencache_-7 81a1d7.yaml new file mode 100644 index 000000000..e285fcd2c --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-7 81a1d7.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/4WRD42n.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 81a1d7 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-7 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.04 + posZ: -36.0 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_-8 298b5f.yaml b/unpacked/Custom_Tile Tokencache_-8 298b5f.yaml new file mode 100644 index 000000000..16399771b --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_-8 298b5f.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/9t3rPTQ.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 298b5f +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_-8 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.94 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_0 0a8592.yaml b/unpacked/Custom_Tile Tokencache_0 0a8592.yaml new file mode 100644 index 000000000..9b4202b6a --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_0 0a8592.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/btEtVfd.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0a8592 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_0 +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.85 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_Auto-fail e31821.yaml b/unpacked/Custom_Tile Tokencache_Auto-fail e31821.yaml new file mode 100644 index 000000000..f5e965a01 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Auto-fail e31821.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/lns4fhz.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: e31821 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Auto-fail +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.75 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml b/unpacked/Custom_Tile Tokencache_Bless 8e3aab.yaml similarity index 87% rename from unpacked/Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml rename to unpacked/Custom_Tile Tokencache_Bless 8e3aab.yaml index 5fd12f58a..2f2f4edf1 100644 --- a/unpacked/Custom_Model_Bag Bless tokens afa06b/Custom_Tile Bless b2b7be.yaml +++ b/unpacked/Custom_Tile Tokencache_Bless 8e3aab.yaml @@ -20,28 +20,28 @@ CustomImage: Description: '' DragSelectable: true GMNotes: '' -GUID: b2b7be +GUID: 8e3aab Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 -Locked: false +Locked: true LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Custom_Tile -Nickname: Bless +Nickname: Tokencache_Bless Snap: true Sticky: true Tooltip: true Transform: - posX: -1.47 - posY: 1.7 - posZ: -26.93 + posX: 78.0 + posY: 1.25 + posZ: -36.0 rotX: 0 - rotY: 90 + rotY: 270 rotZ: 0 scaleX: 0.81 scaleY: 1 diff --git a/unpacked/Custom_Tile Tokencache_Cultist 7d6103.yaml b/unpacked/Custom_Tile Tokencache_Cultist 7d6103.yaml new file mode 100644 index 000000000..68c6a1943 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Cultist 7d6103.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/VzhJJaH.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 7d6103 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Cultist +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.95 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml b/unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml similarity index 89% rename from unpacked/Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml rename to unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml index 752aa8e14..06ad66047 100644 --- a/unpacked/Custom_Model_Bag Curse tokens bd0253/Custom_Tile Curse 678891.yaml +++ b/unpacked/Custom_Tile Tokencache_Curse 16a9a7.yaml @@ -20,26 +20,26 @@ CustomImage: Description: '' DragSelectable: true GMNotes: '' -GUID: '678891' +GUID: 16a9a7 Grid: true GridProjection: false Hands: false HideWhenFaceDown: false IgnoreFoW: false LayoutGroupSortIndex: 0 -Locked: false +Locked: true LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: Custom_Tile -Nickname: Curse +Nickname: Tokencache_Curse Snap: true Sticky: true Tooltip: true Transform: - posX: -46.21 - posY: 1.79 - posZ: -3.48 + posX: 78 + posY: 1.15 + posZ: -36 rotX: 0 rotY: 270 rotZ: 0 diff --git a/unpacked/Custom_Tile Tokencache_Elder Sign 0b1aca.yaml b/unpacked/Custom_Tile Tokencache_Elder Sign 0b1aca.yaml new file mode 100644 index 000000000..8550f7be0 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Elder Sign 0b1aca.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/nEmqjmj.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 0b1aca +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Elder Sign +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.65 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_Elder Thing 38609c.yaml b/unpacked/Custom_Tile Tokencache_Elder Thing 38609c.yaml new file mode 100644 index 000000000..daa2c96f0 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Elder Thing 38609c.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/ttnspKt.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 38609c +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Elder Thing +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.44 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml b/unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml new file mode 100644 index 000000000..41e7b6777 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Frost b2b7be.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 0.04894 + g: 0.32859 + r: 0.37456 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: http://cloud-3.steamusercontent.com/ugc/1858293462583104677/195F93C063A8881B805CE2FD4767A9718B27B6AE/ + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: b2b7be +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Frost +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.44 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 180 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_Skull cc8bbb.yaml b/unpacked/Custom_Tile Tokencache_Skull cc8bbb.yaml new file mode 100644 index 000000000..4e292eafb --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Skull cc8bbb.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/stbBxtx.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: cc8bbb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Skull +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 2.65 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Tile Tokencache_Tablet 1a1506.yaml b/unpacked/Custom_Tile Tokencache_Tablet 1a1506.yaml new file mode 100644 index 000000000..b3dc4f568 --- /dev/null +++ b/unpacked/Custom_Tile Tokencache_Tablet 1a1506.yaml @@ -0,0 +1,50 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomTile: + Stackable: false + Stretch: true + Thickness: 0.1 + Type: 2 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: https://i.imgur.com/1plY463.png + WidthScale: 0 +Description: '' +DragSelectable: true +GMNotes: '' +GUID: 1a1506 +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Tile +Nickname: Tokencache_Tablet +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: 78 + posY: 1.45 + posZ: -36 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 0.81 + scaleY: 1 + scaleZ: 0.81 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua b/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua index 177497d7f..d4e9a6a4d 100644 --- a/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua +++ b/unpacked/Custom_Token BlessCurse Manager 5933fb.ttslua @@ -41,6 +41,448 @@ 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("chaosbag/BlessCurseManager") +end) +__bundle_register("chaosbag/BlessCurseManager", function(require, _LOADED, __bundle_register, __bundle_modules) +local chaosBagApi = require("chaosbag/ChaosBagApi") +local tokenArrangerApi = require("accessories/TokenArrangerApi") + +-- common button parameters +local buttonParamaters = {} +buttonParamaters.function_owner = self +buttonParamaters.color = { 0, 0, 0, 0 } +buttonParamaters.width = 700 +buttonParamaters.height = 700 + +local updating + +--------------------------------------------------------- +-- creating buttons and menus + initializing tables +--------------------------------------------------------- + +function onLoad() + -- index: 0 - bless + buttonParamaters.click_function = "clickBless" + buttonParamaters.position = { -1.03, 0, 0.46 } + buttonParamaters.tooltip = "Add / Remove Bless" + self.createButton(buttonParamaters) + + -- index: 1 - curse + buttonParamaters.click_function = "clickCurse" + buttonParamaters.position[1] = -buttonParamaters.position[1] + buttonParamaters.tooltip = "Add / Remove Curse" + self.createButton(buttonParamaters) + + -- index: 2 - bless count + buttonParamaters.tooltip = "" + buttonParamaters.click_function = "none" + buttonParamaters.width = 0 + buttonParamaters.height = 0 + buttonParamaters.color = { 0.4, 0.4, 0.4 } + buttonParamaters.font_color = { 1, 1, 1 } + buttonParamaters.font_size = 235 + buttonParamaters.position = { -1.03, 0.06, -0.8 } + self.createButton(buttonParamaters) + + -- index: 3 - curse count + buttonParamaters.position[1] = -buttonParamaters.position[1] + self.createButton(buttonParamaters) + + -- context menu + self.addContextMenuItem("Remove all", doRemove) + self.addContextMenuItem("Reset", doReset) + + -- initializing tables + initializeState() + broadcastCount("Curse") + broadcastCount("Bless") +end + +function resetTables() + numInPlay = { Bless = 0, Curse = 0 } + tokensTaken = { Bless = {}, Curse = {} } + sealedTokens = {} +end + +function initializeState() + resetTables() + + -- 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 + elseif v.name == "Curse" then + numInPlay.Curse = numInPlay.Curse + 1 + end + end + + -- 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 obj.getName() == "Bless" then + table.insert(tokensTaken.Bless, obj.getGUID()) + numInPlay.Bless = numInPlay.Bless + 1 + elseif obj.getName() == "Curse" then + table.insert(tokensTaken.Curse, obj.getGUID()) + numInPlay.Curse = numInPlay.Curse + 1 + end + end + end + + updateButtonLabels() +end + +function updateButtonLabels() + self.editButton({ index = 2, label = formatTokenCount("Bless", true)}) + self.editButton({ index = 3, label = formatTokenCount("Curse", true)}) +end + +function broadcastCount(token) + local count = formatTokenCount(token) + if count == "(0 + 0)" then return end + broadcastToAll(token .. " Tokens " .. count, "White") +end + +function broadcastStatus(color) + broadcastToColor("Curse Tokens " .. formatTokenCount("Curse"), color, "White") + broadcastToColor("Bless Tokens " .. formatTokenCount("Bless"), color, "White") +end + +--------------------------------------------------------- +-- TTS event handling +--------------------------------------------------------- + +-- enable tracking of bag changes for 1 second +function onObjectDrop(_, object) + if not isBlurseToken(object) then return end + + -- check if object was dropped in chaos bag area + for _, zone in ipairs(object.getZones()) do + if zone.getName() == "ChaosBagZone" then + trackBagChange = true + Wait.time(function() trackBagChange = false end, 1) + return + end + end +end + +-- handle manual returning of bless / curse tokens +function onObjectEnterContainer(container, object) + if not (trackBagChange and isChaosbag(container) and isBlurseToken(object)) then return end + + -- small delay to ensure token has entered bag + Wait.time(doReset, 0.5) +end + +function isChaosbag(obj) + if obj.getDescription() ~= "Chaos Bag" then return end -- early exit for performance + return obj == chaosBagApi.findChaosBag() +end + +function isBlurseToken(obj) + local name = obj.getName() + return name == "Bless" or name == "Curse" +end + +--------------------------------------------------------- +-- context menu functions +--------------------------------------------------------- + +function doRemove(color) + local chaosBag = chaosBagApi.findChaosBag() + + -- remove tokens from chaos bag + local count = { Bless = 0, Curse = 0 } + for _, v in ipairs(chaosBag.getObjects()) do + if v.name == "Bless" or v.name == "Curse" then + chaosBag.takeObject({ + guid = v.guid, + position = { 0, 5, 0 }, + callback_function = function(obj) obj.destruct() end + }) + count[v.name] = count[v.name] + 1 + end + end + + broadcastToColor("Removed " .. count.Bless .. " Bless and " .. count.Curse .. " Curse tokens from the chaos bag.", color, "White") + broadcastToColor("Removed " .. removeTakenTokens("Bless") .. " Bless and " .. removeTakenTokens("Curse") .. " Curse tokens from play.", color, "White") + + resetTables() + updateButtonLabels() + tokenArrangerApi.layout() +end + +function doReset() + initializeState() + broadcastCount("Curse") + broadcastCount("Bless") + tokenArrangerApi.layout() +end + +--------------------------------------------------------- +-- click functions +--------------------------------------------------------- + +function clickBless(_, color, isRightClick) + playerColor = color + callFunctions("Bless", isRightClick) +end + +function clickCurse(_, color, isRightClick) + playerColor = color + callFunctions("Curse", isRightClick) +end + +function callFunctions(type, isRightClick) + if not chaosBagApi.canTouchChaosTokens() then return end + + if isRightClick then + removeToken(type) + else + addToken(type) + end + + tokenArrangerApi.layout() +end + +--------------------------------------------------------- +-- called functions +--------------------------------------------------------- + +-- returns a formatted string with information about the provided token type (bless / curse) +function formatTokenCount(type, omitBrackets) + if type == nil then type = mode end + + if omitBrackets then + return (numInPlay[type] - #tokensTaken[type]) .. " + " .. #tokensTaken[type] + else + return "(" .. (numInPlay[type] - #tokensTaken[type]) .. " + " .. #tokensTaken[type] .. ")" + end +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 +function sealedToken(param) + table.insert(tokensTaken[param.type], param.guid) + broadcastCount(param.type) + updateButtonLabels() +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 +function releasedToken(param) + for i, v in ipairs(tokensTaken[param.type]) do + if v == param.guid then + table.remove(tokensTaken[param.type], i) + break + end + end + updateDisplayAndBroadcast(param.type) +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 +function returnedToken(param) + for i, v in ipairs(tokensTaken[param.type]) do + if v == param.guid then + table.remove(tokensTaken[param.type], i) + numInPlay[param.type] = numInPlay[param.type] - 1 + break + end + end + updateDisplayAndBroadcast(param.type) +end + +function updateDisplayAndBroadcast(type) + if not updating then + updating = true + Wait.frames(function() + broadcastCount(type) + updateButtonLabels() + updating = false + end, 5) + end +end + +--------------------------------------------------------- +-- main functions: add and remove +--------------------------------------------------------- + +function addToken(type) + if numInPlay[type] == 10 then + printToColor("10 tokens already in play, not adding any.", playerColor) + return + end + numInPlay[type] = numInPlay[type] + 1 + printToAll("Adding " .. type .. " token " .. formatTokenCount(type)) + updateButtonLabels() + return chaosBagApi.spawnChaosToken(type) +end + +function removeToken(type) + local chaosBag = chaosBagApi.findChaosBag() + local tokens = {} + + for _, v in ipairs(chaosBag.getObjects()) do + if v.name == type then + table.insert(tokens, v.guid) + end + end + + if #tokens == 0 then + printToColor("No " .. type .. " tokens in the chaos bag.", playerColor) + return + end + + chaosBag.takeObject({ + guid = table.remove(tokens), + smooth = false, + callback_function = function(obj) + numInPlay[type] = numInPlay[type] - 1 + printToAll("Removing " .. type .. " token " .. formatTokenCount(type)) + updateButtonLabels() + obj.destruct() + end + }) +end + +-- removing tokens that were 'taken' +function removeTakenTokens(type) + local count = 0 + for _, guid in ipairs(tokensTaken[type]) do + local token = getObjectFromGUID(guid) + if token ~= nil then + token.destruct() + count = count + 1 + end + end + return count +end + +--------------------------------------------------------- +-- Wendy's Menu (context menu for cards on hotkey press) +--------------------------------------------------------- + +function addMenuOptions(parameters) + local playerColor = parameters.playerColor + local hoveredObject = parameters.hoveredObject + if hoveredObject == nil or hoveredObject.type ~= "Card" then + broadcastToColor("Right-click seal options can only be added to cards.", playerColor) + return + elseif hoveredObject.hasTag("CardThatSeals") or hoveredObject.getVar("MENU_ADDED") == true then + broadcastToColor("This card already has a sealing context menu.", playerColor) + return + end + + hoveredObject.addContextMenuItem("Seal Bless", function(color) + sealToken("Bless", color, hoveredObject) + tokenArrangerApi.layout() + end, true) + + hoveredObject.addContextMenuItem("Release Bless", function(color) + releaseToken("Bless", color, hoveredObject) + tokenArrangerApi.layout() + end, true) + + hoveredObject.addContextMenuItem("Seal Curse", function(color) + sealToken("Curse", color, hoveredObject) + tokenArrangerApi.layout() + end, true) + + hoveredObject.addContextMenuItem("Release Curse", function(color) + releaseToken("Curse", color, hoveredObject) + tokenArrangerApi.layout() + end, true) + + broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor) + hoveredObject.setVar("MENU_ADDED", true) + sealedTokens[hoveredObject.getGUID()] = {} +end + +function sealToken(type, playerColor, hoveredObject) + local chaosBag = chaosBagApi.findChaosBag() + + for i, token in ipairs(chaosBag.getObjects()) do + if token.name == type then + return chaosBag.takeObject({ + position = hoveredObject.getPosition() + Vector(0, 1, 0), + index = i - 1, + smooth = false, + callback_function = function(obj) + table.insert(sealedTokens[hoveredObject.getGUID()], obj) + table.insert(tokensTaken[type], obj.getGUID()) + tokenArrangerApi.layout() + updateDisplayAndBroadcast(type) + end + }) + end + end + printToColor(type .. " token not found in bag", playerColor) +end + +function releaseToken(type, playerColor, hoveredObject) + local chaosBag = chaosBagApi.findChaosBag() + local tokens = sealedTokens[hoveredObject.getGUID()] + if tokens == nil or #tokens == 0 then return end + + for i, token in ipairs(tokens) do + if token ~= nil and token.getName() == type then + local guid = token.getGUID() + chaosBag.putObject(token) + for j, v in ipairs(tokensTaken[type]) do + if v == guid then + table.remove(tokensTaken[type], j) + table.remove(tokens, i) + tokenArrangerApi.layout() + updateDisplayAndBroadcast(type) + return + end + end + end + end + printToColor(type .. " token not sealed on " .. hoveredObject.getName(), playerColor) +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 = {} @@ -69,7 +511,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -88,6 +530,12 @@ do 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) @@ -104,8 +552,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -144,477 +592,19 @@ do 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) -__bundle_register("chaosbag/BlessCurseManager", function(require, _LOADED, __bundle_register, __bundle_modules) -local chaosBagApi = require("chaosbag/ChaosBagApi") -local tokenArrangerApi = require("accessories/TokenArrangerApi") - --- common button parameters -local buttonParamaters = {} -buttonParamaters.function_owner = self -buttonParamaters.color = { 0, 0, 0, 0 } -buttonParamaters.width = 700 -buttonParamaters.height = 700 - -local altState = false -local MODE = { - [false] = "Add / Remove", - [true] = "Take / Return" -} -local BUTTON_COLOR = { - [false] = { 0.4, 0.4, 0.4 }, - [true] = { 0.9, 0.9, 0.9 } -} -local FONT_COLOR = { - [false] = { 1, 1, 1 }, - [true] = { 0, 0, 0 } -} -local whitespace = " " -local updating - ---------------------------------------------------------- --- creating buttons and menus + initializing tables ---------------------------------------------------------- - -function onSave() return JSON.encode(altState) end - -function onLoad(saved_state) - if saved_state ~= nil then - altState = JSON.decode(saved_state) - end - - -- index: 0 - bless - buttonParamaters.click_function = "clickBless" - buttonParamaters.position = { -1.03, 0.05, 0.46 } - self.createButton(buttonParamaters) - - -- index: 1 - curse - buttonParamaters.click_function = "clickCurse" - buttonParamaters.position[1] = -buttonParamaters.position[1] - self.createButton(buttonParamaters) - - -- index: 2 - alternative mode (take / return) - buttonParamaters.click_function = "enableAlt" - buttonParamaters.width = 900 - buttonParamaters.height = 210 - buttonParamaters.position = { -1.03, 0.05, -0.85 } - self.createButton(buttonParamaters) - - -- index: 3 - default mode (add / remove) - buttonParamaters.click_function = "enableDefault" - buttonParamaters.position[1] = -buttonParamaters.position[1] - self.createButton(buttonParamaters) - - -- load labels, tooltips and colors - updateButtons() - - -- context menu - self.addContextMenuItem("Remove all", doRemove) - self.addContextMenuItem("Reset", doReset) - - -- initializing tables - initializeState() - broadcastCount("Curse") - broadcastCount("Bless") -end - -function resetTables() - numInPlay = { Bless = 0, Curse = 0 } - tokensTaken = { Bless = {}, Curse = {} } - sealedTokens = {} -end - -function initializeState() - resetTables() - - -- 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 - elseif v.name == "Curse" then - numInPlay.Curse = numInPlay.Curse + 1 - end - end - - -- 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 obj.getName() == "Bless" then - table.insert(tokensTaken.Bless, obj.getGUID()) - numInPlay.Bless = numInPlay.Bless + 1 - elseif obj.getName() == "Curse" then - table.insert(tokensTaken.Curse, obj.getGUID()) - numInPlay.Curse = numInPlay.Curse + 1 - end - end - end -end - -function broadcastCount(token) - local count = formatTokenCount(token) - if count == "(0/0)" then return end - broadcastToAll(token .. " Tokens " .. count, "White") -end - -function broadcastStatus(color) - broadcastToColor("Curse Tokens " .. formatTokenCount("Curse"), color, "White") - broadcastToColor("Bless Tokens " .. formatTokenCount("Bless"), color, "White") -end - --- context menu function 1 -function doRemove(color) - local chaosbag = chaosBagApi.findChaosBag() - - -- remove tokens from chaos bag - local count = { Bless = 0, Curse = 0 } - for _, v in ipairs(chaosbag.getObjects()) do - if v.name == "Bless" or v.name == "Curse" then - chaosbag.takeObject({ - guid = v.guid, - position = { 0, 5, 0 }, - callback_function = function(obj) obj.destruct() end - }) - count[v.name] = count[v.name] + 1 - end - end - - broadcastToColor("Removed " .. count.Bless .. " Bless and " .. - count.Curse .. " Curse tokens from the chaos bag.", color, "White") - broadcastToColor("Removed " .. removeTakenTokens("Bless") .. " Bless and " .. - removeTakenTokens("Curse") .. " Curse tokens from play.", color, "White") - - resetTables() - tokenArrangerApi.layout() -end - --- context menu function 2 -function doReset(color) - initializeState() - broadcastCount("Curse") - broadcastCount("Bless") - tokenArrangerApi.layout() -end - --- removing tokens that were 'taken' -function removeTakenTokens(type) - local count = 0 - for _, guid in ipairs(tokensTaken[type]) do - local token = getObjectFromGUID(guid) - if token ~= nil then - token.destruct() - count = count + 1 - end - end - return count -end - ---------------------------------------------------------- --- click functions ---------------------------------------------------------- - --- click function 1 -function clickBless(_, color, isRightClick) - playerColor = color - callFunctions("Bless", isRightClick) -end - --- click function 2 -function clickCurse(_, color, isRightClick) - playerColor = color - callFunctions("Curse", isRightClick) -end - --- click function 3 -function enableAlt() - if altState then return end - altState = not altState - updateButtons() -end - --- click function 4 -function enableDefault() - if not altState then return end - altState = not altState - updateButtons() -end - ---------------------------------------------------------- --- called functions ---------------------------------------------------------- - -function updateButtons() - self.editButton({ - index = 0, - tooltip = MODE[altState] .. " Bless" - }) - - self.editButton({ - index = 1, - tooltip = MODE[altState] .. " Curse" - }) - - self.editButton({ - index = 2, - label = whitespace .. MODE[true] .. (altState and " ✓" or whitespace) .. " ", - color = BUTTON_COLOR[not altState], - font_color = FONT_COLOR[not altState] - }) - - self.editButton({ - index = 3, - label = whitespace .. MODE[false] .. (altState and whitespace or " ✓") .. " ", - color = BUTTON_COLOR[altState], - font_color = FONT_COLOR[altState] - }) -end - --- function that is called by click_functions 1+2 and calls the other functions -function callFunctions(token, isRightClick) - if not chaosBagApi.canTouchChaosTokens() then - return - end - local success - if not altState then - if isRightClick then - success = takeToken(token, true) - else - success = addToken(token) - end - else - if isRightClick then - success = returnToken(token) - else - success = takeToken(token, false) - end - end - if success ~= 0 then tokenArrangerApi.layout() end -end - --- returns a formatted string with information about the provided token type (bless / curse) -function formatTokenCount(type) - if type == nil then type = mode end - return "(" .. (numInPlay[type] - #tokensTaken[type]) .. "/" .. #tokensTaken[type] .. ")" -end - --- called by cards that seal bless/curse tokens ----@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) -end - --- called by cards that seal bless/curse tokens ----@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 - table.remove(tokensTaken[param.type], i) - break - end - end - if not updating then - updating = true - Wait.frames(function() - broadcastCount(param.type) - updating = false - end, 1) - end -end - ---------------------------------------------------------- --- main functions: add, take and return ---------------------------------------------------------- - -function addToken(type) - if numInPlay[type] == 10 then - printToColor("10 tokens already in play, not adding any.", playerColor) - return 0 - end - numInPlay[type] = numInPlay[type] + 1 - printToAll("Adding " .. type .. " token " .. formatTokenCount(type)) - return chaosBagApi.spawnChaosToken(type) -end - -function takeToken(type, remove) - local chaosbag = chaosBagApi.findChaosBag() - if not remove and not SEAL_CARD_MESSAGE then - broadcastToColor("For sealing tokens on cards try right-clicking on the card for seal options.", playerColor) - SEAL_CARD_MESSAGE = true - end - local tokens = {} - for _, v in ipairs(chaosbag.getObjects()) do - if v.name == type then - table.insert(tokens, v.guid) - end - end - if #tokens == 0 then - printToColor("No " .. type .. " tokens in the chaos bag.", playerColor) - return 0 - end - local pos = self.getPosition() + Vector(2.25, 0, 0.85) - if type == "Curse" then pos[3] = pos[3] - 1.7 end - chaosbag.takeObject({ - guid = table.remove(tokens), - position = pos, - smooth = false, - callback_function = function(obj) - if remove then - numInPlay[type] = numInPlay[type] - 1 - printToAll("Removing " .. type .. " token " .. formatTokenCount(type)) - obj.destruct() - else - table.insert(tokensTaken[type], obj.getGUID()) - printToAll("Taking " .. type .. " token " .. formatTokenCount(type)) - end - end - }) -end - -function returnToken(type) - local guid = table.remove(tokensTaken[type]) - if guid == nil then - printToColor("No " .. type .. " tokens to return", playerColor) - return 0 - end - local token = getObjectFromGUID(guid) - if token == nil then - printToColor("Couldn't find token " .. guid .. ", not returning to bag", playerColor) - return 0 - end - local chaosbag = chaosBagApi.findChaosBag() - if chaosbag == nil then - return 0 - end - chaosbag.putObject(token) - printToAll("Returning " .. type .. " token " .. formatTokenCount(type)) -end - ---------------------------------------------------------- --- Wendy Menu (context menu for cards on hotkey press) ---------------------------------------------------------- - -function addMenuOptions(parameters) - local playerColor = parameters.playerColor - local hoveredObject = parameters.hoveredObject - if hoveredObject == nil or hoveredObject.getVar("MENU_ADDED") == true then return end - if hoveredObject.tag ~= "Card" then - broadcastToColor("Right-click seal options can only be added to cards", playerColor) - return - end - - hoveredObject.addContextMenuItem("Seal Bless", function(color) - sealToken("Bless", color, hoveredObject) - tokenArrangerApi.layout() - end, true) - - hoveredObject.addContextMenuItem("Release Bless", function(color) - releaseToken("Bless", color, hoveredObject) - tokenArrangerApi.layout() - end, true) - - hoveredObject.addContextMenuItem("Seal Curse", function(color) - sealToken("Curse", color, hoveredObject) - tokenArrangerApi.layout() - end, true) - - hoveredObject.addContextMenuItem("Release Curse", function(color) - releaseToken("Curse", color, hoveredObject) - tokenArrangerApi.layout() - end, true) - - broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor) - hoveredObject.setVar("MENU_ADDED", true) - sealedTokens[hoveredObject.getGUID()] = {} -end - -function sealToken(type, playerColor, enemy) - local chaosbag = chaosBagApi.findChaosBag() - if chaosbag == nil then return end - local pos = enemy.getPosition() - - for i, token in ipairs(chaosbag.getObjects()) do - if token.name == type then - chaosbag.takeObject({ - position = { pos.x, pos.y + 1, pos.z }, - index = i - 1, - smooth = false, - callback_function = function(obj) - Wait.frames(function() - table.insert(sealedTokens[enemy.getGUID()], obj) - table.insert(tokensTaken[type], obj.getGUID()) - printToColor("Sealing " .. type .. " token " .. formatTokenCount(type), playerColor) - end, 1) - end - }) - return - end - end - printToColor(type .. " token not found in bag", playerColor) -end - -function releaseToken(type, playerColor, enemy) - local chaosbag = chaosBagApi.findChaosBag() - if chaosbag == nil then return end - local tokens = sealedTokens[enemy.getGUID()] - if tokens == nil or #tokens == 0 then return end - - for i, token in ipairs(tokens) do - if token ~= nil and token.getName() == type then - local guid = token.getGUID() - chaosbag.putObject(token) - for j, v in ipairs(tokensTaken[type]) do - if v == guid then - table.remove(tokensTaken[type], j) - table.remove(tokens, i) - printToColor("Releasing " .. type .. " token" .. formatTokenCount(type), playerColor) - return - end - end - end - end - printToColor(type .. " token not sealed on " .. enemy.getName(), playerColor) -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 tokenData 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) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token BlessCurse Manager 5933fb.yaml b/unpacked/Custom_Token BlessCurse Manager 5933fb.yaml index 1e7c6c176..4d325a2b2 100644 --- a/unpacked/Custom_Token BlessCurse Manager 5933fb.yaml +++ b/unpacked/Custom_Token BlessCurse Manager 5933fb.yaml @@ -26,7 +26,7 @@ Description: 'Left-Click: Add token from play. - See Notebook for detailed instructions.' + Check cards that seal tokens for a context menu.' DragSelectable: true GMNotes: '' GUID: 5933fb diff --git a/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua b/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua index 74208df61..b5eec7d85 100644 --- a/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua +++ b/unpacked/Custom_Token Chaos Bag Manager 023240.ttslua @@ -41,82 +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.getTable("chaosTokens") - 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 - - -- 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, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) - 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("accessories/ChaosBagManager") end) @@ -206,4 +130,86 @@ function buttonClick(index, isRightClick) end 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) 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 3e8cdcc2f..85608f361 100644 --- a/unpacked/Custom_Token Clues 3f22e5.ttslua +++ b/unpacked/Custom_Token Clues 3f22e5.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 Damage eb08d6.ttslua b/unpacked/Custom_Token Damage eb08d6.ttslua index 85608f361..3e8cdcc2f 100644 --- a/unpacked/Custom_Token Damage eb08d6.ttslua +++ b/unpacked/Custom_Token Damage eb08d6.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 Doom Counter 85c4c6.ttslua b/unpacked/Custom_Token Doom Counter 85c4c6.ttslua index 16e949acf..ec51c7394 100644 --- a/unpacked/Custom_Token Doom Counter 85c4c6.ttslua +++ b/unpacked/Custom_Token Doom Counter 85c4c6.ttslua @@ -46,6 +46,8 @@ 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") +local searchLib = require("util/SearchLib") local optionsVisible = false local options = { @@ -95,23 +97,39 @@ end -- adds the provided number to the current count function addVal(number) - number = tonumber(number) or 0 val = val + number - self.editButton({ index = 0, label = tostring(val) }) - printToAll("Doom on agenda set to: " .. val) + updateVal(val) end -- sets the current count to the provided number function updateVal(number) val = number or 0 self.editButton({ index = 0, label = tostring(val) }) - printToAll("Doom on agenda set to: " .. val) + if number then + broadcastDoom(val) + else + broadcastToAll("0 doom on the agenda", "White") + end +end + +-- called by updateVal and addVal to broadcast total doom in play, including doom threshold +function broadcastDoom(val) + local doomInPlayCounter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DoomInPlayCounter") + local doomInPlay = doomInPlayCounter.call("countDoomInPlay") + val + local doomThreshold = getDoomThreshold() + + if doomThreshold then + broadcastToAll(val .. " doom on the agenda (" .. doomInPlay .. "/" .. doomThreshold .. " in play)", "White") + else + broadcastToAll(val .. " doom on the agenda (" .. doomInPlay .. " in play)", "White") + end end -- called by "Reset" button to remove doom function startReset() if options.Agenda then - updateVal(0) + -- omitting the number will broadcast a special message just for this case + updateVal() end local doomInPlayCounter = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DoomInPlayCounter") if doomInPlayCounter then @@ -119,6 +137,35 @@ function startReset() end end +-- get doom threshold from top card of Agenda deck +function getDoomThreshold() + local agendaPos = { -2.72, 1.6, 0.37 } + local searchResult = searchLib.atPosition(agendaPos, "isCardOrDeck") + + if #searchResult == 1 then + local obj = searchResult[1] + if obj.type == "Card" then + return getDoomThresholdFromGMNotes(obj.getGMNotes()) + else + -- handle agenda deck + local containedObjects = obj.getData().ContainedObjects + local topCardData = containedObjects[#containedObjects] + return getDoomThresholdFromGMNotes(topCardData.GMNotes) + end + end + return nil +end + +-- decodes the gm notes and return the doom treshhold +function getDoomThresholdFromGMNotes(notes) + local metadata = JSON.decode(notes) or {} + if metadata.doomThresholdPerInvestigator then + return metadata.doomThresholdPerInvestigator * playAreaApi.getInvestigatorCount() + metadata.doomThreshold + else + return metadata.doomThreshold + end +end + -- XML UI functions function optionClick(_, optionName) options[optionName] = not options[optionName] @@ -162,7 +209,209 @@ do 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("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_Token Instruction Generator 240522.ttslua b/unpacked/Custom_Token Instruction Generator 240522.ttslua new file mode 100644 index 000000000..85898b6dc --- /dev/null +++ b/unpacked/Custom_Token Instruction Generator 240522.ttslua @@ -0,0 +1,194 @@ +-- 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("__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 = {} + 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_Token Instruction Generator 240522.yaml b/unpacked/Custom_Token Instruction Generator 240522.yaml new file mode 100644 index 000000000..3e1ca246d --- /dev/null +++ b/unpacked/Custom_Token Instruction Generator 240522.yaml @@ -0,0 +1,56 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +AttachedSnapPoints: +- Position: + x: 0 + y: 0.1 + z: 0.05 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +CustomImage: + CustomToken: + MergeDistancePixels: 15 + Stackable: false + StandUp: false + Thickness: 0.1 + ImageScalar: 1 + ImageSecondaryURL: '' + ImageURL: http://cloud-3.steamusercontent.com/ugc/2280574378890547614/63FE6CDF23322B6C4001514E2B8891BA998FAD71/ + WidthScale: 0 +Description: This tool can generate an description for you deck on ArkhamDB that will + instruct the deck importer to add the specified cards. +DragSelectable: true +GMNotes: '' +GUID: '240522' +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: true +LuaScript: !include 'Custom_Token Instruction Generator 240522.ttslua' +LuaScriptState: '' +MeasureMovement: false +Name: Custom_Token +Nickname: Instruction Generator +Snap: true +Sticky: true +Tooltip: true +Transform: + posX: -17.5 + posY: 1.53 + posZ: 83 + rotX: 0 + rotY: 270 + rotZ: 0 + scaleX: 1.25 + scaleY: 1 + scaleZ: 1.35 +Value: 0 +XmlUI: '' diff --git a/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua b/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua index 62c6d6787..189ba4d54 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker af7ed7.ttslua @@ -45,67 +45,61 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/InvestigatorSkillTracker") end) __bundle_register("playermat/InvestigatorSkillTracker", function(require, _LOADED, __bundle_register, __bundle_modules) -local BUTTON_PARAMETERS = {} -BUTTON_PARAMETERS.function_owner = self -BUTTON_PARAMETERS.height = 650 -BUTTON_PARAMETERS.width = 700 -BUTTON_PARAMETERS.position = { x = -4.775, y = 0.1, z = -0.03 } -BUTTON_PARAMETERS.color = { 0, 0, 0, 0 } -BUTTON_PARAMETERS.font_color = { 0, 0, 0, 100 } -BUTTON_PARAMETERS.font_size = 450 +local buttonParameters = {} +buttonParameters.function_owner = self +buttonParameters.height = 650 +buttonParameters.width = 700 +buttonParameters.position = { x = -4.775, y = 0.1, z = -0.03 } +buttonParameters.color = { 0, 0, 0, 0 } +buttonParameters.font_color = { 0, 0, 0, 100 } +buttonParameters.font_size = 450 function onSave() return JSON.encode(stats) end -- load stats and make buttons (left to right) -function onLoad(saved_data) - stats = JSON.decode(saved_data) or { 1, 1, 1, 1 } +function onLoad(savedData) + stats = JSON.decode(savedData) or { 1, 1, 1, 1 } - for i = 1, 4 do - BUTTON_PARAMETERS.label = stats[i] .. " " - BUTTON_PARAMETERS.position.x = BUTTON_PARAMETERS.position.x + 1.91 - BUTTON_PARAMETERS.click_function = attachIndex("button_click", i) - self.createButton(BUTTON_PARAMETERS) + for index = 1, 4 do + local fnName = "buttonClick" .. index + _G[fnName] = function(_, _, isRightClick) buttonClick(isRightClick, index) end + buttonParameters.click_function = fnName + buttonParameters.position.x = buttonParameters.position.x + 1.91 + self.createButton(buttonParameters) + updateButtonLabel(index) end self.addContextMenuItem("Reset to 1s", function() updateStats({ 1, 1, 1, 1 }) end) end --- helper function to carry index -function attachIndex(click_function, index) - local fn_name = click_function .. index - _G[fn_name] = function(obj, player_color, isRightClick) - _G[click_function](obj, player_color, isRightClick, index) - end - return fn_name -end - -function button_click(_, _, isRightClick, index) +function buttonClick(isRightClick, index) stats[index] = math.min(math.max(stats[index] + (isRightClick and -1 or 1), 0), 99) - changeButton(index) + updateButtonLabel(index) end -function changeButton(index) - local font_size = BUTTON_PARAMETERS.font_size +-- sync the button label to the internal value +function updateButtonLabel(index) + local fontSize = buttonParameters.font_size local whitespace = " " if stats[index] > 9 then - font_size = BUTTON_PARAMETERS.font_size * 0.65 + fontSize = buttonParameters.font_size * 0.65 whitespace = " " end - self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = font_size }) + self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = fontSize }) end --- formatting of "newStats": {Willpower, Intellect, Fight, Agility} +-- update the stats to the provided values +---@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 + + for i = 1, 4 do updateButtonLabel(i) end elseif newStats then printToAll("Provided new stats are incomplete or incorrectly formatted.", "Red") - return end - - for i = 1, 4 do changeButton(i) end end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua b/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua index 62c6d6787..6f379d44c 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker b4a5f7.ttslua @@ -41,71 +41,65 @@ 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 BUTTON_PARAMETERS = {} -BUTTON_PARAMETERS.function_owner = self -BUTTON_PARAMETERS.height = 650 -BUTTON_PARAMETERS.width = 700 -BUTTON_PARAMETERS.position = { x = -4.775, y = 0.1, z = -0.03 } -BUTTON_PARAMETERS.color = { 0, 0, 0, 0 } -BUTTON_PARAMETERS.font_color = { 0, 0, 0, 100 } -BUTTON_PARAMETERS.font_size = 450 +local buttonParameters = {} +buttonParameters.function_owner = self +buttonParameters.height = 650 +buttonParameters.width = 700 +buttonParameters.position = { x = -4.775, y = 0.1, z = -0.03 } +buttonParameters.color = { 0, 0, 0, 0 } +buttonParameters.font_color = { 0, 0, 0, 100 } +buttonParameters.font_size = 450 function onSave() return JSON.encode(stats) end -- load stats and make buttons (left to right) -function onLoad(saved_data) - stats = JSON.decode(saved_data) or { 1, 1, 1, 1 } +function onLoad(savedData) + stats = JSON.decode(savedData) or { 1, 1, 1, 1 } - for i = 1, 4 do - BUTTON_PARAMETERS.label = stats[i] .. " " - BUTTON_PARAMETERS.position.x = BUTTON_PARAMETERS.position.x + 1.91 - BUTTON_PARAMETERS.click_function = attachIndex("button_click", i) - self.createButton(BUTTON_PARAMETERS) + for index = 1, 4 do + local fnName = "buttonClick" .. index + _G[fnName] = function(_, _, isRightClick) buttonClick(isRightClick, index) end + buttonParameters.click_function = fnName + buttonParameters.position.x = buttonParameters.position.x + 1.91 + self.createButton(buttonParameters) + updateButtonLabel(index) end self.addContextMenuItem("Reset to 1s", function() updateStats({ 1, 1, 1, 1 }) end) end --- helper function to carry index -function attachIndex(click_function, index) - local fn_name = click_function .. index - _G[fn_name] = function(obj, player_color, isRightClick) - _G[click_function](obj, player_color, isRightClick, index) - end - return fn_name -end - -function button_click(_, _, isRightClick, index) +function buttonClick(isRightClick, index) stats[index] = math.min(math.max(stats[index] + (isRightClick and -1 or 1), 0), 99) - changeButton(index) + updateButtonLabel(index) end -function changeButton(index) - local font_size = BUTTON_PARAMETERS.font_size +-- sync the button label to the internal value +function updateButtonLabel(index) + local fontSize = buttonParameters.font_size local whitespace = " " if stats[index] > 9 then - font_size = BUTTON_PARAMETERS.font_size * 0.65 + fontSize = buttonParameters.font_size * 0.65 whitespace = " " end - self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = font_size }) + self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = fontSize }) end --- formatting of "newStats": {Willpower, Intellect, Fight, Agility} +-- update the stats to the provided values +---@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 + + for i = 1, 4 do updateButtonLabel(i) end elseif newStats then printToAll("Provided new stats are incomplete or incorrectly formatted.", "Red") - return end - - for i = 1, 4 do changeButton(i) 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 62c6d6787..189ba4d54 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker e598c2.ttslua @@ -45,67 +45,61 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/InvestigatorSkillTracker") end) __bundle_register("playermat/InvestigatorSkillTracker", function(require, _LOADED, __bundle_register, __bundle_modules) -local BUTTON_PARAMETERS = {} -BUTTON_PARAMETERS.function_owner = self -BUTTON_PARAMETERS.height = 650 -BUTTON_PARAMETERS.width = 700 -BUTTON_PARAMETERS.position = { x = -4.775, y = 0.1, z = -0.03 } -BUTTON_PARAMETERS.color = { 0, 0, 0, 0 } -BUTTON_PARAMETERS.font_color = { 0, 0, 0, 100 } -BUTTON_PARAMETERS.font_size = 450 +local buttonParameters = {} +buttonParameters.function_owner = self +buttonParameters.height = 650 +buttonParameters.width = 700 +buttonParameters.position = { x = -4.775, y = 0.1, z = -0.03 } +buttonParameters.color = { 0, 0, 0, 0 } +buttonParameters.font_color = { 0, 0, 0, 100 } +buttonParameters.font_size = 450 function onSave() return JSON.encode(stats) end -- load stats and make buttons (left to right) -function onLoad(saved_data) - stats = JSON.decode(saved_data) or { 1, 1, 1, 1 } +function onLoad(savedData) + stats = JSON.decode(savedData) or { 1, 1, 1, 1 } - for i = 1, 4 do - BUTTON_PARAMETERS.label = stats[i] .. " " - BUTTON_PARAMETERS.position.x = BUTTON_PARAMETERS.position.x + 1.91 - BUTTON_PARAMETERS.click_function = attachIndex("button_click", i) - self.createButton(BUTTON_PARAMETERS) + for index = 1, 4 do + local fnName = "buttonClick" .. index + _G[fnName] = function(_, _, isRightClick) buttonClick(isRightClick, index) end + buttonParameters.click_function = fnName + buttonParameters.position.x = buttonParameters.position.x + 1.91 + self.createButton(buttonParameters) + updateButtonLabel(index) end self.addContextMenuItem("Reset to 1s", function() updateStats({ 1, 1, 1, 1 }) end) end --- helper function to carry index -function attachIndex(click_function, index) - local fn_name = click_function .. index - _G[fn_name] = function(obj, player_color, isRightClick) - _G[click_function](obj, player_color, isRightClick, index) - end - return fn_name -end - -function button_click(_, _, isRightClick, index) +function buttonClick(isRightClick, index) stats[index] = math.min(math.max(stats[index] + (isRightClick and -1 or 1), 0), 99) - changeButton(index) + updateButtonLabel(index) end -function changeButton(index) - local font_size = BUTTON_PARAMETERS.font_size +-- sync the button label to the internal value +function updateButtonLabel(index) + local fontSize = buttonParameters.font_size local whitespace = " " if stats[index] > 9 then - font_size = BUTTON_PARAMETERS.font_size * 0.65 + fontSize = buttonParameters.font_size * 0.65 whitespace = " " end - self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = font_size }) + self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = fontSize }) end --- formatting of "newStats": {Willpower, Intellect, Fight, Agility} +-- update the stats to the provided values +---@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 + + for i = 1, 4 do updateButtonLabel(i) end elseif newStats then printToAll("Provided new stats are incomplete or incorrectly formatted.", "Red") - return end - - for i = 1, 4 do changeButton(i) end end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua b/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua index 62c6d6787..189ba4d54 100644 --- a/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua +++ b/unpacked/Custom_Token Investigator Skill Tracker e74881.ttslua @@ -45,67 +45,61 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("playermat/InvestigatorSkillTracker") end) __bundle_register("playermat/InvestigatorSkillTracker", function(require, _LOADED, __bundle_register, __bundle_modules) -local BUTTON_PARAMETERS = {} -BUTTON_PARAMETERS.function_owner = self -BUTTON_PARAMETERS.height = 650 -BUTTON_PARAMETERS.width = 700 -BUTTON_PARAMETERS.position = { x = -4.775, y = 0.1, z = -0.03 } -BUTTON_PARAMETERS.color = { 0, 0, 0, 0 } -BUTTON_PARAMETERS.font_color = { 0, 0, 0, 100 } -BUTTON_PARAMETERS.font_size = 450 +local buttonParameters = {} +buttonParameters.function_owner = self +buttonParameters.height = 650 +buttonParameters.width = 700 +buttonParameters.position = { x = -4.775, y = 0.1, z = -0.03 } +buttonParameters.color = { 0, 0, 0, 0 } +buttonParameters.font_color = { 0, 0, 0, 100 } +buttonParameters.font_size = 450 function onSave() return JSON.encode(stats) end -- load stats and make buttons (left to right) -function onLoad(saved_data) - stats = JSON.decode(saved_data) or { 1, 1, 1, 1 } +function onLoad(savedData) + stats = JSON.decode(savedData) or { 1, 1, 1, 1 } - for i = 1, 4 do - BUTTON_PARAMETERS.label = stats[i] .. " " - BUTTON_PARAMETERS.position.x = BUTTON_PARAMETERS.position.x + 1.91 - BUTTON_PARAMETERS.click_function = attachIndex("button_click", i) - self.createButton(BUTTON_PARAMETERS) + for index = 1, 4 do + local fnName = "buttonClick" .. index + _G[fnName] = function(_, _, isRightClick) buttonClick(isRightClick, index) end + buttonParameters.click_function = fnName + buttonParameters.position.x = buttonParameters.position.x + 1.91 + self.createButton(buttonParameters) + updateButtonLabel(index) end self.addContextMenuItem("Reset to 1s", function() updateStats({ 1, 1, 1, 1 }) end) end --- helper function to carry index -function attachIndex(click_function, index) - local fn_name = click_function .. index - _G[fn_name] = function(obj, player_color, isRightClick) - _G[click_function](obj, player_color, isRightClick, index) - end - return fn_name -end - -function button_click(_, _, isRightClick, index) +function buttonClick(isRightClick, index) stats[index] = math.min(math.max(stats[index] + (isRightClick and -1 or 1), 0), 99) - changeButton(index) + updateButtonLabel(index) end -function changeButton(index) - local font_size = BUTTON_PARAMETERS.font_size +-- sync the button label to the internal value +function updateButtonLabel(index) + local fontSize = buttonParameters.font_size local whitespace = " " if stats[index] > 9 then - font_size = BUTTON_PARAMETERS.font_size * 0.65 + fontSize = buttonParameters.font_size * 0.65 whitespace = " " end - self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = font_size }) + self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = fontSize }) end --- formatting of "newStats": {Willpower, Intellect, Fight, Agility} +-- update the stats to the provided values +---@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 + + for i = 1, 4 do updateButtonLabel(i) end elseif newStats then printToAll("Provided new stats are incomplete or incorrectly formatted.", "Red") - return end - - for i = 1, 4 do changeButton(i) end end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua index f8bcd60eb..8d10410bf 100644 --- a/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua +++ b/unpacked/Custom_Token Master Clue Counter 4a3aa4.ttslua @@ -41,10 +41,124 @@ 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("core/MasterClueCounter") +end) +__bundle_register("core/MasterClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) +local playmatApi = require("playermat/PlaymatApi") + +-- variables are intentionally global to be accessible +count = 0 +useClickableCounters = false + +function onSave() return JSON.encode(useClickableCounters) end + +function onLoad(savedData) + if savedData ~= nil then + useClickableCounters = JSON.decode(savedData) + end + self.createButton({ + label = "0", + click_function = "removeAllPlayerClues", + tooltip = "Click here to remove all collected clues", + function_owner = self, + position = { 0, 0.06, 0 }, + height = 900, + width = 900, + scale = { 1.5, 1.5, 1.5 }, + font_size = 650, + font_color = { 1, 1, 1, 100 }, + color = { 0, 0, 0, 0 } + }) + Wait.time(sumClues, 2, -1) +end + +-- removes all player clues by calling the respective function from the counting bowls / clickers +function removeAllPlayerClues() + printToAll(count .. " clue(s) from playermats removed.", "White") + playmatApi.removeClues("All") + self.editButton({ index = 0, label = "0" }) +end + +-- gets the counted values from the counting bowls / clickers and sums them up +function sumClues() + count = playmatApi.getClueCount(useClickableCounters, "All") + 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 @@ -139,6 +253,26 @@ do 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) @@ -224,6 +358,15 @@ do 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 @@ -233,6 +376,22 @@ do 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) @@ -243,7 +402,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -299,52 +458,19 @@ do 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/MasterClueCounter") -end) -__bundle_register("core/MasterClueCounter", function(require, _LOADED, __bundle_register, __bundle_modules) -local playmatApi = require("playermat/PlaymatApi") - --- variables are intentionally global to be accessible -count = 0 -useClickableCounters = false - -function onSave() return JSON.encode(useClickableCounters) end - -function onLoad(savedData) - if savedData ~= nil then - useClickableCounters = JSON.decode(savedData) - end - self.createButton({ - label = "0", - click_function = "removeAllPlayerClues", - tooltip = "Click here to remove all collected clues", - function_owner = self, - position = { 0, 0.06, 0 }, - height = 900, - width = 900, - scale = { 1.5, 1.5, 1.5 }, - font_size = 650, - font_color = { 1, 1, 1, 100 }, - color = { 0, 0, 0, 0 } - }) - Wait.time(sumClues, 2, -1) -end - --- removes all player clues by calling the respective function from the counting bowls / clickers -function removeAllPlayerClues() - printToAll(count .. " clue(s) from playermats removed.", "White") - playmatApi.removeClues("All") - self.editButton({ index = 0, label = "0" }) -end - --- gets the counted values from the counting bowls / clickers and sums them up -function sumClues() - count = playmatApi.getClueCount(useClickableCounters, "All") - self.editButton({ index = 0, label = tostring(count) }) -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 e84c9b227..13dc27d55 100644 --- a/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua +++ b/unpacked/Custom_Token Other Doom in Play 652ff3.ttslua @@ -53,7 +53,7 @@ local doomURL = "https://i.imgur.com/EoL7yaZ.png" local IGNORE_TAG = "DoomCounter_ignore" local TOTAL_PLAY_AREA = { upperLeft = { - x = -10, + x = -9, z = -35 }, lowerRight = { @@ -79,19 +79,24 @@ function onLoad() TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") ZONE = guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayAreaZone") - loopID = Wait.time(countDoom, 2, -1) + loopID = Wait.time(updateCounter, 2, -1) end -- main function -function countDoom() +function updateCounter() + local count = countDoomInPlay() + self.editButton({ index = 0, label = tostring(count) }) +end + +-- get doom in play +function countDoomInPlay() local count = 0 - -- get doom in play for _, obj in ipairs(getObjects()) do count = count + getDoomAmount(obj) end - self.editButton({ index = 0, label = tostring(count) }) + return count end -- gets quantity (for stacks) of doom @@ -107,16 +112,18 @@ end -- removes doom from playermats / playarea function removeDoom(options) - local count = 0 - if options.Playermats then - count = removeDoomFromList(playmatApi.searchAroundPlaymat("All")) - broadcastToAll(count .. " doom removed from Playermats.", "White") + local count = removeDoomFromList(playmatApi.searchAroundPlaymat("All")) + if count > 0 then + broadcastToAll(count .. " doom removed from playermats.", "White") + end end if options.Playarea then - count = removeDoomFromList(ZONE.getObjects()) - broadcastToAll(count .. " doom removed from Playerarea.", "White") + local count = removeDoomFromList(ZONE.getObjects()) + if count > 0 then + broadcastToAll(count .. " doom removed from play area.", "White") + end end end @@ -133,6 +140,7 @@ function removeDoomFromList(objList) return count end +-- helper function to check if a position is inside an area function inArea(point, bounds) return (point.x < bounds.upperLeft.x and point.x > bounds.lowerRight.x @@ -167,6 +175,18 @@ do 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) @@ -174,6 +194,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -268,6 +289,26 @@ do 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) @@ -353,6 +394,15 @@ do 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 @@ -362,6 +412,22 @@ do 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) @@ -372,7 +438,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -401,4 +467,72 @@ do 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") \ No newline at end of file diff --git a/unpacked/Custom_Token Play Area 721ba2.ttslua b/unpacked/Custom_Token Play Area 721ba2.ttslua index 1e2bdd88b..883e9498b 100644 --- a/unpacked/Custom_Token Play Area 721ba2.ttslua +++ b/unpacked/Custom_Token Play Area 721ba2.ttslua @@ -41,6 +41,92 @@ 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 = {} @@ -90,6 +176,16 @@ do 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) @@ -98,7 +194,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -193,9 +289,9 @@ __bundle_register("__root", function(require, _LOADED, __bundle_register, __bund require("core/PlayArea") end) __bundle_register("core/PlayArea", function(require, _LOADED, __bundle_register, __bundle_modules) ---------------------------------------------------------- --- general setup ---------------------------------------------------------- +local guidReferenceApi = require("core/GUIDReferenceApi") +local searchLib = require("util/SearchLib") +local tokenManager = require("core/token/TokenManager") -- Location connection directional options local BIDIRECTIONAL = 0 @@ -206,7 +302,6 @@ local INCOMING_ONE_WAY = 2 local CONNECTION_THICKNESS = 0.015 local DRAGGING_CONNECTION_THICKNESS = 0.15 local DRAGGING_CONNECTION_COLOR = { 0.8, 0.8, 0.8, 1 } -local CONNECTION_COLOR = { 0.4, 0.4, 0.4, 1 } local DIRECTIONAL_ARROW_DISTANCE = 3.5 local ARROW_ARM_LENGTH = 0.9 local ARROW_ANGLE = 25 @@ -214,14 +309,10 @@ 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 --- we use this to turn off collision handling until onLoad() is complete -local collisionEnabled = false - -- 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 DEFAULT_URL = "http://cloud-3.steamusercontent.com/ugc/998015670465071049/FFAE162920D67CF38045EFBD3B85AD0F916147B2/" local SHIFT_OFFSETS = { left = { x = 0.00, y = 0, z = 7.67 }, @@ -239,15 +330,13 @@ local LOC_LINK_EXCLUDE_SCENARIOS = { ["The Heart of Madness"] = true } -local guidReferenceApi = require("core/GUIDReferenceApi") -local tokenManager = require("core/token/TokenManager") local clueData = {} local spawnedLocationGUIDs = {} local locations = {} local locationConnections = {} local draggingGuids = {} local missingData = {} -local locationData, currentScenario +local locationData, currentScenario, connectionsEnabled --------------------------------------------------------- -- general code @@ -255,19 +344,20 @@ local locationData, currentScenario function onSave() return JSON.encode({ - trackedLocations = locations, - currentScenario = currentScenario, + trackedLocations = locations, + currentScenario = currentScenario, + connectionColor = connectionColor, + connectionsEnabled = connectionsEnabled }) end -function onLoad(saveState) - -- records locations we have spawned clues for - local save = JSON.decode(saveState) or {} - locations = save.trackedLocations or {} - currentScenario = save.currentScenario - - self.interactable = false - Wait.time(function() collisionEnabled = true end, 1) +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 @@ -280,15 +370,16 @@ function updateLocations(args) 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 Playmat Image Applied", { 0.2, 0.9, 0.2 }) + broadcastToAll("New Playarea Image Applied", { 0.2, 0.9, 0.2 }) else customInfo.image = DEFAULT_URL - broadcastToAll("Default Playmat Image Applied", { 0.2, 0.9, 0.2 }) + broadcastToAll("Default Playarea Image Applied", { 0.2, 0.9, 0.2 }) end self.setCustomObject(customInfo) @@ -303,12 +394,13 @@ function updateSurface(newURL) 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 not collisionEnabled or (objType ~= "Card" and objType ~= "CardCustom") then + if objType ~= "Card" and objType ~= "CardCustom" then if objType == "Deck" then table.insert(missingData, obj) end @@ -402,7 +494,7 @@ function onUpdate() -- Even if the last location left the play area, need one last draw to clear the lines needsConnectionDraw = true end - if (needsConnectionRebuild) then + if needsConnectionRebuild then rebuildConnectionList() end if needsConnectionDraw then @@ -498,7 +590,7 @@ function rebuildConnectionList() 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 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) @@ -547,6 +639,7 @@ end function drawBaseConnections() if not showLocationLinks() then locationConnections = {} + self.setVectorLines({}) return end local cardConnectionLines = {} @@ -555,10 +648,10 @@ function drawBaseConnections() -- 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 + 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 + 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 @@ -590,7 +683,7 @@ function drawDraggingConnections() ownedVectors[originGuid] = {} for targetGuid, direction in pairs(targetGuids) do local target = getObjectFromGUID(targetGuid) - if target != nil then + if target ~= nil then if direction == BIDIRECTIONAL then addBidirectionalVector(origin, target, origin, ownedVectors[originGuid]) elseif direction == ONE_WAY then @@ -626,7 +719,7 @@ function addBidirectionalVector(card1, card2, vectorOwner, lines) table.insert(lines, { points = { pos1, pos2 }, - color = vectorOwner == self and CONNECTION_COLOR or DRAGGING_CONNECTION_COLOR, + color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, }) end @@ -668,7 +761,7 @@ function addOneWayVector(origin, target, vectorOwner, lines) end -- Draws an arrowhead at the given position. ----@param arrowheadPosition Table Centerpoint of the arrowhead to draw (NOT the tip of the arrow) +---@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 @@ -684,7 +777,7 @@ function addArrowLines(arrowheadPos, originPos, vectorOwner, lines) local arm2 = vectorOwner.positionToLocal(arrowArm2) table.insert(lines, { points = { arm1, head, arm2 }, - color = vectorOwner == self and CONNECTION_COLOR or DRAGGING_CONNECTION_COLOR, + color = vectorOwner == self and connectionColor or DRAGGING_CONNECTION_COLOR, thickness = vectorOwner == self and CONNECTION_THICKNESS or DRAGGING_CONNECTION_THICKNESS, }) end @@ -751,7 +844,7 @@ function onScenarioChanged(scenarioName) end function showLocationLinks() - return not LOC_LINK_EXCLUDE_SCENARIOS[currentScenario] + return not LOC_LINK_EXCLUDE_SCENARIOS[currentScenario] and connectionsEnabled end -- Sets this playmat's snap points to limit snapping to locations or not. @@ -774,6 +867,20 @@ function setLimitSnapsByType(matchTypes) 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 @@ -803,25 +910,8 @@ 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) - for _, v in ipairs(searchOnObj(card)) do - local obj = v.hit_object - if obj.memo == "clueDoom" and obj.is_face_down == false then - return true - end - end - return false -end - --- searches on an object (by using its bounds) ----@param obj Object Object to search on -function searchOnObj(obj) - return Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0.5, - type = 3, - size = obj.getBounds().size, - origin = obj.getPosition() - }) + local searchResult = searchLib.onObject(card, "isClue") + return #searchResult > 0 end -- highlights all locations in the play area without metadata @@ -900,6 +990,18 @@ do 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) @@ -908,6 +1010,7 @@ 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 = { @@ -1062,7 +1165,7 @@ do ---@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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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() @@ -1104,7 +1207,7 @@ do -- 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 Number Subtype of token to spawn. This will only differ from the tokenName for resource 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 @@ -1313,7 +1416,7 @@ do -- Spawn tokens for a location using data retrieved from the Data Helper. ---@param card Object Card to maybe spawn tokens for - ---@param playerData Table Location data structure retrieved from the DataHelper. Should be + ---@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) @@ -1393,12 +1496,10 @@ do if mat.positionToLocal(cardPos).x < -1 then return end -- get current amount of resource tokens on the card - local search = internal.searchOnCard(cardPos, card.getRotation()) local clickableResourceCounter = nil local foundTokens = 0 - for _, obj in ipairs(search) do - local obj = obj.hit_object + for _, obj in ipairs(searchLib.onObject(card, "isTileOrToken")) do local memo = obj.getMemo() if (stateTable[memo] or 0) > 0 then @@ -1430,40 +1531,7 @@ do end end - -- searches on a card (standard size) and returns the result - ---@param position Table Position of the card - ---@param rotation Table Rotation of the card - internal.searchOnCard = function(position, rotation) - return Physics.cast({ - origin = position, - direction = {0, 1, 0}, - orientation = rotation, - type = 3, - size = { 2.5, 0.5, 3.5 }, - max_distance = 1, - debug = false - }) - 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) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Play Area 721ba2.yaml b/unpacked/Custom_Token Play Area 721ba2.yaml index 4f59dfabf..6f875b56d 100644 --- a/unpacked/Custom_Token Play Area 721ba2.yaml +++ b/unpacked/Custom_Token Play Area 721ba2.yaml @@ -616,7 +616,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true LuaScript: !include 'Custom_Token Play Area 721ba2.ttslua' -LuaScriptState: '{"trackedLocations":[]}' +LuaScriptState: '{"connectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"connectionsEnabled":true,"trackedLocations":[]}' MeasureMovement: false Name: Custom_Token Nickname: Play Area diff --git a/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua b/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua index 2697e32e8..bf624736c 100644 --- a/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua +++ b/unpacked/Custom_Token Playmat Image Swapper b7b45b.ttslua @@ -41,18 +41,65 @@ 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 +local typeIndex, selectionIndex, plainNameCache -function onSave() return JSON.encode({typeIndex = typeIndex, selectionIndex = selectionIndex}) end +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 } @@ -61,17 +108,18 @@ function onLoad(savedData) local loadedData = JSON.decode(savedData) or {} typeIndex = loadedData.typeIndex or 1 selectionIndex = loadedData.selectionIndex or 1 - Wait.time(updatePlayareaGallery, 0.5) + Wait.time(updatePlayAreaGallery, 0.5) + math.randomseed(os.time()) end -- click function for main button function onClick_toggleGallery() - Global.call("togglePlayareaGallery") + Global.call("togglePlayAreaGallery") end function onClick_defaultImage() playAreaApi.updateSurface() - Global.call("togglePlayareaGallery") + Global.call("togglePlayAreaGallery") end function getDataSubTableByIndex(dataTable, index) @@ -83,7 +131,7 @@ function getDataSubTableByIndex(dataTable, index) return {} end -function updatePlayareaGallery() +function updatePlayAreaGallery() -- get subtables local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) @@ -141,12 +189,12 @@ end function onClick_imageTab(_, _, tabId) typeIndex = tonumber(tabId:sub(9)) selectionIndex = 1 - updatePlayareaGallery() + updatePlayAreaGallery() end function onClick_listItem(_, _, listId) selectionIndex = tonumber(listId:sub(10)) - updatePlayareaGallery() + updatePlayAreaGallery() end function onClick_image(_, _, id) @@ -155,7 +203,7 @@ function onClick_image(_, _, id) local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) local newURL = dataForSelection[imageIndex].URL playAreaApi.updateSurface(newURL) - Global.call("togglePlayareaGallery") + Global.call("togglePlayAreaGallery") end function highlightTabAndItem() @@ -190,6 +238,84 @@ 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 @@ -240,6 +366,16 @@ do 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) @@ -248,7 +384,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -309,109 +445,109 @@ PLAYAREA_IMAGE_DATA = { ["Night of the Zealot"] = { { Name = "I - The Gathering 1", - URL = "https://i.ibb.co/6NWqg1K/Zealot-Gathering.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725443007/D34B55D2637EF1DF22839D12F9CF74F92F8EB486/" }, { - Name = "III - Devourer Below 1", - URL = "https://i.ibb.co/x5QFzrx/Zealot-3-Devourer-Below-Helen-Castelow.png" + Name = "III - The Devourer Below 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725443203/FBE04C8B89F79D18C6D29C28DC3B292A5A3A3DEB/" }, { - Name = "III - Devourer Below 2", - URL = "https://i.ibb.co/6r6LFGz/Zealot-3-Devourer-Below-Sarah-Miller.png" + Name = "III - The Devourer Below 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725443345/FD10BC04B3F3AFD710C3C12EE14F85F9AFB265E6/" } }, ["The Dunwich Legacy"] = { { Name = "I-A - Extracurricular Activity 1", - URL = "https://i.ibb.co/tDxX8KS/Dunwich-1-Extracurricular-Activity-Igor-Kirdeika.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725401398/AC55F0754B7E4A39796A6F2236012AE03DA55E20/" }, { Name = "I-A - Extracurricular Activity 2", - URL = "https://i.ibb.co/RQ6z0pj/Dunwich-1-Extracurricular-Activity-Joseph-Diaz.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725401658/9F3ED6E256818C4528D55980B9D7E44B87170A4F/" }, { Name = "I-A - Extracurricular Activity 3", - URL = "https://i.ibb.co/nnJdwL2/Dunwich-1-Extracurricular-Activity-Tomasz-Jedruszek.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725401870/FE29404D9D93BE2735D41C115DDD9708A0931F3E/" }, { - Name = "I-B - House Always Wins 1", - URL = "https://i.ibb.co/8XPLdr9/Dunwich-2-House-Always-Wins-Jonny-Klein.jpg" + Name = "I-B - The House Always Wins 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402059/4C4A50D259ECFD4DFB94FABB9FA2AD3AABDCA0CA/" }, { - Name = "I-B - House Always Wins 2", - URL = "https://i.ibb.co/HtX95GK/Dunwich-2-House-Always-Wins-Robert-Laskey.jpg" + Name = "I-B - The House Always Wins 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402263/8B0C981B78E803B3BFD64AC874F315B6810E579B/" }, { - Name = "I-B - House Always Wins 3", - URL = "https://i.ibb.co/MCLP3Sz/Dunwich-2-House-Always-Wins-XX-l.jpg" + Name = "I-B - The House Always Wins 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402460/8599D17306C644D75D189591BC6D57C2F27F9E35/" }, { - Name = "I-B - House Always Wins 4", - URL = "https://i.ibb.co/w7Pf5sd/Dunwich-2-House-Always-Wins-XX-l-2.jpg" + Name = "I-B - The House Always Wins 4", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402641/777865B25BCF86C2EFEAE232AFBC31561D12AE0F/" }, { - Name = "II - Miskatonic Museum 1", - URL = "https://i.ibb.co/x1Kf7qG/Dunwich-3-Miskatonic-Museum-Emre-Aktuna.jpg" + Name = "II - The Miskatonic Museum 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402804/A44E68AC08E6568A757429B29E71C703B76FA159/" }, { - Name = "II - Miskatonic Museum 2", - URL = "https://i.ibb.co/yWXVPcN/Dunwich-3-Miskatonic-Museum-Richard-Wright.jpg" + Name = "II - The Miskatonic Museum 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403000/B28D46D5B7BCE9EA9BF27D3A0A932393D8258A76/" }, { - Name = "III - Essex County Express", - URL = "https://i.ibb.co/602CMZb/Dunwich-4-Essex-County-Express-David-Alvarez.jpg" + Name = "III - The Essex County Express", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403150/956BE4B5C25805E57C8FC5CF28A94BD7EF07CA54/" }, { Name = "IV - Blood on the Altar 1", - URL = "https://i.ibb.co/3CYHDhf/Dunwich-5-Blood-on-the-Altar.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403290/07DD1508BA880AD1212A820BC29471C48DC90C53/" }, { Name = "IV - Blood on the Altar 2", - URL = "https://i.ibb.co/FbxcCY2/Dunwich-5-Blood-on-the-Altar-Chris-Ostrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403456/A74398E8CCD78657C2555832A3B340723E8C9117/" }, { Name = "IV - Blood on the Altar 3", - URL = "https://i.ibb.co/sJf6YsZ/Dunwich-5-Blood-on-the-Altar-Lucas-Staniec.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403636/CD89D7D9CC020F41D5AD02D54E308877583EC45F/" }, { Name = "IV - Blood on the Altar 4", - URL = "https://i.ibb.co/kBPNGBd/Dunwich-5-Blood-on-the-Altar-Mark-Molnar.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403818/AEFAC50DAC82271BCACC53B8FF69B5B094FA1078/" }, { Name = "V - Undimensioned and Unseen 1", - URL = "https://i.ibb.co/QvfhjDv/Dunwich-6-Undimensioned-and-Unseen-Frej-Agelii.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403955/E7C566E536CF6E910DB654FC1DBF4838F2BAF899/" }, { Name = "V - Undimensioned and Unseen 2", - URL = "https://i.ibb.co/4VL9gSK/Dunwich-6-Undimensioned-and-Unseen-Lucas-Staniec.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404127/F92F123BBD3D857C579B9284988C3AFFBCD84B2B/" }, { Name = "V - Undimensioned and Unseen 3", - URL = "https://i.ibb.co/wBFsS8P/Dunwich-6-Undimensioned-and-Unseen-Michal-Teliga-jpg.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404273/7F8CFE6785BD74BB8D5E34C204AFB8AA580CA3E3/" }, { Name = "V - Undimensioned and Unseen 4", - URL = "https://i.ibb.co/wwGDcq6/Dunwich-6-Undimensioned-and-Unseen-Tomasz-Jedruszek.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404424/C2AE08371CF2DE2777791BBD4AEF446E50532382/" }, { Name = "VI - Where Doom Awaits 1", - URL = "https://i.ibb.co/TvMwqj4/Dunwich-7-Where-Doom-Awaits.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404578/A520CE0F6B0C8591A48ADEF34E68B46AFC2BC83B/" }, { Name = "VI - Where Doom Awaits 2", - URL = "https://i.ibb.co/S6cSLH9/Dunwich-7-Where-Doom-Awaits-3.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404740/1FF9EF375BDBB73CA8F0A1562F215692AAEA7131/" }, { Name = "VI - Where Doom Awaits 3", - URL = "https://i.ibb.co/khBX32g/Dunwich-7-Where-Doom-Awaits-4.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404914/5473D20CE0122F55EEADB16C4353D4EDD91E440E/" }, { Name = "VI - Where Doom Awaits 4", - URL = "https://i.ibb.co/S0hcwN8/Dunwich-7-Where-Doom-Awaits-5.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405088/A0AA8CB864747152763D434D0737D81EB515E71B/" }, { Name = "VI - Where Doom Awaits 5", - URL = "https://i.ibb.co/Lxv1Bjp/Dunwich-7-Where-Doom-Awaits-Luca-Trentin.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405247/FAF408DAAD4FC72142DFDFE5FCEA4B84293AA72C/" }, { Name = "VII - Lost in Time and Space 1", @@ -419,483 +555,483 @@ PLAYAREA_IMAGE_DATA = { }, { Name = "VII - Lost in Time and Space 2", - URL = "https://i.ibb.co/dBXP0GL/Dunwich-8-Lost-in-Time-amp-Space-Chris-Ostrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405746/771BAE40F98BB16F8D011FA794E4AC0095131AF1/" }, { Name = "VII - Lost in Time and Space 3", - URL = "https://i.ibb.co/0XcnxFD/Dunwich-8-Lost-in-Time-amp-Space-Lino-Drieghe.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725406148/D15D56EA34F27C651D7E7AC202DA4DEBE395E310/" } }, ["The Path to Carcosa"] = { { Name = "I - Curtain Call", - URL = "https://i.ibb.co/TcnKXJD/Carcosa-1-Curtain-Call-Mark-Molnar.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426327/41F6192EDCFFD6AAE2EE44C2BB5708B19D7464A9/" }, { - Name = "II - Last King 1", - URL = "https://i.ibb.co/JRQJKR8/Carcosa-2-Last-King-Cristi-Balanescu.jpg" + Name = "II - The Last King 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426499/114EAEA245AC51CA219364AF26341E7F7E649A7D/" }, { - Name = "II - Last King 2", - URL = "https://i.ibb.co/NZzBwgv/Carcosa-2-Last-King-Cristi-Balanescu-2.jpg" + Name = "II - The Last King 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426683/A2762E95DD79D7A7BC749925166BBFC18B62EF3B/" }, { - Name = "II - Last King 3", - URL = "https://i.ibb.co/x56ZHt7/Carcosa-2-Last-King-Wu-Mengjia.jpg" + Name = "II - The Last King 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426818/A6A20773EA95CE3D9896B22E317A0E1ACCA911F0/" }, { Name = "III - Echoes of the Past", - URL = "https://i.ibb.co/R6gSm0D/Carcosa-3-Echoes-of-the-Past-Heather-Savage.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427005/25F51DE4B1F33C16A0E68C929E5002F0C4520A37/" }, { - Name = "IV - Unspeakable Oath 1", - URL = "https://i.ibb.co/DzzDQQQ/Carcosa-4-Unspeakable-Oath.jpg" + Name = "IV - The Unspeakable Oath 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427178/9575E4F6E53DDAD2D3E61684AB9757B04E1EF787/" }, { - Name = "IV - Unspeakable Oath 2", - URL = "https://i.ibb.co/9gqBzXr/Carcosa-4-Unspeakable-Oath-2-Mark-Molnar.jpg" + Name = "IV - The Unspeakable Oath 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427342/199A6C6411992ACFB8A417E86207FE6CE956EB97/" }, { - Name = "IV - Unspeakable Oath 3", - URL = "https://i.ibb.co/wWL73c9/Carcosa-4-Unspeakable-Oath-Paul-Fairbairn.jpg" + Name = "IV - The Unspeakable Oath 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427501/48525BCDFA281947FA9ED26507BC1F81C07056E8/" }, { - Name = "V - Phantom of Truth 1", - URL = "https://i.ibb.co/mzpz1Dd/Carcosa-5-Phantom-of-Truth-Lucas-Staniec.jpg" + Name = "V - A Phantom of Truth 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427681/F72B02FF1A5E58CBCB0E53C8455310AF37064477/" }, { - Name = "V - Phantom of Truth 2", - URL = "https://i.ibb.co/Vp1wNbT/Carcosa-5-Phantom-of-Truth-Tomasz-Jedruszek.jpg" + Name = "V - A Phantom of Truth 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427848/215A757FF28317EB3EF7CF1F9CAE6F1CFF735091/" }, { - Name = "VI - Pallid Mask 1", - URL = "https://i.ibb.co/Bf5LByY/Carcosa-6-Pallid-Mask-Greg-Bobrowski.jpg" + Name = "VI - The Pallid Mask 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428067/D46BAD80B112156A2D3DEFF247A74C74F27DDA12/" }, { - Name = "VI - Pallid Mask 2", - URL = "https://i.ibb.co/1v1J9Xx/Carcosa-6-Pallid-Mask-Rafal-Pyra.jpg" + Name = "VI - The Pallid Mask 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428250/464681CF59770BFD493A0D672C7CB70BA8CD3499/" }, { - Name = "VII - Black Star Rises 1", - URL = "https://i.ibb.co/TB451t7/Carcosa-7-Black-Star-Rises-Audric-Gatoux.jpg" + Name = "VII - Black Stars Rise 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428431/4766E1A4893E0EF16B576749B73CE449F10DA20C/" }, { - Name = "VII - Black Star Rises 2", - URL = "https://i.ibb.co/nC8Ncxx/Carcosa-7-Black-Star-Rises-Chris-Kintner.jpg" + Name = "VII - Black Stars Rise 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428896/05ED3D08F29C8E6EC080F0615DE130F2A687A9AC/" }, { Name = "VIII - Dim Carcosa 1", - URL = "https://i.ibb.co/QvS4y3D/Carcosa-8-Dim-Carcosa-Alexandr-Elichev.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725429052/BA81DBDE7A12B993CB8B7001CA93095AD0512449/" }, { Name = "VIII - Dim Carcosa 2", - URL = "https://i.ibb.co/hR95x7k/Carcosa-8-Dim-Carcosa-Yuri-Shepherd.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725429235/C5C939E0213575B5EDCA6723D209892071DDE4B5/" } }, ["The Forgotten Age"] = { { - Name = "I - Untamed Wilds 1", - URL = "https://i.ibb.co/BLhwCG1/Forgotten-Age-1-Untamed-Wilds-David-Frasheski.jpg" + Name = "I - The Untamed Wilds 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725446729/7F5E48BC9A028AE5117231364F2D5B433A62239A/" }, { - Name = "I - Untamed Wilds 2", - URL = "https://i.ibb.co/SnJfsNy/Forgotten-Age-1-Untamed-Wilds-David-Frasheski-2.jpg" + Name = "I - The Untamed Wilds 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725446946/55C374DC5BE3620CB0D5BCA379EA55CF471D09B3/" }, { - Name = "I - Untamed Wilds 3", - URL = "https://i.ibb.co/kcx1tvp/Forgotten-Age-1-Untamed-Wilds-Ethan-Patrick-Harris.jpg" + Name = "I - The Untamed Wilds 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447172/6EAE2CFD3AC552CFB744C75E4E26A79264DE17D3/" }, { - Name = "I - Untamed Wilds 4", - URL = "https://i.ibb.co/HPbJwXk/Forgotten-Age-1-Untamed-Wilds-Lucas-Staniec.jpg" + Name = "I - The Untamed Wilds 4", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447409/FCF48C94D90F94FBFFD674B0650E288E7312C441/" }, { - Name = "I - Untamed Wilds 5", - URL = "https://i.ibb.co/bbq1ZrK/Forgotten-Age-1-Untamed-Wilds-Nele-Diel.jpg" + Name = "I - The Untamed Wilds 5", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447579/F7C3FB9E31147430C1384684887FC66E616D0302/" }, { - Name = "II - Doom of Etzli 1", - URL = "https://i.ibb.co/Pw4by4q/Forgotten-Age-2-Doom-of-Eztli-Cristi-Balanescu.jpg" + Name = "II - The Doom of Eztli 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447752/44EF68E1BF3C2D9DCD5306DD90B4CCCFBE03891C/" }, { - Name = "II - Doom of Etzli 2", - URL = "https://i.ibb.co/xqW6cXR/Forgotten-Age-2-Doom-of-Eztli-Greg-Bobrowski.jpg" + Name = "II - The Doom of Eztli 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448027/F5F14EC590C33BC87D8F0CFF43D7E4DF80D61133/" }, { - Name = "II - Doom of Etzli 3", - URL = "https://i.ibb.co/kgsC3pb/Forgotten-Age-2-Doom-of-Eztli-Nele-Diel.jpg" + Name = "II - The Doom of Eztli 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448215/BFD9D940DB8EC9AC8D818C48BBAE3338A8E48A3B/" }, { Name = "III - Threads of Fate", - URL = "https://i.ibb.co/Bn0Pjng/Forgotten-Age-3-Threads-of-Fate-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448393/67F3BE7DC1BEC807A17D3F8914328D408856E019/" }, { - Name = "IV - Boundary Beyond 1", - URL = "https://i.ibb.co/yPZ9v2X/Forgotten-Age-4-Boundary-Beyond-Greg-Bobrowski-2-jpg.jpg" + Name = "IV - The Boundary Beyond 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448568/3C268415A47430CEEC3F9BFB216EF57E3DBF820A/" }, { - Name = "IV - Boundary Beyond 2", - URL = "https://i.ibb.co/vm0JgFs/Forgotten-Age-4-Boundary-Beyond-Greg-Bobrowski-jpg.jpg" + Name = "IV - The Boundary Beyond 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448701/3FA23DCA30505AD4C27D8914740AD3138C01122C/" }, { - Name = "IV - Boundary Beyond 3", - URL = "https://i.ibb.co/D1rh9Ry/Forgotten-Age-4-Boundary-Beyond-Nele-Diel.jpg" + Name = "IV - The Boundary Beyond 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448863/266C3320AC326C30F08FBC11A95567E1249E7FB7/" }, { - Name = "V - Heart of the Elders I-1", - URL = "https://i.ibb.co/jzKvv6P/Forgotten-Age-5-Heart-of-the-Elders-I-Lucas-Staniec.jpg" + Name = "V - Heart of the Elders 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449019/A6CC459ACA004C33DD9605BE8382437F6BBE24F7/" }, { - Name = "V - Heart of the Elders I-2", - URL = "https://i.ibb.co/mR79MX4/Forgotten-Age-5-Heart-of-the-Elders-I-Lucas-Staniec-2.jpg" + Name = "V - Heart of the Elders 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449150/241FA88572B6B4F652D7FC6D1EDB23DF94E3199C/" }, { - Name = "V - Heart of the Elders II", - URL = "https://i.ibb.co/pQSbL0t/Forgotten-Age-5-Heart-of-the-Elders-II-Nele-Diel.jpg" + Name = "V - Heart of the Elders 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449310/DBD731498FAB399A4155F7B64F8710BF5FBB5C1F/" }, { - Name = "VI - City of Archives 1", - URL = "https://i.ibb.co/f04DSPb/Forgotten-Age-6-City-of-Archives.jpg" + Name = "VI - The City of Archives 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449473/527CB6470F508D4E1F1E4AFC8A0D3AB0A65E046E/" }, { - Name = "VI - City of Archives 2", - URL = "https://i.ibb.co/WsSBrYj/Forgotten-Age-6-City-of-Archives-2.jpg" + Name = "VI - The City of Archives 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449630/A8E933F79A646990155CC18A2143B3BC16222750/" }, { - Name = "VI - City of Archives 3", - URL = "https://i.ibb.co/qdPbSZ8/Forgotten-Age-6-City-of-Archives-Chris-Ostrowski.jpg" + Name = "VI - The City of Archives 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449814/30BB7E4F8D9F1571A420372E78ACAF2D7792811F/" }, { - Name = "VII - Depths of Yoth 1", - URL = "https://i.ibb.co/dbLKgGv/Forgotten-Age-7-Depths-of-Yoth-Diego-Arbetta.jpg" + Name = "VII - The Depths of Yoth 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449962/D69532827DFF2D654F8A606B7917D593F52D7624/" }, { - Name = "VII - Depths of Yoth 2", - URL = "https://i.ibb.co/NW7Wp98/Forgotten-Age-7-Depths-of-Yoth-Greg-Bobrowski.jpg" + Name = "VII - The Depths of Yoth 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450085/479A8A1BDD7BE80B43AE4F2C14DFA811D7B28482/" }, { - Name = "VII - Depths of Yoth 3", - URL = "https://i.ibb.co/257zr7c/Forgotten-Age-7-Depths-of-Yoth-Greg-Bobrowski-2-jpg.jpg" + Name = "VII - The Depths of Yoth 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450258/E617F5A78DFBE913652E20BF97D38B91087FACAE/" }, { Name = "VIII - Shattered Aeons 1", - URL = "https://i.ibb.co/KwnWTGR/Forgotten-Age-8-Shattered-Aeons.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450415/5631152D4830C00DB8D8EB2163CE773542A62C79/" }, { Name = "VIII - Shattered Aeons 2", - URL = "https://i.ibb.co/b7kVd4F/Forgotten-Age-8-Shattered-Aeons-Alexandr-Elichev.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450556/C3000D020B0C32B4DA3420AEE5E286893453FC49/" } }, ["The Circle Undone"] = { { - Name = "0 - Prologue", - URL = "https://i.ibb.co/gm4C6yy/Circle-Undone-0-Prologue-Ted-Galaday.jpg" + Name = "0 - Disappearance at the Twilight Estate", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457506/6E228F87CEDCD3A0CFA28B680C266B4C68C7682B/" }, { - Name = "I - Witching Hour", - URL = "https://i.ibb.co/kgJ34WS/Circle-Undone-1-Witching-Hour-Nele-Diel.jpg" + Name = "I - The Witching Hour", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457706/D0FDC0E9287C343745AE6135352194D654D98B64/" }, { Name = "II - At Death's Doorstep 1", - URL = "https://i.ibb.co/qNWzH0Y/Circle-Undone-2-At-Death-039-s-Doorstep-Emilio-Rodriguez.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457864/3106851EC93B1FC01311BD68F02145BA2FD720B0/" }, { Name = "II - At Death's Doorstep 2", - URL = "https://i.ibb.co/T1zp1QN/Circle-Undone-2-At-Death-039-s-Doorstep-Emilio-Rodriguez-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458037/155EB572CF28F09A64A021CAC3A3219C31B2CD49/" }, { Name = "II - At Death's Doorstep 3", - URL = "https://i.ibb.co/ZJfYZ1w/Circle-Undone-2-At-Death-039-s-Doorstep-Majid-Azim.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458187/482CC6730F267061A055D6FD402603BC642A9635/" }, { Name = "III - The Secret Name 1", - URL = "https://i.ibb.co/hsBw4JQ/Circle-Undone-3-Secret-Name-Jeff-Jumper.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458373/769D67103FACFB94E77465E85DBB2A250284B59B/" }, { Name = "III - The Secret Name 2", - URL = "https://i.ibb.co/MpcPXR5/Circle-Undone-3-Secret-Name-Pierre-Santamaria.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458592/D70CE9B1AD7158AF206A25777A8BA6F284587A83/" }, { Name = "III - The Secret Name 3", - URL = "https://i.ibb.co/LQ8rdKs/Circle-Undone-3-The-Secret-Name-Greg-Bobrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458848/2FC0D5AFFA97AB5E80244F1ED711036B2149B0EE/" }, { Name = "III - The Secret Name 4", - URL = "https://i.ibb.co/0D7LzxV/Circle-Undone-3-The-Secret-Name-Robert-Laskey.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459026/A1A5B18ECB38985A35781CBDFF53935541720AF4/" }, { - Name = "IV - Wages of Sin 1", - URL = "https://i.ibb.co/fDMqH1C/Circle-Undone-4-Wages-of-Sin-Emilio-Rodriguez.jpg" + Name = "IV - The Wages of Sin 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459182/46870E1DBE623E93E675CB2D3C1E959B40CDCC83/" }, { - Name = "IV - Wages of Sin 2", - URL = "https://i.ibb.co/HDrKkZF/Circle-Undone-4-Wages-of-Sin-Emilio-Rodriguez-2.jpg" + Name = "IV - The Wages of Sin 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459344/9552699A8CEC5E7BF22843990394BB977539CBE0/" }, { - Name = "IV - Wages of Sin 3", - URL = "https://i.ibb.co/vkpG8cM/Circle-Undone-4-Wages-of-Sin-Greg-Bobrowski.jpg" + Name = "IV - The Wages of Sin 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459466/9B6B55A6F76668929B6D6B1DD5FDAE7CEE427A1C/" }, { - Name = "IV - Wages of Sin 4", - URL = "https://i.ibb.co/CMj007q/Circle-Undone-4-Wages-of-Sin-Mateusz-Michalski.jpg" + Name = "IV - The Wages of Sin 4", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459609/054A60BDCD266C1A53F29067CFC83D0561666FE4/" }, { Name = "IV - Wages of Sin 5", - URL = "https://i.ibb.co/sj1bS5x/Circle-Undone-4-Wages-of-Sin-Serge-Da-Silva-Dias.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459714/11B3D734AC5229A0DEA5372CD50F5C7841F9D5A0/" }, { Name = "V - For the Greater Good 1", - URL = "https://i.ibb.co/LDyqjbj/Circle-Undone-5-For-the-Greater-Good.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459829/9AA9563CCD72A8593BDE3C6D1299E96325ECE747/" }, { Name = "V - For the Greater Good 2", - URL = "https://i.ibb.co/pPzXNd1/Circle-Undone-5-For-the-Greater-Good-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459933/13A103B7BC0ABB611F6A8E61D033C6AD95EED4D4/" }, { Name = "V - For the Greater Good 3", - URL = "https://i.ibb.co/8rMLvJH/Circle-Undone-5-For-the-Greater-Good-Greg-Bobrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460088/C88DDC5CE898ACEF360B8AD72E05F15BF84DE171/" }, { Name = "V - For the Greater Good 4", - URL = "https://i.ibb.co/vj1q4Cm/Circle-Undone-5-For-the-Greater-Good-Robert-Laskey.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460182/C086EDA78636624FC9C4EA1DBCD8F1D39B7A6A89/" }, { Name = "VI - Union and Disillusioned", - URL = "https://i.ibb.co/n7SD1tB/Circle-Undone-6-Union-amp-Disillusioned-Andreas-Rocha.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460382/8EFB842A623A2D1E6D0E915268A207A5D7DFC6D4/" }, { Name = "VII - In the Clutches of Chaos 1", - URL = "https://i.ibb.co/bFXBNh7/Circle-Undone-7-In-the-Clutches-of-Chaos.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460586/7E156BF93F211BC425CD37ED273FCC84FF1F4C4D/" }, { Name = "VII - In the Clutches of Chaos 2", - URL = "https://i.ibb.co/m6DshNg/Circle-Undone-7-In-the-Clutches-of-Chaos-Alexandr-Elichev.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460740/72A39A0FACA806EF2E0A4E31AEDF6D8FCDF1A876/" }, { Name = "VII - In the Clutches of Chaos 3", - URL = "https://i.ibb.co/k2p4yfG/Circle-Undone-7-In-the-Clutches-of-Chaos-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460884/5716F6E2CB3F8D14FA5B7B806555896088696057/" }, { Name = "VIII - Before the Black Throne 1", - URL = "https://i.ibb.co/9TPwvP6/Circle-Undone-8-Before-the-Black-Throne-Aaron-Luke-Wilson.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725461042/DFF7A992A9440E58CE32D4B8A96A02A8F785AC90/" }, { Name = "VIII - Before the Black Throne 2", - URL = "https://i.ibb.co/VNtgH4v/Circle-Undone-8-Before-the-Black-Throne-Greg-Bobrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725461161/18902B2F74C9D70F5EA79A34521E3FDEDEFC893D/" } }, ["The Dream-Eaters"] = { { Name = "I-A - Beyond the Gates of Sleep 1", - URL = "https://i.ibb.co/S6sCy7G/Dream-Eaters-1-A-Beyond-the-Gates-of-Sleep-Phoebe-Herring.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725465733/828EE1FF16928EA0426BC68AAED4B9AA6B6FBB49/" }, { Name = "I-A - Beyond the Gates of Sleep 2", - URL = "https://i.ibb.co/kBfW9SC/Dream-Eaters-1-A-Beyond-the-Gates-of-Sleep-Regina-Kurnya.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725465934/35A85E9056B7A212AC39E7043FDF546A425E62F2/" }, { Name = "I-A - Beyond the Gates of Sleep 3", - URL = "https://i.ibb.co/HGvnxdX/Dream-Eaters-1-A-Beyond-the-Gates-of-Sleep-Jason-Scheier.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466105/05D29313D2559B6683465A7034DE7B07DE675420/" }, { Name = "I-B - Waking Nightmare", - URL = "https://i.ibb.co/sWsZCv8/Dream-Eaters-1-B-Waking-Nightmare-Josh-Gould-jpg.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466267/16FAE20612ED0A6A65836DD1B014AC5A801A172F/" }, { - Name = "II-A - Search for Kadath 1", - URL = "https://i.ibb.co/4SwzCD8/Dream-Eaters-2-A-Search-for-Kadath-Andrei-Khrutskii.jpg" + Name = "II-A - The Search for Kadath 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466425/03CCD5F24999CC6CC905CB2FD021DB67D7769163/" }, { - Name = "II-A - Search for Kadath 2", - URL = "https://i.ibb.co/WpZ4fMc/Dream-Eaters-2-A-Search-for-Kadath-Dan-Iorgulescu.jpg" + Name = "II-A - The Search for Kadath 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466615/085ACE95FEF03D2BE91BAD5E1864E1D0263DCCC0/" }, { - Name = "II-A - Search for Kadath 3", - URL = "https://i.ibb.co/jwsn0jf/Dream-Eaters-2-A-Search-for-Kadath-Diana-Tsareva.jpg" + Name = "II-A - The Search for Kadath 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466802/83861733568FCA9673B6F5EFE0C9D3337E3DFD27/" }, { - Name = "II-A - Search for Kadath 4", - URL = "https://i.ibb.co/pd9vxmL/Dream-Eaters-2-A-Search-for-Kadath-Helen-Ilnytska.jpg" + Name = "II-A - The Search for Kadath 4", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466941/D4FDE1FE722DC6B03AD38D797F2E00531908583D/" }, { - Name = "II-A - Search for Kadath 5", - URL = "https://i.ibb.co/MZ7Qtcc/Dream-Eaters-2-A-Search-for-Kadath-Nele-Diel.jpg" + Name = "II-A - The Search for Kadath 5", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467396/C9A476395B9326142BBDBD06D22A14C83EAD2161/" }, { - Name = "II-B - Thousand Shapes of Horror 1", - URL = "https://i.ibb.co/9s7M0PP/Dream-Eaters-2-B-Thousand-Shapes-of-Horror-Nele-Diel-2.jpg" + Name = "II-B - A Thousand Shapes of Horror 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467582/5EB69F3A3F20B312FE3FE3C64FEA96200EE51563/" }, { - Name = "II-B - Thousand Shapes of Horror 2", - URL = "https://i.ibb.co/T4Pqx0H/Dream-Eaters-2-B-Thousand-Shapes-of-Horror-Nele-Diel.jpg" + Name = "II-B - A Thousand Shapes of Horror 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467791/5FE437C821641EDD703D336205A37F8F0CACFD38/" }, { - Name = "II-B - Thousand Shapes of Horror 3", - URL = "https://i.ibb.co/VJFQVYd/Dream-Eaters-2-B-Thousand-Shapes-of-Horror-Greg-Bobrowski.jpg" + Name = "II-B - A Thousand Shapes of Horror 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467946/841CEC1D8B56C1CA52B5558E8E49CE04D95D2F4A/" }, { Name = "III-A - Dark Side of the Moon 1", - URL = "https://i.ibb.co/B2DfXLZ/Dream-Eaters-3-A-Dark-Side-of-the-Moon-Dabanli.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468100/2DD1038163AD5DAA759EA4BE49DB82A2718E931F/" }, { Name = "III-A - Dark Side of the Moon 2", - URL = "https://i.ibb.co/c27JRvv/Dream-Eaters-3-A-Dark-Side-of-the-Moon-Frej-Agelii.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468293/E8145D05833864EEC70AF9AC401039D8E8AFDE3E/" }, { Name = "III-B - Point of No Return 1", - URL = "https://i.ibb.co/dMGNB9Y/Dream-Eaters-3-B-Point-of-No-Return-Daria-Khlebnikova.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468506/1F2E3D425A4D97ADBCA59B4A9401C411F91F875F/" }, { Name = "III-B - Point of No Return 2", - URL = "https://i.ibb.co/dpXxPmz/Dream-Eaters-3-B-Point-of-No-Return-Karine-Villette.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468694/8631E68BA7CE69BECF1D476A03CBDC79112A60BF/" }, { Name = "IV-A - Where the Gods Dwell", - URL = "https://i.ibb.co/v4nqw6G/Dream-Eaters-4-A-Where-the-Gods-Dwell-Samantha-Franco.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468880/2C8A9459149D33E526FDC4B68A063475305C15F8/" }, { Name = "IV-B - Weaver of the Cosmos 1", - URL = "https://i.ibb.co/7btNBS1/Dream-Eaters-4-B-Weaver-of-the-Cosmos-Diana-Franco.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469060/9E6AF9E0D68EC0F44B82968CE99E433A25A0E0C4/" }, { Name = "IV-B - Weaver of the Cosmos 2", - URL = "https://i.ibb.co/RY7y22b/Dream-Eaters-4-B-Weaver-of-the-Cosmos-Leanna-Crossan.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469224/8C969B8ABAEE6CFFEF165C2E4BBA0E7E9B33AA1A/" }, { Name = "IV-B - Weaver of the Cosmos 3", - URL = "https://i.ibb.co/f8LBbFW/Dream-Eaters-4-B-Weaver-of-the-Cosmos-Nele-Diel.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469417/A94C14A64836FB9B5FAFAC5B790C51441F8D475F/" } }, ["The Innsmouth Conspiracy"] = { { - Name = "I - Pit of Despair 1", - URL = "https://i.ibb.co/2sc0F61/Innsmouth-1-Pit-of-Despair-Amanda-Castrillo.jpg" + Name = "I - The Pit of Despair 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473070/57FEAA8135F62DBAD52E2AAB562EF45EB9A0194A/" }, { - Name = "I - Pit of Despair 2", - URL = "https://i.ibb.co/Nj9JLBQ/Innsmouth-1-Pit-of-Despair-J-Mill.jpg" + Name = "I - The Pit of Despair 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473257/FEC6F9FAA1CC656BFD5861F58E4751BC94AB0424/" }, { - Name = "II - Vanishing of Elina Harper 1", - URL = "https://i.ibb.co/2j74cVn/Innsmouth-2-Vanishing-of-Elina-Harper-Konstantin-Vohwinkel.jpg" + Name = "II - The Vanishing of Elina Harper 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473424/B0E2BFA9C7F61A5B7A72CD11AD1AFF4A070AFFA1/" }, { - Name = "II - Vanishing of Elina Harper 2", - URL = "https://i.ibb.co/r2VqHSn/Innsmouth-2-Vanishing-of-Elina-Harper-Mihail-Bila.jpg" + Name = "II - The Vanishing of Elina Harper 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473570/D28C2DA099D656116A0D7BAA8B874E4ED6B6B50E/" }, { - Name = "II - Vanishing of Elina Harper 3", - URL = "https://i.ibb.co/hFQMm7N/Innsmouth-2-Vanishing-of-Elina-Harper-Richard-Wright.jpg" + Name = "II - The Vanishing of Elina Harper 3", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473731/EE9BED3522A1B7CD5E394A67AD7F692DB709A9B5/" }, { - Name = "II - Vanishing of Elina Harper 4", - URL = "https://i.ibb.co/2nZKGN6/Innsmouth-2-Vanishing-of-Elina-Harper-Tomasz-Jedruszek-1.jpg" + Name = "II - The Vanishing of Elina Harper 4", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473874/0A85B2CE9A3FFB048C932E1B014B2986D5D42A1B/" }, { Name = "II - Vanishing of Elina Harper 5", - URL = "https://i.ibb.co/WxLpKrM/Innsmouth-2-Vanishing-of-Elina-Harper-Tomasz-Jedruszek-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474056/C82E467216DF747AA954C614D7D0B8F649163EDA/" }, { Name = "III - In Too Deep 1", - URL = "https://i.ibb.co/SsQ3my4/Innsmouth-3-In-Too-Deep-David-Frasheski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474234/C6A72CDEFCDF1F2A3C6036F349B5F368EFDACA2E/" }, { Name = "III - In Too Deep 2", - URL = "https://i.ibb.co/jgQ8zQN/Innsmouth-3-In-Too-Deep-Klaudia-Bezak.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474398/752D0CE313C58A5B1C3181503C841EB91D041492/" }, { Name = "III - In Too Deep 3", - URL = "https://i.ibb.co/VVgtNM1/Innsmouth-3-In-Too-Deep-Patrik-Antonescu.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474562/308687DFB9B0F2286A9248698FD38C0BF66B89ED/" }, { Name = "IV - Devil Reef 1", - URL = "https://i.ibb.co/Jrf6CJ0/Innsmouth-4-Devil-Reef-Ludovic-Sanson.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474717/DCEC44D2F7F22A950B3CF52C81C8F931710EFADC/" }, { Name = "IV - Devil Reef 2", - URL = "https://i.ibb.co/4jfwDZR/Innsmouth-4-Devil-Reef-Marc-Stewart.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474883/04913E71194BF766DFF2DF8646251AC461A35FE2/" }, { Name = "V - Horror in High Gear 1", - URL = "https://i.ibb.co/vqYJjYJ/Innsmouth-5-Horror-in-High-Gear-Greg-Bobrowski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475029/FAA34C92FA800E8DDF6449B1C48FCC7468D783BD/" }, { Name = "V - Horror in High Gear 2", - URL = "https://i.ibb.co/yYrzbYS/Innsmouth-5-Horror-in-High-Gear-Greg-Bobrowski-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475133/BC689B58040F74E7DB44CFD8F3F2BF32FE4081E1/" }, { Name = "V - Horror in High Gear 3", - URL = "https://i.ibb.co/fpKWhGY/Innsmouth-5-Horror-in-High-Gear-Guillem-H-Pongiluppi.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475307/53ADF5E957F88F1DDCE46828547E5808C3CAEFD7/" }, { Name = "V - Horror in High Gear 4", - URL = "https://i.ibb.co/YkLFy7y/Innsmouth-5-Horror-in-High-Gear-Rostyslav-Zagornov.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475402/C41EB1D2F8549669DD4323A339F5EC594996816C/" }, { - Name = "VI - Light in the Fog 1", - URL = "https://i.ibb.co/v1rhgqJ/Innsmouth-6-Light-in-the-Fog-Florian-Aupetit.jpg" + Name = "VI - A Light in the Fog 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475509/C526C9A3AC34195ACF6161D4821D1424A8A288B4/" }, { - Name = "VI - Light in the Fog 2", - URL = "https://i.ibb.co/Db2pRd6/Innsmouth-6-Light-in-the-Fog-JB-Caillet.jpg" + Name = "VI - A Light in the Fog 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475660/2C67D57967F300BD1FE1AFC08C49EBCF4A88D11C/" }, { - Name = "VII - Lair of Dagon 1", - URL = "https://i.ibb.co/QPwzQL5/Innsmouth-7-Lair-of-Dagon-Daria-Khlebnikova.jpg" + Name = "VII - The Lair of Dagon 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476055/4BC221648012F7A7A37B2F65929705E973FF9CE3/" }, { - Name = "VII - Lair of Dagon 2", - URL = "https://i.ibb.co/MZBpCbs/Innsmouth-7-Lair-of-Dagon-Guillem-H-Pongiluppi.jpg" + Name = "VII - The Lair of Dagon 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476271/3F9CF0FE8ACCE12E26ACA5D5777177A10B49D6DA/" }, { Name = "VIII - Into the Maelstrom 1", - URL = "https://i.ibb.co/fkSXDgs/Innsmouth-8-Into-the-Maelstrom-Dimitri-Bielak.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476474/AF8695342FBCE6F6BC7B353C86C6006F1629F43A/" }, { Name = "VIII - Into the Maelstrom 2", - URL = "https://i.ibb.co/k56Dn9q/Innsmouth-8-Into-the-Maelstrom-Mateusz-Michalski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476643/CB175401ECDF04F97334CBF8AE7EC76A43A85735/" } }, ["Edge of the Earth"] = { { Name = "I - Ice and Death 1", - URL = "https://i.ibb.co/FWZMWtW/Edge-1-Ice-and-Death-David-Frasheski.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482152/322E07021DC78455859C860D8B1574F1BA2E0F68/" }, { Name = "I - Ice and Death 2", - URL = "https://i.ibb.co/QDGV0jQ/Edge-1-Ice-and-Death-Felix-Riano.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482327/BD14DDE856A2062A939F860743FFF15F8B0BFF5A/" }, { Name = "I - Ice and Death 3", - URL = "https://i.ibb.co/hFJQM8v/Edge-1-Ice-and-Death-Mike-Gizienski.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482520/0FB5AC83DF448994EC0A866ACF6AF57ADCC59C82/" }, { Name = "??? - Fatal Mirage", - URL = "https://i.ibb.co/KzwvjJN/Edge-2-Fatal-Mirage-David-Frasheski.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725481929/A35EDF11BD6AF52784BA6611C363CBBB373622EE/" }, { Name = "II - Forbidden Peaks 1", - URL = "https://i.ibb.co/C2SLByt/Edge-2-Forbidden-Peaks-David-Frasheski-2.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482688/B50455616DFC14FE0B9398DBE2A3A1AE25040516/" }, { Name = "II - Forbidden Peaks 2", - URL = "https://i.ibb.co/0cGkkBL/Edge-3-Forbidden-Peaks-David-Frasheski.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482839/17786225AA56E75E558491E7E710F555AF3E5799/" }, { Name = "III - City of Elder Things 1", - URL = "https://i.ibb.co/FbpgBD3/Edge-4-City-Francois-Baranger.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483014/B74378E02A1A99F544CD98141EF62193A2A612FB/" }, { Name = "III - City of Elder Things 2", - URL = "https://i.ibb.co/ncRvHr3/Edge-4-City-Francois-Baranger-2.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483208/CDFF7A2D404485DE2B4C4ED54B34E197515F0094/" }, { - Name = "IV - Heart of Madness 1", - URL = "https://i.ibb.co/rk0qR4z/Edge-5-Heart-of-Madness-Karol-Sollich.png" + Name = "IV - The Heart of Madness 1", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483349/A96BC4AA73C71FE86EF38110236BAEF710C00EE2/" }, { - Name = "IV - Heart of Madness 2", - URL = "https://i.ibb.co/NVFjx6N/Edge-5-Heart-of-Madness-Miguel-Coimbra.png" + Name = "IV - The Heart of Madness 2", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483528/5BF0DD740C5D43EFBFEF0436EB35FF9DA748FA5E/" } }, ["The Scarlet Keys"] = { @@ -932,15 +1068,15 @@ PLAYAREA_IMAGE_DATA = { URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444330/3ED2CCE95DE933546E1B5CBBF445D773E6D65465/" }, { - Name = "56-Y ???", + Name = "56-Y Without a Trace", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444450/FE4C335B0F72E83900A4EED0FD1A1D304D70D6B7/" }, { - Name = "59-Z Congress of Keys I", + Name = "59-Z Congress of Keys 1", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444576/5BB32469ED412D59BB0A46E57D226500B1D0568B/" }, { - Name = "59-Z Congress of Keys II", + Name = "59-Z Congress of Keys 2", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444690/B01A1FEAB57473D9B6DF11B92D62C214AA1C2C02/" } } @@ -949,95 +1085,95 @@ PLAYAREA_IMAGE_DATA = { ["The Blob That Ate Everything"] = { { Name = "The Blob That Ate Everything 1", - URL = "https://i.ibb.co/JxFV4ZN/Blob-That-Ate-Everything-Emilio-Rodriguez.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489144/53A920E2D1A9F41937B21B0A5B1A4E450ABFC460/" }, { Name = "The Blob That Ate Everything 2", - URL = "https://i.ibb.co/qJzstWF/Blob-That-Ate-Everything-Emilio-Rodriguez.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725488396/9CC07F923BD1CBFC4BB06DD2CC6747D2C3541737/" } }, ["Carnevale of Horrors"] = { { Name = "Carnevale of Horrors 1", - URL = "https://i.ibb.co/ZchJBpz/Carnevale-of-Horrors.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725496678/91164AF7C2ED06A3E50225794DE9C5E92D1D3B04/" }, }, ["Curse of the Rougarou"] = { { Name = "Curse of the Rougarou 1", - URL = "https://i.ibb.co/Qf7Sr7P/Curse-of-the-Rougarou.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494513/DF8E92EA5C1131A0C5D8FA06BFF6FD239412E11C/" }, { Name = "Curse of the Rougarou 2", - URL = "https://i.ibb.co/hs1Qjp0/Curse-of-the-Rougarou-Ann-Kovaleva.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494706/5D2EDE5D07DDA6E5781DB70D13F9A17EF26D36F2/" }, { Name = "Curse of the Rougarou 3", - URL = "https://i.ibb.co/BK7rmJ9/Curse-of-the-Rougarou-Karine-Villette.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494855/44A751CB66CBE4D75E67A53FC392696F6A3BFD4C/" }, { Name = "Curse of the Rougarou 4", - URL = "https://i.ibb.co/ZxGTC1w/Curse-of-the-Rougarou-Lachlan-Page.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725495011/ADD3431B383236BCF057C1573CEF7E43F39FDE72/" }, { Name = "Curse of the Rougarou 5", - URL = "https://i.ibb.co/HgNXJhW/Curse-of-the-Rougarou-Vladimir-Manyukhin.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725495146/79159992D5002AD3D7D23ED82D9BB76D437B94C3/" } }, ["Guardians of the Abyss"] = { { Name = "Guardians of the Abyss 1", - URL = "https://i.ibb.co/gD3R6cw/Guardians-of-the-Abyss-Jake-Murray.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725490870/9C03B2974D7776B8E2AFEEF025756D1885AF0AE3/" }, { Name = "Guardians of the Abyss 2", - URL = "https://i.ibb.co/jMHPcvz/Guardians-of-the-Abyss-Jose-Vega.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491039/E81F05AB9C802F57F4D9F7229CE3D53231ACB70D/" }, { Name = "Guardians of the Abyss 3", - URL = "https://i.ibb.co/99pqXQP/Guardians-of-the-Abyss-Koke-Nunez.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491202/384AA7DBA614B61C46D57EF5105A96F25F938B74/" }, { Name = "Guardians of the Abyss 4", - URL = "https://i.ibb.co/QbMvjbx/Guardians-of-the-Abyss-Mike-Szabados.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491392/1C8FF752DF97F362BA8937BFEC65140AE3ADF8A6/" }, { Name = "Guardians of the Abyss 5", - URL = "https://i.ibb.co/zFDt9Q8/Guardians-of-the-Abyss-Nele-Diel.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491512/06B1DCA10B44FF86567CEFCC135D619648CE5F19/" }, { Name = "Guardians of the Abyss 6", - URL = "https://i.ibb.co/Vpzptmt/Guardians-of-the-Abyss-Yujin-Choo.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491658/5446E231AEF72CF4F7B4892116671FF7175EFA0F/" } }, ["Labyrinths of Lunacy"] = { { Name = "Labyrinths of Lunacy 1", - URL = "https://i.ibb.co/f17PMCC/Labyrinths-of-Lunacy-Cordelia-Wolf.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489685/D2D342844212C8A21E030418935A227C2E3279DB/" }, { Name = "Labyrinths of Lunacy 2", - URL = "https://i.ibb.co/44DXfWw/Labyrinths-of-Lunacy-Richard-Wright.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489820/E3E18B0940C2604F62E564AD43F178FF9F13B3C9/" }, { Name = "Labyrinths of Lunacy 3", - URL = "https://i.ibb.co/jMQhs68/Labyrinths-of-Lunacy-Robert-Berg.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489972/6A34CF53190EAAAF57C31FB97A3C2ACBD27FEE40/" } }, ["Murder at Excelsior Hotel"] = { { Name = "Murder at Excelsior Hotel 1", - URL = "https://i.ibb.co/5cQ6LvN/Murder-at-Excelsior-Hotel-Alistair-Mitchell.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725488868/7F7FE8BB3C7E3645B4377F86366C6073CDB8F113/" }, { Name = "Murder at Excelsior Hotel 2", - URL = "https://i.ibb.co/vBQRHNS/Murder-at-Excelsior-Hotel-Romain-Bayle.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489144/53A920E2D1A9F41937B21B0A5B1A4E450ABFC460/" } }, ["War of the Outer Gods"] = { { Name = "War of the Outer Gods", - URL = "https://i.ibb.co/wLNGFTG/War-of-the-Outer-Gods-Joshua-Cairos.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725487627/43A19A6D97A6DA63A487EB247EE95884E2D9F5FD/" } } }, @@ -1045,117 +1181,117 @@ PLAYAREA_IMAGE_DATA = { ["Cyclopean Foundations"] = { { Name = "I - Lost Moorings 1", - URL = "https://i.ibb.co/DQ76z3c/Cyclopean-1-Lost-Moorings-Care-Line-Art.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499518/02DA17FC9D6A1174E484977269F44AE6995C6F7C/" }, { Name = "I - Lost Moorings 2", - URL = "https://i.ibb.co/c6LJNfr/Cyclopean-1-Lost-Moorings-Jake-Murray.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499680/1556F230B59D42FCA47A5A87135330B03C231E92/" }, { Name = "II - Going Twice", - URL = "https://i.ibb.co/P6h3vbm/Cyclopean-2-Going-Twice-Quentin-Bouilloud.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499855/1220C81273EFA6F36C2AEBA713E31DE1E2F92454/" }, { Name = "III - Private Lives", - URL = "https://i.ibb.co/9qK9Fzd/Cyclopean-3-Private-Lives-Christian-Bravery.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500069/452E4427185A7F1AFB3F2CBB263DC55B6A144D49/" }, { Name = "IV - Crumbling Masonry 1", - URL = "https://i.ibb.co/pdrGK6p/Cyclopean-4-Crumbling-Masonry-Pete-Amachree.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500260/94FE8506AB13CA51F087ABF155799F73BCBAB1E9/" }, { Name = "IV - Crumbling Masonry 2", - URL = "https://i.ibb.co/5RFcGyP/Cyclopean-4-Crumbling-Masonry-Simon-Craghead.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500508/04B6C6D8845BF5411D28C79D185EAF6FFBB409F5/" }, { Name = "V - Across Dreadful Waters", - URL = "https://i.ibb.co/3mYfFNB/Cyclopean-5-Across-Dreadful-Waters-Ev-Shipard.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500640/447069BBBF70474439D3CC4F970F6617C8B738F4/" }, { Name = "VI - Blood From Stones", - URL = "https://i.ibb.co/ynmQNSB/Cyclopean-6-Blood-From-Stones-Marc-Simonetti.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500803/23C46C5F08E3F911F565D9EC38CFACFFAA5F5B11/" }, { Name = "VII - Pyroclastic Flow 1", - URL = "https://i.ibb.co/s1JDkFv/Cyclopean-7-Pyroclastic-Flow-Bastien-Grivet.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500952/804B531E517B1AD2294E304AA6F72F8CC3E6FC4E/" }, { Name = "VII - Pyroclastic Flow 2", - URL = "https://i.ibb.co/qs8Sk2N/Cyclopean-7-Pyroclastic-Flow-Rachid-Lotf.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501115/E771289EB848A695DF47C405300B1EC7CA925009/" }, { Name = "VIII - Tomb of Dead Dreams 1", - URL = "https://i.ibb.co/0MwX460/Cyclopean-8-Tomb-of-Dead-Dreams-Guillem-H-Pongiluppi.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501272/CAE6C4185540F3F8FFA2A8E37458A5B80DBD70FC/" }, { Name = "VIII - Tomb of Dead Dreams 2", - URL = "https://i.ibb.co/mGnKNcy/Cyclopean-8-Tomb-of-Dead-Dreams-Richard-Benning.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501415/DA9C07488DA2753FF5621D1731A84D6D0B1CC1BD/" }, { Name = "VIII - Tomb of Dead Dreams 3", - URL = "https://i.ibb.co/vmBM8x2/Cyclopean-8-Tomb-of-Dead-Dreams-Walter-Brocca.png" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501813/030E5DB9F8F6C5F092EFDF2C42AD631318B0923A/" } }, ["Dark Matter"] = { { Name = "I - Tatterdemalion 1", - URL = "https://i.ibb.co/DRMPGVt/Dark-Matter-1-Tatterdemalion-Andrey-Vozny.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504118/AC852F478D5BDA0C8A54A499B07A66E872560EC7/" }, { Name = "I - Tatterdemalion 2", - URL = "https://i.ibb.co/1JzrrX2/Dark-Matter-1-Tatterdemalion-Brian-Taylor.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504319/5B24BB2080AC76D836708AABC1BC90FD884F043D/" }, { Name = "I - Tatterdemalion 3", - URL = "https://i.ibb.co/DzvvgGf/Dark-Matter-1-Tatterdemalion-John-Wallin-Liberto.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504461/73E4632A2EAAFA918924E60A64B03838CA6DDD77/" }, { Name = "I - Tatterdemalion 4", - URL = "https://i.ibb.co/sQf85b8/Dark-Matter-1-Tatterdemalion-Paul-Pepera.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504602/6DB8F081CC907A0D6F364E5045BB7E8FADA91B5C/" }, { Name = "II - Electric Nightmares 1", - URL = "https://i.ibb.co/hLGVBt7/Dark-Matter-2-Electric-Nightmares-Dean-Lawrence.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504770/C6FB5FDD153ACD07565259AE013FDC7FF567037D/" }, { Name = "II - Electric Nightmares 2", - URL = "https://i.ibb.co/cTKZQ61/Dark-Matter-2-Electric-Nightmares-Robert-Thoma.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504974/80E29EA68B88B78CDADC475998E832C7245409F4/" }, { Name = "IIIa - Lost Quantum", - URL = "https://i.ibb.co/6vyXv90/Dark-Matter-3-Lost-Quantum-Michael-Rajecki.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505211/07E1254B1C601496E47B7E60B736D1699AAD38C8/" }, { Name = "IIIb - In the Shadow of Earth 1", - URL = "https://i.ibb.co/DfbTKHP/Dark-Matter-4-In-the-Shadow-of-Earth-Jihoo-Kim.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505419/7E8B50470AD6AD27429B58A42271755289FC90EB/" }, { Name = "IIIb - In the Shadow of Earth 2", - URL = "https://i.ibb.co/MCvPmCb/Dark-Matter-4-In-the-Shadow-of-Earth-N5-Luckybuuncle.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505603/DCD5B255FE66F8D8F47FB6C928D80583F3F950AC/" }, { Name = "IIIc - Strange Moons", - URL = "https://i.ibb.co/b2d8qvg/Dark-Matter-5-Strange-Moons-Hongyu-Yin.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506071/78597C2FBE2DE55BFC86AEC9F42FE1B20D26544C/" }, { Name = "V - Fragment of Carcosa 1", - URL = "https://i.ibb.co/7WnTyYT/Dark-Matter-7-Fragment-of-Carcosa-Colin-Moore.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506388/A299C8D58171A6D78CF55D911C2B81C63D88444F/" }, { Name = "V - Fragment of Carcosa 2", - URL = "https://i.ibb.co/mG2Brrd/Dark-Matter-7-Fragments-of-Carcosa-Matthieu-Rebuffat.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506567/C36509CB6520803355E7AE1E9EC8CD35641B28C8/" }, { Name = "VI - Starfall 1", - URL = "https://i.ibb.co/CJ3LKL7/Dark-Matter-8-Starfall-Vadim-Sadovski.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506714/327D0E565039B7FA9157FDA04A302DF178C64C44/" }, { Name = "VI - Starfall 2", - URL = "https://i.ibb.co/Njd1FcB/Dark-Matter-8-Starfall-Vadim-Sadovski-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506809/E637DAAD8BEB00E4305756D101E1E6B370CB1644/" }, { Name = "VI - Starfall 3", - URL = "https://i.ibb.co/W0Cx7bb/Dark-Matter-8-Starfall-Vadim-Sadovski-3.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506978/A17CD45A7770BAC7196218ADD2FB6CEB0E7A0E6B/" } }, ["The Ghosts of Onigawa"] = { @@ -1164,7 +1300,7 @@ PLAYAREA_IMAGE_DATA = { URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-01.png?raw=true" }, { - Name = "II - In The Shadow Of Mount Kokoro", + Name = "II - In The Shadow Of Mount Kokoro", URL = "https://github.com/ArkhamDotCards/theghostsofonigawa/blob/main/product/onigawa-playmat-02.png?raw=true" }, { @@ -1185,11 +1321,11 @@ PLAYAREA_IMAGE_DATA = { ["Side Scenarios (FM)"] = { { Name = "Consternation on the Constellation", - URL = "https://i.ibb.co/Tw2xBP1/Consternation-Constellation.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725512402/37F34A14CEEA9D2F889F7B97B065C0193F268FE1/" }, { Name = "Symphony of Erich Zann", - URL = "https://i.ibb.co/SNr8tqN/Symphony-of-Erich-Zann-Hazel-Yingling.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725512613/B23EA91E9489E0DDE250DD33F9AF1A12EEE52E0C/" } } }, @@ -1197,79 +1333,79 @@ PLAYAREA_IMAGE_DATA = { ["Arkham Locations"] = { { Name = "Downtown 1", - URL = "https://i.ibb.co/FzRk98n/Arkham-Downtown-Cristi-Balanescu.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516086/53F48F8AA9CFE4BF544BF03A616AC12A5344615C/" }, { Name = "Downtown 2", - URL = "https://i.ibb.co/W2yJ5QZ/Arkham-Downtown-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516316/1A337F5D66D7B5F59C66F465710717340B1D56AB/" }, { Name = "Eastside 1", - URL = "https://i.ibb.co/W3QvdZW/Arkham-Eastside-Cristi-Balanescu.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516542/09B4BE1E5487C3B11C0178B0B6FFD51620BE6AA6/" }, { Name = "Eastside 2", - URL = "https://i.ibb.co/xfn1Fp8/Arkham-Eastside-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516744/9B7F54E99D9B85884D5E363B97B25DA2DD3F03CC/" }, { Name = "French Hill", - URL = "https://i.ibb.co/N7Lk7jc/Arkham-French-Hill-Cristi-Balanescu.jpg" - }, - { - Name = "Merchant District", - URL = "https://i.ibb.co/HTNCCq4/Arkham-Merchant-District-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516949/8BFEF09FDB6608173280F887C1BA3906427678CC/" }, { Name = "Generic 1", - URL = "https://i.ibb.co/hswfZD6/Arkham-Guillem-H-Pongiluppi.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517086/93E00AA823FBA1C6531BBA143408E1E7D89BE3F0/" }, { Name = "Generic 2", - URL = "https://i.ibb.co/5h5cMyF/Arkham-Guillem-H-Pongiluppi-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517270/1450BCB6698058F833FAE770D31D0D064B82F5C2/" }, { Name = "Generic 3", - URL = "https://i.ibb.co/ZBdVsWt/Arkham-Guillem-H-Pongiluppi-3.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517434/5B529D9DEF3550E898744CE19AAD4CC0AB3F12DF/" }, { Name = "Generic 4", - URL = "https://i.ibb.co/6NwbM59/Arkham-Michele-Botticelli.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517622/FE0C331881B776E66D3A2C60D70147A0CABFDAC6/" }, { Name = "Generic 5", - URL = "https://i.ibb.co/N6sxyq5/Arkham-Mihail-Bila.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517833/A123F1A2D1B8BE960AAB371D9FD06F27C282CB9B/" }, { Name = "Generic 6", - URL = "https://i.ibb.co/B393zxv/Arkham-Tomasz-Jedruszek.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518026/10D4F06C8A1AEC3ACAEC5C3B9DA142D3BA5818FE/" }, { Name = "Generic 7", - URL = "https://i.ibb.co/2WQ2Vt6/Arkham-Tomasz-Jedruszek-2.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518144/72D4A60264C2DD201AAA5FFDCA95C6FF04EF8AC8/" }, { Name = "Generic 8", - URL = "https://i.ibb.co/R7pQ9Y7/Arkham-Tomasz-Jedruszek-3.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518292/A1848A68389FBECA5BC847F90A921C18133B17D6/" + }, + { + Name = "Merchant District", + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518454/BD6694DCCD12E31997202B2020B4A29FDC96FC7B/" }, { Name = "Miskatonic University", - URL = "https://i.ibb.co/ncz9xjP/Arkham-Miskatonic-University-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518846/79D6BEB0D8C274E3D308A67CD3181418B02D3A7E/" }, { Name = "Northside", - URL = "https://i.ibb.co/sVWx1R3/Arkham-Northside-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519012/E4B527768AFEFE0E4FB4518CA2AFDD69A98AB5D1/" }, { Name = "Rivertown", - URL = "https://i.ibb.co/RyJnHmz/Arkham-Rivertown-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519190/7A9A09861EECE2D98B5C1EB694E88C2073ABDFDF/" }, { Name = "Southside", - URL = "https://i.ibb.co/5GW5jg5/Arkham-Southside-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519353/FE43349A25231F48662309FEB331DB2C418A5E80/" }, { Name = "Uptown", - URL = "https://i.ibb.co/YXjvkMn/Arkham-Uptown-Jokubas-Uogintas.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519551/3630457608AD2DB605EC4BCF4332C1D0983305C0/" } }, ["Default Image"] = { @@ -1281,7 +1417,7 @@ PLAYAREA_IMAGE_DATA = { ["Unsorted"] = { { Name = "Kingsport", - URL = "https://i.ibb.co/rbkk7ys/Kingsport-Tomasz-Jedruszek.jpg" + URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725522594/1EA2C0AF5D4D346AD3FFDC38215BB20AAA72CE8D/" }, { Name = "Devil", @@ -1295,37 +1431,4 @@ 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 - - -- 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 - - return GUIDReferenceApi -end -end) -__bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) -require("core/PlayAreaSelector") -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token SCED Tour 0e5aa8.ttslua b/unpacked/Custom_Token SCED Tour 0e5aa8.ttslua index 1b433d1ae..a2b7d5542 100644 --- a/unpacked/Custom_Token SCED Tour 0e5aa8.ttslua +++ b/unpacked/Custom_Token SCED Tour 0e5aa8.ttslua @@ -41,6 +41,204 @@ local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = ( return require, loaded, register, modules end)(nil) +__bundle_register("core/tour/TourCard", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Table definition for the tour card layout. This is functionally XMLUI in Lua form, but using +-- this for dynamic creation ensures we can handle any player color without needing 10 +-- near-duplicate definitions in Global.xml + +tourCardTemplate = { + tag = "Panel", + attributes = { + id = "tourCard", + height = 215, + width = 330, + rotation = "0 0 0", + position = "0 300 30", + showAnimation = "FadeIn", + hideAnimation = "FadeOut", + active = false + }, + children = { + { + tag = "Image", + attributes = { + id = "tourNarratorImageLeft", + height = 120, + width = 80, + rectAlignment = "UpperLeft", + offsetXY = "-80 0" + -- Image will be set when the card is updated + } + }, + { + tag = "Image", + attributes = { + id = "tourNarratorImageRight", + active = false, + height = 125, + width = 80, + rectAlignment = "UpperRight", + offsetXY = "80 0" + -- Image will be set when the card is updated + } + }, + { + tag = "Image", + attributes = { + id = "tourSpeechBubble", + color = "#F5F5DC", + height = 215, + width = 330, + rectAlignment = "MiddleCenter", + image = "SpeechBubble" + } + }, + { + tag = "Text", + attributes = { + id = "tourText", + -- Everything on this is double-sized and scaled down to keep the text sharps + height = 370, + width = 520, + scale = "0.5 0.5 1", + rectAlignment = "UpperCenter", + offsetXY = "15 -15", + resizeTextForBestFit = true, + resizeTextMinSize = 20, + resizeTextMaxSize = 32, + color = "#050505", + alignment = "UpperLeft", + horizontalOverflow = "wrap" + } + }, + { + tag = "Image", + attributes = { + id = "tourNext", + height = 45, + width = 45, + rectAlignment = "LowerRight", + offsetXY = "-5 -45", + image = "NextArrow" + } + }, + { + tag = "Image", + attributes = { + id = "tourStop", + height = 45, + width = 45, + rectAlignment = "LowerLeft", + offsetXY = "35 -45", + image = "Exit" + } + } + } +} +end) +__bundle_register("core/tour/TourScript", function(require, _LOADED, __bundle_register, __bundle_modules) +-- Script for the SCED tour. Documentation and definitions to come. + +TOUR_SCRIPT = { + { + narrator = "Roland", + text = "Despite my best efforts, looks like you found us. You may live to regret that. As long as you're here though we might as well show you around.\n\nUse the arrow to move forward, and if the horrors get to be too much you can quit whenever you like. Ready to get started?", + position = "center" + }, + { + narrator = "Darrell", + text = "Cameras can be tricky things. Best you leave handling it to the professionals during the tour. Don't try to move the camera until the tour is complete.\n\nOnce we're done, remember you can use the 'p' key to switch back to third-person mode, and the spacebar to reset the position.", + position = "center", + speakerSide = "right" + }, + { + narrator = "Daisy", + text = "If you're new to the game, the library here has everything you'll need. A little research can go a long way, and looking into old newspapers for the weird and unusual can yield some surprisingly helpful information.\n\nI put a few right there that might prove enlightening.", + objReferenceData = { owner = "Mythos", type = "RulesReference" }, + distanceFromObj = 20, + position = "west", + speakerSide = "right" + }, + { + narrator = "Mandy", + text = "To survive what's coming you'll need a deck. If it's safely hidden away on ArkhamDB you can load it here, and even find the newest version after an upgrade without changing the ID.\n\nNo need to publish all your decks, use 'Private' and you can see it. Just make sure to select 'Make your decks public' in ArkhamDB.", + objReferenceData = { owner = "Mythos", type = "DeckImporter" }, + distanceFromObj = -5, + position = "northwest", + skipCentering = true + }, + { + narrator = "Daniela", + text = "I prefer the hands-on approach to building things, if you do too you can build a deck yourself.\n\nAll the cards you could ever need are here, laid out like a disassembled engine. Place the cards on the table, copy them for your deck, and you'll be ready for anything.", + objReferenceData = { owner = "Mythos", type = "PlayerCardPanel" }, + distanceFromObj = -7, + position = "south", + speakerSide = "right" + }, + { + narrator = "Finn", + text = "Ready to face the unknown? We've smuggled shocking revelations and devious enemies from all over the world. Download the campaign you want to play, then Place it on the table to see the scenarios.\n\nJust remember - if it turns out to be too much for you, I was never here.", + objReferenceData = { owner = "Mythos", type = "CampaignThePathToCarcosa" }, + distanceFromObj = 20, + position = "northwest", + skipCentering = true + }, + { + narrator = "Diana", + text = "These symbols on the bottom right are a repository of arcane knowledge, containing all the official content to download plus some deviously creative works from fans. One should beware those who seem too fond of the darkness, but you cannot deny the quality of their efforts.\n\nDon't see anything here? Only promoted players can access these.", + position = "southeast" + }, + { + narrator = "Winifred", + text = "No good aviator would fly a plane she didn't know and hadn't tweaked a bit herself. The gear icon contains settings to customize your play experience, from alternate ways to track your clues to a variety of helpers to streamline the game.\n\nEverything here is optional, but who doesn't want to go as fast as they can? Just remember that all settings affect all players, so strap in and trust your pilot!", + position = "southeast" + }, + { + narrator = "Amina", + text = "This is the Mythos area. Encounter cards, acts, and agenda will all be placed here while the large map below is where you will be exploring - be sure to set the number of investigators!\n\nYou can count doom on the agenda by clicking the large counter, and the smaller will automatically count doom tokens on the table. The chaos bag is in that book over on the right, and you can add or remove tokens from it whenever you need.", + showPos = { x = -2.85, y = 0, z = 0.55 }, + position = "north", + speakerSide = "right" + }, + { + narrator = "Gloria", + text = "The evils that lurk in this world are out there, creeping ever closer. When they find you, this will easily draw a card from the encounter deck. The deck will even reshuffle itself when needed, for the enemies we face are unending.", + showPos = { x = -35, y = -20, z = 28 }, + position = "west", + skipCentering = true + }, + { + narrator = "Jacqueline", + text = "When the ire of fate finds you and the chaos looms, this large button will draw a chaos token. Click it again to return the token to the bag.\n\nWhether a vision of the future or a curse from the opponents we face, if you need additional tokens a right-click will draw more. I wish you luck, but have a vision of red tentacles reaching for you...", + showPos = { x = -35, y = -20, z = 4.25 }, + position = "north", + skipCentering = true, + speakerSide = "right" + }, + { + narrator = "Kohaku", + text = "Folklorists, immersed in the rich narratives of blessings and curses, explore the essence of human beliefs. You can use this tool to control the amount of bless and curse tokens in the chaos bag. It will also display the amount in the bag (+ sealed on cards) for you. Remember to remove bless / curse tokens with this after resolving them.", + objReferenceData = { owner = "Mythos", type = "BlessCurseManager" }, + position = "center", + skipCentering = true, + speakerSide = "left" + }, + { + narrator = "Preston", + text = "I can afford to buy what I need, but for those less well-off we've provided an endless pool of tokens to track your game. Simply drag one out of the pools here.\n\nResources are my favorite of course, but damage and horror are as inevitable as taxes. I leave those to my bookkeeper though. Those tokens can work like counters, use the number keys to change the value.", + objReferenceData = { owner = "Mythos", type = "ResourceTokenBag" }, + position = "north", + skipCentering = true, + speakerSide = "right" + }, + { + narrator = "Norman", + text = "That's the end of the tour, but there's much more to discover if you look in the right places. Some cards have helpers on the right-click menu, and every new version adds new content and functions.\n\nDon't be afraid to explore, and best of luck out there! We'll all need it...", + position = "center", + speakerSide = "right" + } +} +end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("core/tour/TourStarter") end) @@ -108,10 +306,11 @@ do -- Default (0) position for the camera, as defined in the mod. If we don't recreate this position -- EXACTLY when exiting the tour then camera controls get weird local DEFAULT_CAMERA_POS = { - position = { x = -22.265, y = -2.5, z = 5.2575}, - pitch=64.343, - yaw=90.333, - distance=104.7} + position = { x = -22.26, y = -2.5, z = 5.26 }, + pitch = 64.34, + yaw = 90, + distance = 104 + } -- Global XML coordinates where we can present a card local SCREEN_POSITIONS = { @@ -120,11 +319,13 @@ do east = "600 0 0", west = "-600 0 0", south = "0 -300 0", + -- Northwest is only used by the Mandy card, move it a little right than standard so it's -- closer to the importer northwest = "-500 300 0", northeast = "600 300 0", southwest = "-600 -300 0", + -- Used by the Diana and Wini cards referencing the bottom-right global controls, moved a little -- closer to them southeast = "730 -365 0" @@ -132,7 +333,7 @@ do -- Tracks the current state of the tours. Keyed by player color to keep each player's tour -- separate, will hold the camera hook and current card. - local tourState = { } + local tourState = {} -- Kicks off the tour by initializing the card and camera hook. A callback on the hook creation -- will then show the first card. @@ -146,6 +347,7 @@ do -- the movement is done, but the delay seems to handle it Player[playerColor].setCameraMode("ThirdPerson") Player[playerColor].lookAt(DEFAULT_CAMERA_POS) + -- Initial camera rotation is painfully slow. White and Orange players are likely oriented -- correctly, but need a longer start delay for Green and Red local delay = 0.5 @@ -155,16 +357,8 @@ do end Wait.time(function() internal.createTourCard(playerColor) - -- XML update to add the new card takes a few frames to load, wait for it to finish then - -- create the hook - Wait.condition( - function() - internal.createCameraHook(playerColor) - end, - function() - return not Global.UI.loading - end - ) + -- XML update to add the new card takes a few frames to load, wait for it to finish then create the hook + Wait.condition(function() internal.createCameraHook(playerColor) end, function() return not Global.UI.loading end) end, delay) end @@ -291,7 +485,7 @@ do posY = HOOK_CAMERA_HOME.y, posZ = HOOK_CAMERA_HOME.z, rotX = 0, - rotY = 270.0, + rotY = 270, rotZ = 0, scaleX = 0.1, scaleY = 0.1, @@ -328,18 +522,17 @@ do ---@param playerColor String Player color to create the card for internal.createTourCard = function(playerColor) -- Make sure the card doesn't exist before we create a new one - if Global.UI.getAttributes(internal.getUiId(CARD_ID, playerColor)) ~= nil then - return - end + if Global.UI.getAttributes(internal.getUiId(CARD_ID, playerColor)) ~= nil then return end + tourCardTemplate.attributes.id = internal.getUiId(CARD_ID, playerColor) tourCardTemplate.children[1].attributes.id = internal.getUiId(LEFT_NARRATOR_ID, playerColor) tourCardTemplate.children[2].attributes.id = internal.getUiId(RIGHT_NARRATOR_ID, playerColor) tourCardTemplate.children[3].attributes.id = internal.getUiId(BUBBLE_ID, playerColor) tourCardTemplate.children[4].attributes.id = internal.getUiId(TEXT_ID, playerColor) tourCardTemplate.children[5].attributes.id = internal.getUiId(NEXT_BUTTON_ID, playerColor) - tourCardTemplate.children[5].attributes.onClick = self.getGUID().."/nextCard" + tourCardTemplate.children[5].attributes.onClick = self.getGUID() .. "/nextCard" tourCardTemplate.children[6].attributes.id = internal.getUiId(STOP_BUTTON_ID, playerColor) - tourCardTemplate.children[6].attributes.onClick = self.getGUID().."/stopTour" + tourCardTemplate.children[6].attributes.onClick = self.getGUID() .. "/stopTour" internal.setDeepVisibility(tourCardTemplate, playerColor) local globalXml = Global.UI.getXmlTable() @@ -394,195 +587,19 @@ do 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/tour/TourCard", function(require, _LOADED, __bundle_register, __bundle_modules) --- Table definition for the tour card layout. This is functionally XMLUI in Lua form, but using --- this for dynamic creation ensures we can handle any player color without needing 10 --- near-duplicate definitions in Global.xml - -tourCardTemplate = { - tag = "Panel", - attributes = { - id = "tourCard", - height = 215, - width = 330, - rotation = "0 0 0", - position = "0 300 30", - showAnimation = "FadeIn", - hideAnimation = "FadeOut", - active=false, - }, - children = { - { - tag = "Image", - attributes = { - id = "tourNarratorImageLeft", - height=120, - width=80, - rectAlignment="UpperLeft", - offsetXY = "-80 0", - -- Image will be set when the card is updated - } - }, - { - tag = "Image", - attributes = { - id = "tourNarratorImageRight", - active = false, - height=125, - width=80, - rectAlignment="UpperRight", - offsetXY = "80 0" - -- Image will be set when the card is updated - } - }, - { - tag = "Image", - attributes = { - id = "tourSpeechBubble", - color = "#F5F5DC", - height = 215, - width = 330, - rectAlignment = "MiddleCenter", - image = "SpeechBubble", - }, - }, - { - tag = "Text", - attributes = { - id = "tourText", - -- Everything on this is double-sized and scaled down to keep the text sharps - height = 370, - width = 520, - scale = "0.5 0.5 1", - rectAlignment = "UpperCenter", - offsetXY = "15 -15", - resizeTextForBestFit = true, - resizeTextMinSize = 20, - resizeTextMaxSize = 32, - color = "#050505", - alignment = "UpperLeft", - horizontalOverflow = "wrap", - } - }, - { - tag = "Image", - attributes = { - id = "tourNext", - height = 45, - width = 45, - rectAlignment = "LowerRight", - offsetXY = "-5 -45", - image = "NextArrow" - }, - }, - { - tag = "Image", - attributes = { - id = "tourStop", - height = 45, - width = 45, - rectAlignment = "LowerLeft", - offsetXY = "35 -45", - image = "Exit" - } - }, - } -} -end) -__bundle_register("core/tour/TourScript", function(require, _LOADED, __bundle_register, __bundle_modules) --- Script for the SCED tour. Documentation and definitions to come. - -TOUR_SCRIPT = { - { - narrator = "Roland", - text = "Despite my best efforts, looks like you found us. You may live to regret that. As long as you're here though we might as well show you around.\n\nUse the arrow to move forward, and if the horrors get to be too much you can quit whenever you like. Ready to get started?", - position = "center" - }, - { - narrator = "Darrell", - text = "Cameras can be tricky things. Best you leave handling it to the professionals during the tour. Don't try to move the camera until the tour is complete.\n\nOnce we're done, remember you can use the 'p' key to switch back to third-person mode, and the spacebar to reset the position.", - position = "center", - speakerSide = "right", - }, - { - narrator = "Daisy", - text = "If you're new to the game, the library here has everything you'll need. A little research can go a long way, and looking into old newspapers for the weird and unusual can yield some surprisingly helpful information.\n\nI put a few right there that might prove enlightening.", - objReferenceData = { owner = "Mythos", type = "RulesReference" }, - distanceFromObj = 20, - position = "west", - speakerSide = "right" - }, - { - narrator = "Mandy", - text = "To survive what's coming you'll need a deck. If it's safely hidden away on ArkhamDB you can load it here, and even find the newest version after an upgrade without changing the ID.\n\nNo need to publish all your decks, use 'Private' and you can see it. Just make sure to select 'Make your decks public' in ArkhamDB.", - objReferenceData = { owner = "Mythos", type = "DeckImporter" }, - distanceFromObj = -5, - position = "northwest", - skipCentering = true, - }, - { - narrator = "Daniela", - text = "I prefer the hands-on approach to building things, if you do too you can build a deck yourself.\n\nAll the cards you could ever need are here, laid out like a disassembled engine. Place the cards on the table, copy them for your deck, and you'll be ready for anything.", - objReferenceData = { owner = "Mythos", type = "PlayerCardPanel" }, - distanceFromObj = -7, - position = "south", - speakerSide = "right" - }, - { - narrator = "Finn", - text = "Ready to face the unknown? We've smuggled shocking revelations and devious enemies from all over the world. Download the campaign you want to play, then Place it on the table to see the scenarios.\n\nJust remember - if it turns out to be too much for you, I was never here.", - objReferenceData = { owner = "Mythos", type = "CampaignThePathToCarcosa" }, - distanceFromObj = 20, - position = "northwest", - }, - { - narrator = "Diana", - text = "These symbols on the bottom right are a repository of arcane knowledge, containing all the official content to download plus some deviously creative works from fans. One should beware those who seem too fond of the darkness, but you cannot deny the quality of their efforts.\n\nDon't see anything here? Only promoted players can access these.", - position = "southeast", - }, - { - narrator = "Winifred", - text = "No good aviator would fly a plane she didn't know and hadn't tweaked a bit herself. The gear icon contains settings to customize your play experience, from alternate ways to track your clues to a variety of helpers to streamline the game.\n\nEverything here is optional, but who doesn't want to go as fast as they can? Just remember that all settings affect all players, so strap in and trust your pilot!", - position = "southeast", - }, - { - narrator = "Amina", - text = "This is the Mythos area. Encounter cards, acts, and agenda will all be placed here while the large map below is where you will be exploring - be sure to set the number of investigators!\n\nYou can count doom on the agenda by clicking the large counter, and the smaller will automatically count doom tokens on the table. The chaos bag is in that book over on the right, and you can add or remove tokens from it whenever you need.", - showPos = { x = -2.85, y = 0, z = 0.55 }, - position = "north", - speakerSide = "right" - }, - { - narrator = "Gloria", - text = "The evils that lurk in this world are out there, creeping ever closer. When they find you, this will easily draw a card from the encounter deck. The deck will even reshuffle itself when needed, for the enemies we face are unending.", - showPos = { x = -35, y = -20, z = 28 }, - position = "west", - }, - { - narrator = "Jacqueline", - text = "When the ire of fate finds you and the chaos looms, this large button will draw a chaos token. Click it again to return the token to the bag.\n\nWhether a vision of the future or a curse from the opponents we face, if you need additional tokens a right-click will draw more. I wish you luck, but have a vision of red tentacles reaching for you...", - showPos = { x = -35, y = -20, z = 4.25 }, - position = "north", - skipCentering = true, - speakerSide = "right" - }, - { - narrator = "Preston", - text = "I can afford to buy what I need, but for those less well-off we've provided an endless pool of tokens to track your game. Simply drag one out of the pools here.\n\nResources are my favorite of course, but damage and horror are as inevitable as taxes. I leave those to my bookkeeper though. Those tokens can work like counters, use the number keys to change the value.", - objReferenceData = { owner = "Mythos", type = "ResourceTokenBag" }, - position = "north", - skipCentering = true, - speakerSide = "right" - }, - { - narrator = "Norman", - text = "That's the end of the tour, but there's much more to discover if you look in the right places. Some cards have helpers on the right-click menu, and every new version adds new content and functions.\n\nDon't be afraid to explore, and best of luck out there! We'll all need it...", - position = "center", - speakerSide = "right" - }, -} -end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/Custom_Token Search-A-Card 24051a.ttslua b/unpacked/Custom_Token Search-A-Card 24051a.ttslua index f5819ebf6..d5a5c118d 100644 --- a/unpacked/Custom_Token Search-A-Card 24051a.ttslua +++ b/unpacked/Custom_Token Search-A-Card 24051a.ttslua @@ -41,36 +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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/CardSearch") end) @@ -404,7 +374,7 @@ end -- "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 card: Data for the card to be inserted +---@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 @@ -513,4 +483,46 @@ Spawner.cardComparator = function(card1, card2) end 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 Token Arranger 022907.ttslua b/unpacked/Custom_Token Token Arranger 022907.ttslua index 76d2fa9fc..f81acc3ea 100644 --- a/unpacked/Custom_Token Token Arranger 022907.ttslua +++ b/unpacked/Custom_Token Token Arranger 022907.ttslua @@ -41,67 +41,6 @@ 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) -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 to the requested position/rotation - MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp) - getMythosArea().call("drawEncounterCard", { - pos = pos, - rotY = rotY, - alwaysFaceUp = alwaysFaceUp - }) - end - - return MythosAreaApi -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 - - return GUIDReferenceApi -end -end) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("accessories/TokenArranger") end) @@ -537,7 +476,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -556,6 +495,12 @@ do 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) @@ -572,8 +517,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -585,4 +530,73 @@ 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 + + -- 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/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 Victory Display 6ccd6d.ttslua b/unpacked/Custom_Token Victory Display 6ccd6d.ttslua index 94135b13d..562b6c28e 100644 --- a/unpacked/Custom_Token Victory Display 6ccd6d.ttslua +++ b/unpacked/Custom_Token Victory Display 6ccd6d.ttslua @@ -41,6 +41,48 @@ 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 = {} @@ -90,6 +132,16 @@ do 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) @@ -98,7 +150,7 @@ do -- 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. + ---@param matchCardTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end @@ -191,19 +243,87 @@ do 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 chaosBagApi = require("chaosbag/ChaosBagApi") +local searchLib = require("util/SearchLib") +local chaosBagApi = require("chaosbag/ChaosBagApi") local guidReferenceApi = require("core/GUIDReferenceApi") -local playAreaApi = require("core/PlayAreaApi") -local tokenChecker = require("core/token/TokenChecker") +local playAreaApi = require("core/PlayAreaApi") +local tokenChecker = require("core/token/TokenChecker") -local pendingCall = false -local messageSent = {} -local missingData = {} -local countedVP = {} +local pendingCall = false +local missingData = {} +local countedVP = {} local highlightMissing = false local highlightCounted = false @@ -232,34 +352,23 @@ function onLoad() self.createButton(buttonParameters) -- index 3: highlighting button (missing data) - self.createButton({ - label = "!", - click_function = "highlightMissingData", - tooltip = "Enable highlighting of cards without metadata (VP on these is not counted).", - function_owner = self, - scale = { 0.15, 0.15, 0.15 }, - color = { 1, 0, 0 }, - width = 700, - height = 800, - font_size = 700, - font_color = { 1, 1, 1 }, - position = { x = 1.82, y = 0.06, z = -1.32 } - }) + buttonParameters.label = "!" + buttonParameters.click_function = "highlightMissingData" + buttonParameters.tooltip = "Enable highlighting of cards without metadata (VP on these is not counted)." + buttonParameters.color = { 1, 0, 0 } + buttonParameters.width = 700 + buttonParameters.height = 800 + buttonParameters.font_size = 700 + buttonParameters.position = { x = 1.82, y = 0.06, z = -1.32 } + self.createButton(buttonParameters) -- index 4: highlighting button (counted VP) - self.createButton({ - label = "?", - click_function = "highlightCountedVP", - tooltip = "Enable highlighting of cards with VP.", - function_owner = self, - scale = { 0.15, 0.15, 0.15 }, - color = { 0, 1, 0 }, - width = 700, - height = 800, - font_size = 700, - font_color = { 1, 1, 1 }, - position = { x = 1.5, y = 0.06, z = -1.32 } - }) + buttonParameters.label = "?" + buttonParameters.click_function = "highlightCountedVP" + buttonParameters.tooltip = "Enable highlighting of cards with VP." + buttonParameters.color = { 0, 1, 0 } + buttonParameters.position.x = 1.5 + self.createButton(buttonParameters) -- update the display label once Wait.time(updateCount, 1) @@ -344,19 +453,17 @@ function updateCount() victoryPoints.playArea = playAreaApi.countVP() -- count cards in victory display - for _, v in ipairs(searchOnObj(self)) do - local obj = v.hit_object - + for _, obj in ipairs(searchLib.onObject(self, "isCardOrDeck")) do -- check metadata for VP - if obj.tag == "Card" then + if obj.type == "Card" then local VP = getCardVP(obj, JSON.decode(obj.getGMNotes())) victoryPoints.display = victoryPoints.display + VP if VP > 0 then table.insert(countedVP, obj) end - -- handling for stacked cards - elseif obj.tag == "Deck" then + -- handling for stacked cards + elseif obj.type == "Deck" then local VP = 0 for _, deepObj in ipairs(obj.getObjects()) do local deepVP = getCardVP(obj, JSON.decode(deepObj.gm_notes)) @@ -409,8 +516,7 @@ end function highlightMissingData() self.editButton({ index = 3, - tooltip = (highlightMissing and "Enable" or "Disable") .. " highlighting of cards without metadata (VP on these is not counted)." - }) + tooltip = (highlightMissing and "Enable" or "Disable") .. " highlighting of cards without metadata (VP on these is not counted)." }) for _, obj in pairs(missingData) do if obj ~= nil then if highlightMissing then @@ -446,7 +552,7 @@ end -- places the provided card in the first empty spot function placeCard(card) local trash = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") - + -- check snap point states local snaps = self.getSnapPoints() table.sort(snaps, function(a, b) return a.position.x > b.position.x end) @@ -457,21 +563,15 @@ function placeCard(card) local positions = {} for i, snap in ipairs(snaps) do positions[i] = self.positionToWorld(snap.position) - local hits = checkSnapPointState(positions[i]) - - -- first hit is self, additional hits must be cards / decks - if #hits > 1 then - fullSlots[i] = true - end + local searchResult = searchLib.atPosition(positions[i], "isCardOrDeck") + fullSlots[i] = #searchResult > 0 end -- remove tokens from the card - for _, v in ipairs(searchOnObj(card)) do - local obj = v.hit_object - + for _, obj in ipairs(searchLib.onObject(card)) do -- don't touch decks / cards - if obj.tag == "Deck" or obj.tag == "Card" then - -- put chaos tokens back into bag + if obj.type == "Deck" or obj.type == "Card" then + -- put chaos tokens back into bag elseif tokenChecker.isChaosToken(obj) then local chaosBag = chaosBagApi.findChaosBag() chaosBag.putObject(obj) @@ -479,7 +579,7 @@ function placeCard(card) trash.putObject(obj) end end - + -- place the card local name = card.getName() or "Unnamed card" for i = 1, 10 do @@ -495,31 +595,6 @@ function placeCard(card) broadcastToAll("Victory Display is full! " .. name .. " placed into slot 1.", "Orange") card.setPositionSmooth(positions[1], false, true) end - ---------------------------------------------------------- --- utility functions ---------------------------------------------------------- - --- searches on an object -function searchOnObj(obj) - return Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0.5, - type = 3, - size = obj.getBounds().size, - origin = obj.getPosition() - }) -end - -function checkSnapPointState(pos) - return Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0.1, - type = 3, - size = { 0.1, 0.1, 0.1 }, - origin = pos - }) -end end) __bundle_register("chaosbag/ChaosBagApi", function(require, _LOADED, __bundle_register, __bundle_modules) do @@ -549,7 +624,7 @@ do -- returns a table of object references to the tokens in play (does not include sealed tokens!) ChaosBagApi.getTokensInPlay = function() - return Global.getTable("chaosTokens") + return Global.call("getChaosTokensinPlay") end -- returns all sealed tokens on cards to the chaos bag @@ -568,6 +643,12 @@ do 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) @@ -584,8 +665,8 @@ do end -- called by playermats (by the "Draw chaos token" button) - ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick) - return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick}) + 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 @@ -597,34 +678,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 - - return GUIDReferenceApi -end -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 a35bea040..629ffcf79 100644 --- a/unpacked/Deck Tarot Deck 77f1e5.yaml +++ b/unpacked/Deck Tarot Deck 77f1e5.yaml @@ -194,8 +194,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\", @@ -203,7 +202,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 @@ -266,7 +267,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\", @@ -274,9 +276,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 @@ -411,8 +411,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\", @@ -420,7 +419,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 @@ -627,7 +628,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\", @@ -635,9 +637,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,8 +1493,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\", @@ -1502,7 +1501,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 diff --git a/unpacked/FogOfWarTrigger 3aab97.yaml b/unpacked/FogOfWarTrigger 3aab97.yaml index 307239aa0..acc9ece09 100644 --- a/unpacked/FogOfWarTrigger 3aab97.yaml +++ b/unpacked/FogOfWarTrigger 3aab97.yaml @@ -4,7 +4,7 @@ AltLookAngle: z: 0 Autoraise: true ColorDiffuse: - a: 0.75 + a: 0.25 b: 0.168 g: 0.701 r: 0.192 diff --git a/unpacked/FogOfWarTrigger Game Data 3dbe47.yaml b/unpacked/FogOfWarTrigger Game Data 3dbe47.yaml index 3675b82b3..dd53c1bfc 100644 --- a/unpacked/FogOfWarTrigger Game Data 3dbe47.yaml +++ b/unpacked/FogOfWarTrigger Game Data 3dbe47.yaml @@ -4,7 +4,7 @@ AltLookAngle: z: 0 Autoraise: true ColorDiffuse: - a: 0.75 + a: 0.25 b: 0.25 g: 0.25 r: 0.25 @@ -33,13 +33,13 @@ Sticky: true Tooltip: true Transform: posX: 78 - posY: 1.9 + posY: 2.4 posZ: 0 rotX: 0 rotY: 270 rotZ: 0 scaleX: 84 - scaleY: 1.5 + scaleY: 2.5 scaleZ: 3 Value: 0 XmlUI: '' diff --git a/unpacked/Notecard Arkham SCE 3.4.0 - 11182023 - Page 1 964222.yaml b/unpacked/Notecard Arkham SCE 3.4.0 - 11182023 - Page 1 964222.yaml deleted file mode 100644 index 6604f9df5..000000000 --- a/unpacked/Notecard Arkham SCE 3.4.0 - 11182023 - Page 1 964222.yaml +++ /dev/null @@ -1,89 +0,0 @@ -AltLookAngle: - x: 0 - y: 0 - z: 0 -Autoraise: true -ColorDiffuse: - b: 1 - g: 1 - r: 1 -Description: "Thanks for downloading Arkham SCE 3.4.0!\n\r\n- Revamped the download - menu! This is now the primary way to access custom content instead of the container - with placeholder boxes.\n- Added Parallel Jim and Parallel Zoey!\n- Added new community - content!\n- Added a helper for Subject 5U-21.\r\n- Added a tool to hide unused playermats.\n" -DragSelectable: true -GMNotes: '' -GUID: '964222' -Grid: true -GridProjection: false -Hands: false -HideWhenFaceDown: false -IgnoreFoW: false -LayoutGroupSortIndex: 0 -Locked: false -LuaScript: '' -LuaScriptState: '' -MeasureMovement: false -Name: Notecard -Nickname: Arkham SCE 3.4.0 - 11/18/2023 - Page 1 -Snap: true -States: - '2': - AltLookAngle: - x: 0 - y: 0 - z: 0 - Autoraise: true - ColorDiffuse: - b: 1 - g: 1 - r: 1 - Description: "- Added an image gallery for play area images.\n- Added QoL features - for Norman Withers\r.\n\r- Added a discard gamekey.\r\n- Increased readability - of master clue counter.\r\n- Cleaned up the option panel.\n- Added default camera - states (Shift + 1/2).\n- Fixed bugs with discarding cards from hand, the token - arranger, and taboo card widths.\r\n- Misc. metadata fixes." - DragSelectable: true - GMNotes: '' - GUID: d7faf7 - Grid: true - GridProjection: false - Hands: false - HideWhenFaceDown: false - IgnoreFoW: false - LayoutGroupSortIndex: 0 - Locked: false - LuaScript: '' - LuaScriptState: '' - MeasureMovement: false - Name: Notecard - Nickname: Arkham SCE 3.4.0 - 11/18/2023 - Page 2 - Snap: true - Sticky: true - Tooltip: true - Transform: - posX: -23.74739 - posY: 1.55149889 - posZ: -57.1334763 - rotX: 2.26350938e-08 - rotY: 90.00001 - rotZ: 2.55191921e-08 - scaleX: 3 - scaleY: 1 - scaleZ: 3 - Value: 0 - XmlUI: '' -Sticky: true -Tooltip: true -Transform: - posX: -27 - posY: 1.55 - posZ: -56.16 - rotX: 0 - rotY: 90 - rotZ: 0 - scaleX: 3 - scaleY: 1 - scaleZ: 3 -Value: 0 -XmlUI: '' diff --git a/unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml b/unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml new file mode 100644 index 000000000..ca3661761 --- /dev/null +++ b/unpacked/Notecard Arkham SCE 3.5.0 - 1252024 - Page 1 2d0dbb.yaml @@ -0,0 +1,196 @@ +AltLookAngle: + x: 0 + y: 0 + z: 0 +Autoraise: true +ColorDiffuse: + b: 1 + g: 1 + r: 1 +Description: 'Thanks for downloading Arkham SCE 3.5.0! + + + - Added all officially-previewed Feast of Hemlock Vale player cards! + + - Added Parallel Monterey Jack! + + - The options panel has many new settings available. + + - Added new scripting to Empirical Hypothesis, accessible via right-clicking the + card. + + ' +DragSelectable: true +GMNotes: '' +GUID: 2d0dbb +Grid: true +GridProjection: false +Hands: false +HideWhenFaceDown: false +IgnoreFoW: false +LayoutGroupSortIndex: 0 +Locked: false +LuaScript: '' +LuaScriptState: '' +MeasureMovement: false +Name: Notecard +Nickname: Arkham SCE 3.5.0 - 1/25/2024 - Page 1 +Snap: true +States: + '2': + AltLookAngle: + x: 0 + y: 0 + z: 0 + Autoraise: true + ColorDiffuse: + 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. + + - Added a reshuffle button under the encounter card discard. + + - The Doom Counter now also prints the doom threshold when updated.' + DragSelectable: true + GMNotes: '' + GUID: 313b1d + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + LayoutGroupSortIndex: 0 + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 3.5.0 - 1/25/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 + scaleX: 3 + scaleY: 1 + scaleZ: 3 + Value: 0 + XmlUI: '' + '3': + AltLookAngle: + x: 0 + y: 0 + z: 0 + Autoraise: true + ColorDiffuse: + 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. + + - Drawing another color''s player cards using hotkeys draws them to the corresponding + hand. + + - Added hotkeys for changing seats. Only seats with an investigator card present + are included.' + DragSelectable: true + GMNotes: '' + GUID: 3c1fdd + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + LayoutGroupSortIndex: 0 + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 3.5.0 - 1/25/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 + scaleX: 3 + scaleY: 1 + scaleZ: 3 + Value: 0 + XmlUI: '' + '4': + AltLookAngle: + x: 0 + y: 0 + z: 0 + Autoraise: true + ColorDiffuse: + 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! + + + - Special thanks to everyone helping out others with any questions they have + with the mod. We see and appreciate you!' + DragSelectable: true + GMNotes: '' + GUID: c677b8 + Grid: true + GridProjection: false + Hands: false + HideWhenFaceDown: false + IgnoreFoW: false + LayoutGroupSortIndex: 0 + Locked: false + LuaScript: '' + LuaScriptState: '' + MeasureMovement: false + Name: Notecard + Nickname: Arkham SCE 3.5.0 - 1/25/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 + scaleX: 3 + scaleY: 1 + scaleZ: 3 + Value: 0 + XmlUI: '' +Sticky: true +Tooltip: true +Transform: + posX: -27 + posY: 1.55 + posZ: -56.16 + rotX: 0 + rotY: 90 + rotZ: 0 + scaleX: 3 + scaleY: 1 + scaleZ: 3 +Value: 0 +XmlUI: '' diff --git a/unpacked/ScriptingTrigger 83ef06.yaml b/unpacked/ScriptingTrigger ChaosBagZone 83ef06.yaml similarity index 84% rename from unpacked/ScriptingTrigger 83ef06.yaml rename to unpacked/ScriptingTrigger ChaosBagZone 83ef06.yaml index fa51e2e7a..482f34884 100644 --- a/unpacked/ScriptingTrigger 83ef06.yaml +++ b/unpacked/ScriptingTrigger ChaosBagZone 83ef06.yaml @@ -23,19 +23,19 @@ LuaScript: '' LuaScriptState: '' MeasureMovement: false Name: ScriptingTrigger -Nickname: '' +Nickname: ChaosBagZone Snap: true Sticky: true Tooltip: true Transform: - posX: 1.4 - posY: 2.87 - posZ: -13.4 + posX: 1.6 + posY: 4.5 + posZ: -13.75 rotX: 0 - rotY: 90 + rotY: 0 rotZ: 0 scaleX: 6 - scaleY: 2 + scaleY: 7 scaleZ: 6 Value: 0 XmlUI: '' 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 bca59e5a1..0538b90b6 100644 --- a/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua +++ b/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.ttslua @@ -113,6 +113,7 @@ local settingsOpenForColor local visibility = {} local claims = {} local pitch = {} +local distance = {} --------------------------------------------------------- -- save/load functionality @@ -122,7 +123,8 @@ function onSave() return JSON.encode({ visibility = visibility, claims = claims, - pitch = pitch + pitch = pitch, + distance = distance }) end @@ -132,6 +134,7 @@ function onLoad(savedData) visibility = loadedData.visibility claims = loadedData.claims pitch = loadedData.pitch + distance = loadedData.distance else local allColors = Player.getColors() @@ -304,9 +307,6 @@ function getDynamicViewBounds(objList) } for _, obj in pairs(objList) do - -- handling for Physics.cast() results - if not obj.type then obj = obj.hit_object end - if not obj.hasTag("CameraZoom_ignore") and not obj.hasTag("CampaignLog") then count = count + 1 local bounds = obj.getBounds() @@ -338,9 +338,30 @@ function getDynamicViewBounds(objList) return totalBounds end +function loadCameraFromApi(params) + loadCamera(params.player, params.camera) +end + -- loads the specified camera for a player -function loadCamera(player, index) - local lookHere +---@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 +function loadCamera(player, camera) + local lookHere, index, matColor + local matColorList = { "White", "Orange", "Green", "Red" } + local indexList = { + White = 3, + Orange = 4, + Green = 5, + Red = 6 + } + + if tonumber(camera) then + index = tonumber(camera) + matColor = matColorList[index - 2] -- mat index 1 - 4 + else + index = indexList[camera] + matColor = camera + end -- dynamic view of the play area if index == 2 then @@ -354,9 +375,6 @@ function loadCamera(player, index) } -- dynamic view of the clicked play mat elseif index >= 3 and index <= 6 then - local matColorList = { "White", "Orange", "Green", "Red" } - local matColor = matColorList[index - 2] -- mat index 1 - 4 - -- check if anyone (except for yourself) has claimed this color local isClaimed = false @@ -372,6 +390,7 @@ function loadCamera(player, index) local newPlayerColor = playmatApi.getPlayerColor(matColor) copyVisibility({ startColor = player.color, targetColor = newPlayerColor }) player.changeColor(newPlayerColor) + player = Player[newPlayerColor] end -- search on the playmat for objects @@ -393,6 +412,9 @@ function loadCamera(player, index) -- set pitch to default if not edited lookHere.pitch = pitch[player.color] or 75 + -- update distance based on selected multiplier + lookHere.distance = lookHere.distance * (distance[player.color] or 100) / 100 + -- delay is to account for colorswap Wait.frames(function() player.lookAt(lookHere) end, 2) end @@ -413,8 +435,9 @@ function loadDefaultSettings(player) claims[player.color][color] = (player.color == color) end - -- reset pitch for that player + -- reset pitch/distance for that player pitch[player.color] = nil + distance[player.color] = nil -- update the UI accordingly updateSettingsUI(player) @@ -436,15 +459,21 @@ function toggleSettings(player) end end --- called by the slider +-- called by the navigation overlay options function updatePitch(player, number) pitch[player.color] = number end +-- called by the navigation overlay options +function updateDistance(player, number) + distance[player.color] = number +end + -- updates the settings UI for the provided player function updateSettingsUI(player) - -- update the slider + -- update the sliders UI.setAttribute("sliderPitch", "value", pitch[player.color] or 75) + UI.setAttribute("sliderDistance", "value", distance[player.color] or 100) -- update the claims local matColorList = { "White", "Orange", "Green", "Red" } @@ -457,6 +486,7 @@ __bundle_register("playermat/PlaymatApi", function(require, _LOADED, __bundle_re 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 @@ -551,6 +581,26 @@ do 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) @@ -636,6 +686,15 @@ do 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 @@ -645,6 +704,22 @@ do 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) @@ -655,7 +730,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -711,7 +786,87 @@ do 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/go_game_piece_black Navigation Overlay Handler 797ede.yaml b/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml index ba75a3c6f..b92cc04cb 100644 --- a/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml +++ b/unpacked/go_game_piece_black Navigation Overlay Handler 797ede.yaml @@ -19,7 +19,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true LuaScript: !include 'go_game_piece_black Navigation Overlay Handler 797ede.ttslua' -LuaScriptState: '{"claims":{"Black":[],"Blue":[],"Brown":[],"Green":[],"Grey":[],"Orange":[],"Pink":[],"Purple":[],"Red":[],"Teal":[],"White":[],"Yellow":[]},"pitch":[],"visibility":{"Black":{"full":false,"play":false},"Blue":{"full":false,"play":false},"Brown":{"full":false,"play":false},"Green":{"full":false,"play":false},"Grey":{"full":false,"play":false},"Orange":{"full":false,"play":false},"Pink":{"full":false,"play":false},"Purple":{"full":false,"play":false},"Red":{"full":false,"play":false},"Teal":{"full":false,"play":false},"White":{"full":false,"play":false},"Yellow":{"full":false,"play":false}}}' +LuaScriptState: '{"claims":{"Black":[],"Blue":[],"Brown":[],"Green":[],"Grey":[],"Orange":[],"Pink":[],"Purple":[],"Red":[],"Teal":[],"White":[],"Yellow":[]},"distance":[],"pitch":[],"visibility":{"Black":{"full":false,"play":false},"Blue":{"full":false,"play":false},"Brown":{"full":false,"play":false},"Green":{"full":false,"play":false},"Grey":{"full":false,"play":false},"Orange":{"full":false,"play":false},"Pink":{"full":false,"play":false},"Purple":{"full":false,"play":false},"Red":{"full":false,"play":false},"Teal":{"full":false,"play":false},"White":{"full":false,"play":false},"Yellow":{"full":false,"play":false}}}' MeasureMovement: false Name: go_game_piece_black Nickname: Navigation Overlay Handler diff --git a/unpacked/go_game_piece_white GUID Reference Handler 123456.ttslua b/unpacked/go_game_piece_white GUID Reference Handler 123456.ttslua index 410b2da4c..9768d8571 100644 --- a/unpacked/go_game_piece_white GUID Reference Handler 123456.ttslua +++ b/unpacked/go_game_piece_white GUID Reference Handler 123456.ttslua @@ -77,9 +77,15 @@ local GuidReferences = { HandZone = "0285cc", HorrorCounter = "7b5729", InvestigatorSkillTracker = "af7ed7", + PoolResources = "0168ae", + PoolDamage = "b0ef6c", + PoolHorror = "ae1a4e", + PoolClues = "fae2f6", + PoolDoom = "16724b", Playermat = "383d8b", ResourceCounter = "cd15ac", TokenDiscardZone = "457de5", + TokenRemover = "2ba7a5", Trash = "5f896a" }, Red = { @@ -89,15 +95,23 @@ local GuidReferences = { HandZone = "be2f17", HorrorCounter = "beb964", InvestigatorSkillTracker = "e74881", + PoolResources = "fd617a", + PoolDamage = "93f4a0", + PoolHorror = "7bd2a0", + PoolClues = "3b2550", + PoolDoom = "16fcd6", Playermat = "0840d5", ResourceCounter = "a4b60d", TokenDiscardZone = "457de6", + TokenRemover = "39b175", Trash = "4b8594" }, Mythos = { + AdditionalPlayerCardsBag = "2cba6b", AllCardsBag = "15bb07", BlessCurseManager = "5933fb", CampaignThePathToCarcosa = "aca04c", + ChaosBagZone = "83ef06", DataHelper = "708279", DeckImporter = "a28140", DoomCounter = "85c4c6", @@ -109,6 +123,7 @@ local GuidReferences = { OptionPanelSource = "830bd0", PlaceholderBoxDummy = "a93466", PlayArea = "721ba2", + PlayAreaImageSelector = "b7b45b", PlayAreaZone = "a2f932", PlayerCardPanel = "2d30ee", ResourceTokenBag = "9fadf9", @@ -123,12 +138,43 @@ local GuidReferences = { } } +local editsToIndex = { + White = {}, + Orange = {}, + Green = {}, + Red = {}, + Mythos = {} +} + +-- save function to keep edits to the index +function onSave() return JSON.encode({ editsToIndex = editsToIndex }) end + +-- load function to restore edits to the index +function onLoad(savedData) + if savedData and savedData ~= "" then + local loadedData = JSON.decode(savedData) + editsToIndex = loadedData.editsToIndex + updateMainIndex() + end +end + +-- merges the main index and the edits +function updateMainIndex() + for owner, subTable in pairs(editsToIndex) do + for type, guid in pairs(subTable) do + GuidReferences[owner][type] = guid + end + end +end + +-- returns an object reference for the requested owner and type function getObjectByOwnerAndType(params) local owner = params.owner or "Mythos" local type = params.type return getObjectFromGUID(GuidReferences[owner][type]) end +-- returns a list of objects for the requested type function getObjectsByType(type) local objList = {} for owner, objects in pairs(GuidReferences) do @@ -140,6 +186,7 @@ function getObjectsByType(type) return objList end +-- returns a list of objects for the requested owner function getObjectsByOwner(owner) local objList = {} for type, guid in pairs(GuidReferences[owner]) do @@ -150,5 +197,11 @@ function getObjectsByOwner(owner) end return objList end + +-- makes an edit to the main index +function editIndex(params) + editsToIndex[params.owner][params.type] = params.guid + updateMainIndex() +end end) return __bundle_require("__root") \ No newline at end of file diff --git a/unpacked/go_game_piece_white GUID Reference Handler 123456.yaml b/unpacked/go_game_piece_white GUID Reference Handler 123456.yaml index 5e514fdb4..22da0fd11 100644 --- a/unpacked/go_game_piece_white GUID Reference Handler 123456.yaml +++ b/unpacked/go_game_piece_white GUID Reference Handler 123456.yaml @@ -19,7 +19,7 @@ IgnoreFoW: false LayoutGroupSortIndex: 0 Locked: true LuaScript: !include 'go_game_piece_white GUID Reference Handler 123456.ttslua' -LuaScriptState: '' +LuaScriptState: '{"editsToIndex":{"Green":[],"Mythos":[],"Orange":[],"Red":[],"White":[]}}' MeasureMovement: false Name: go_game_piece_white Nickname: GUID Reference Handler 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 e14b1dda4..61c0d2233 100644 --- a/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua +++ b/unpacked/go_game_piece_white Game Key Handler fce69c.ttslua @@ -41,132 +41,49 @@ 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) +__bundle_register("core/NavigationOverlayApi", function(require, _LOADED, __bundle_register, __bundle_modules) do - local BlessCurseManagerApi = {} + local NavigationOverlayApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") - local function getManager() - return guidReferenceApi.getObjectByOwnerAndType("Mythos", "BlessCurseManager") + local function getNOHandler() + return guidReferenceApi.getObjectByOwnerAndType("Mythos", "NavigationOverlayHandler") 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) + -- 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 - -- updates the internal count (called by cards that seal bless/curse tokens) - BlessCurseManagerApi.sealedToken = function(type, guid) - getManager().call("sealedToken", { type = type, guid = guid }) + -- 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 - -- 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 - - -- 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 Wendy's menu to the hovered card (allows sealing of tokens) - ---@param color String Color of the player to show the broadcast to - BlessCurseManagerApi.addWendysMenu = 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 - - -- 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 - - 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/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 + return NavigationOverlayApi 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 @@ -261,6 +178,26 @@ do 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) @@ -346,6 +283,15 @@ do 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 @@ -355,6 +301,22 @@ do 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) @@ -365,7 +327,7 @@ do -- 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 Function Optional filter function (return true for desired objects) + ---@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 @@ -394,26 +356,197 @@ do 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) __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") +local navigationOverlayApi = require("core/NavigationOverlayApi") local optionPanelApi = require("core/OptionPanelApi") local playmatApi = require("playermat/PlaymatApi") +local searchLib = require("util/SearchLib") local victoryDisplayApi = require("core/VictoryDisplayApi") function onLoad() - addHotkey("Add Doom to Agenda", addDoomToAgenda) - addHotkey("Bless/Curse Status", showBlessCurseStatus) - addHotkey("Discard Object", discardObject) + addHotkey("Add doom to agenda", addDoomToAgenda) + addHotkey("Add Bless/Curse context menu", addBlurseSealingMenu) + addHotkey("Discard object", discardObject) + addHotkey("Discard top card", discardTopDeck) + addHotkey("Display Bless/Curse status", showBlessCurseStatus) addHotkey("Move card to Victory Display", moveCardToVictoryDisplay) addHotkey("Remove a use", removeOneUse) + addHotkey("Switch seat clockwise", switchSeatClockwise) + addHotkey("Switch seat counter-clockwise", switchSeatCounterClockwise) addHotkey("Take clue from location", takeClueFromLocation) addHotkey("Upkeep", triggerUpkeep) addHotkey("Upkeep (Multi-handed)", triggerUpkeepMultihanded) - addHotkey("Wendy's Menu", addWendysMenu) end -- triggers the "Upkeep" function of the calling player's playmat @@ -468,10 +601,8 @@ function discardObject(playerColor, hoveredObject) -- discard tokens / tiles on cards / decks if hoveredObject.type ~= "Tile" then - for _, v in ipairs(searchOnObj(hoveredObject)) do - if v.hit_object.type == "Tile" then - table.insert(discardTheseObjects, v.hit_object) - end + for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do + table.insert(discardTheseObjects, obj) end end @@ -479,6 +610,23 @@ function discardObject(playerColor, hoveredObject) playmatApi.discardListOfObjects(discardForMatColor, discardTheseObjects) end +-- discard the top card of hovered deck, calling discardObject function +function discardTopDeck(playerColor, hoveredObject) + -- only continue if an unlocked card or deck was hovered + if hoveredObject == nil + or (hoveredObject.type ~= "Card" and hoveredObject.type ~= "Deck") + or hoveredObject.locked then + broadcastToColor("Hover a deck/card and try again.", playerColor, "Yellow") + return + end + if hoveredObject.type == "Deck" then + takenCard = hoveredObject.takeObject({index = 0}) + else + takenCard = hoveredObject + end + Wait.frames(function() discardObject(playerColor, takenCard) end, 1) +end + -- helper function to get the player to trigger the discard function for function getColorToDiscardFor(hoveredObject, playerColor) local pos = hoveredObject.getPosition() @@ -533,9 +681,8 @@ function removeOneUse(playerColor, hoveredObject) local searchForType = useInfo.type if searchForType then searchForType = searchForType:lower() end - for _, v in ipairs(searchOnObj(hoveredObject)) do - local obj = v.hit_object - if obj.type == "Tile" and not obj.locked and obj.memo ~= "resourceCounter" then + for _, obj in ipairs(searchLib.onObject(hoveredObject, "isTileOrToken")) do + if not obj.locked and obj.memo ~= "resourceCounter" then -- check for matching object, otherwise use the first hit if obj.memo == searchForType then targetObject = obj @@ -584,6 +731,59 @@ function removeOneUse(playerColor, hoveredObject) playmatApi.discardListOfObjects(discardForMatColor, { targetObject }) end +-- switches the triggering player to the next seat (clockwise) +function switchSeatClockwise(playerColor) + switchSeat(playerColor, "clockwise") +end + +-- switches the triggering player to the next seat (counter-clockwise) +function switchSeatCounterClockwise(playerColor) + switchSeat(playerColor, "counter-clockwise") +end + +-- handles seat switching in the given direction +function switchSeat(playerColor, direction) + if playerColor == "Black" or playerColor == "Grey" then + broadcastToColor("This hotkey is only available to seated players.", playerColor, "Orange") + return + end + + -- sort function for matcolors based on hand position (Green, White, Orange, Red) + local function sortByHandPosition(color1, color2) + local pos1 = Player[color1].getHandTransform().position + local pos2 = Player[color2].getHandTransform().position + return pos1.z > pos2.z + end + + -- get used playermats + local usedColors = playmatApi.getUsedMatColors() + table.sort(usedColors, sortByHandPosition) + + -- get current seat index + local index + for i, color in ipairs(usedColors) do + if color == playerColor then + index = i + break + end + end + if not index then + broadcastToColor("Couldn't detect investigator.", playerColor, "Orange") + return + end + + -- get next color + index = index + ((direction == "clockwise") and -1 or 1) + if index == 0 then + index = #usedColors + elseif index > #usedColors then + index = 1 + end + + -- swap color + navigationOverlayApi.loadCamera(Player[playerColor], usedColors[index]) +end + -- takes a clue from a location, player needs to hover the clue directly or the location function takeClueFromLocation(playerColor, hoveredObject) local cardName, clue @@ -593,18 +793,13 @@ function takeClueFromLocation(playerColor, hoveredObject) return elseif hoveredObject.type == "Card" then cardName = hoveredObject.getName() + local searchResult = searchLib.onObject(hoveredObject, "isClue") - for _, v in ipairs(searchOnObj(hoveredObject)) do - local obj = v.hit_object - if obj.memo == "clueDoom" and obj.is_face_down == false then - clue = obj - break - end - end - - if clue == nil then + if #searchResult == 0 then broadcastToColor("This card does not have any clues on it.", playerColor, "Yellow") return + else + clue = searchResult[1] end elseif hoveredObject.memo == "clueDoom" then if hoveredObject.is_face_down then @@ -613,21 +808,10 @@ function takeClueFromLocation(playerColor, hoveredObject) end clue = hoveredObject + local searchResult = searchLib.belowPosition(clue.getPosition(), "isCard") - local search = Physics.cast({ - direction = { 0, -1, 0 }, - max_distance = 0.1, - type = 3, - size = { 0.1, 0.1, 0.1 }, - origin = clue.getPosition() - }) - - for _, v in ipairs(search) do - local obj = v.hit_object - if obj.type == "Card" then - cardName = obj.getName() - break - end + if #searchResult ~= 0 then + cardName = searchResult[1].getName() end else broadcastToColor("Hover a clue or card with clues and try again.", playerColor, "Yellow") @@ -656,9 +840,9 @@ function takeClueFromLocation(playerColor, hoveredObject) end if cardName then - broadcastToAll(playerName .. " took one clue from " .. cardName .. ".", playerColor) + broadcastToAll(playerName .. " took one clue from " .. cardName .. ".", "White") else - broadcastToAll(playerName .. " took one clue.", "Green") + broadcastToAll(playerName .. " took one clue.", "White") end victoryDisplayApi.update() @@ -670,20 +854,8 @@ function showBlessCurseStatus(playerColor) end -- adds Wendy's menu to the hovered card -function addWendysMenu(playerColor, hoveredObject) - blessCurseManagerApi.addWendysMenu(playerColor, hoveredObject) -end - --- searches on an object (by using its bounds) ----@param obj Object Object to search on -function searchOnObj(obj) - return Physics.cast({ - direction = { 0, 1, 0 }, - max_distance = 0.5, - type = 3, - size = obj.getBounds().size, - origin = obj.getPosition() - }) +function addBlurseSealingMenu(playerColor, hoveredObject) + blessCurseManagerApi.addBlurseSealingMenu(playerColor, hoveredObject) end -- Simple method to check if the given point is in a specified area @@ -703,4 +875,46 @@ function titleCase(str) return first:upper() .. rest:lower() 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