-- 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/PlayAreaSelector") end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} local function getGuidHandler() return getObjectFromGUID("123456") end ---@param owner string Parent object for this search ---@param type string Type of object to search for ---@return any: Object reference to the matching object GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type) return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type }) end -- returns all matching objects as a table with references ---@param type string Type of object to search for ---@return table: List of object references to matching objects GUIDReferenceApi.getObjectsByType = function(type) return getGuidHandler().call("getObjectsByType", type) end -- returns all matching objects as a table with references ---@param owner string Parent object for this search ---@return table: List of object references to matching objects GUIDReferenceApi.getObjectsByOwner = function(owner) return getGuidHandler().call("getObjectsByOwner", owner) end -- sends new information to the reference handler to edit the main index ---@param owner string Parent of the object ---@param type string Type of the object ---@param guid string GUID of the object GUIDReferenceApi.editIndex = function(owner, type, guid) return getGuidHandler().call("editIndex", { owner = owner, type = type, guid = guid }) end return GUIDReferenceApi end end) __bundle_register("core/OptionPanelApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local OptionPanelApi = {} -- loads saved options ---@param options table Set a new state for the option table OptionPanelApi.loadSettings = function(options) return Global.call("loadSettings", options) end ---@return any: Table of option panel state OptionPanelApi.getOptions = function() return Global.getTable("optionPanel") end return OptionPanelApi end end) __bundle_register("core/PlayAreaApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayAreaApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") local function getPlayArea() return guidReferenceApi.getObjectByOwnerAndType("Mythos", "PlayArea") end local function getInvestigatorCounter() return guidReferenceApi.getObjectByOwnerAndType("Mythos", "InvestigatorCounter") end -- Returns the current value of the investigator counter from the playmat ---@return number: Number of investigators currently set on the counter PlayAreaApi.getInvestigatorCount = function() return getInvestigatorCounter().getVar("val") end -- Updates the current value of the investigator counter from the playmat ---@param count number Number of investigators to set on the counter PlayAreaApi.setInvestigatorCount = function(count) getInvestigatorCounter().call("updateVal", count) end -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' ---@param playerColor string Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) getPlayArea().call("shiftContentsRight", playerColor) end ---@param state boolean This controls whether location connections should be drawn PlayAreaApi.setConnectionDrawState = function(state) getPlayArea().call("setConnectionDrawState", state) end ---@param color string Connection color to be used for location connections PlayAreaApi.setConnectionColor = function(color) getPlayArea().call("setConnectionColor", color) end -- Event to be called when the current scenario has changed ---@param scenarioName string Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- If matchTypes is false, snap points will be reset to snap all cards. ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) getPlayArea().call("setLimitSnapsByType", matchCardTypes) end -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged -- cards before they're destroyed by entering the container PlayAreaApi.tryObjectEnterContainer = function(container, object) getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) end -- counts the VP on locations in the play area PlayAreaApi.countVP = function() return getPlayArea().call("countVP") end -- highlights all locations in the play area without metadata ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) return getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP ---@param state boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) return getPlayArea().call("countVP", state) end -- Checks if an object is in the play area (returns true or false) PlayAreaApi.isInPlayArea = function(object) return getPlayArea().call("isInPlayArea", object) end PlayAreaApi.getSurface = function() return getPlayArea().getCustomObject().image end PlayAreaApi.updateSurface = function(url) return getPlayArea().call("updateSurface", url) end -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. ---@param args table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) getPlayArea().call("updateLocations", args) end PlayAreaApi.getCustomDataHelper = function() return getPlayArea().getVar("customDataHelper") end return PlayAreaApi end end) __bundle_register("core/PlayAreaImageData", function(require, _LOADED, __bundle_register, __bundle_modules) PLAYAREA_IMAGE_DATA = { ["Official Campaigns"] = { ["Night of the Zealot"] = { { Name = "I - The Gathering 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725443007/D34B55D2637EF1DF22839D12F9CF74F92F8EB486/" }, { Name = "III - The Devourer Below 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725443203/FBE04C8B89F79D18C6D29C28DC3B292A5A3A3DEB/" }, { 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 = "http://cloud-3.steamusercontent.com/ugc/2279446315725401398/AC55F0754B7E4A39796A6F2236012AE03DA55E20/" }, { Name = "I-A - Extracurricular Activity 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725401658/9F3ED6E256818C4528D55980B9D7E44B87170A4F/" }, { Name = "I-A - Extracurricular Activity 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725401870/FE29404D9D93BE2735D41C115DDD9708A0931F3E/" }, { Name = "I-B - The House Always Wins 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402059/4C4A50D259ECFD4DFB94FABB9FA2AD3AABDCA0CA/" }, { Name = "I-B - The House Always Wins 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402263/8B0C981B78E803B3BFD64AC874F315B6810E579B/" }, { Name = "I-B - The House Always Wins 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402460/8599D17306C644D75D189591BC6D57C2F27F9E35/" }, { Name = "I-B - The House Always Wins 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402641/777865B25BCF86C2EFEAE232AFBC31561D12AE0F/" }, { Name = "II - The Miskatonic Museum 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725402804/A44E68AC08E6568A757429B29E71C703B76FA159/" }, { Name = "II - The Miskatonic Museum 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403000/B28D46D5B7BCE9EA9BF27D3A0A932393D8258A76/" }, { Name = "III - The Essex County Express", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403150/956BE4B5C25805E57C8FC5CF28A94BD7EF07CA54/" }, { Name = "IV - Blood on the Altar 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403290/07DD1508BA880AD1212A820BC29471C48DC90C53/" }, { Name = "IV - Blood on the Altar 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403456/A74398E8CCD78657C2555832A3B340723E8C9117/" }, { Name = "IV - Blood on the Altar 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403636/CD89D7D9CC020F41D5AD02D54E308877583EC45F/" }, { Name = "IV - Blood on the Altar 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403818/AEFAC50DAC82271BCACC53B8FF69B5B094FA1078/" }, { Name = "V - Undimensioned and Unseen 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725403955/E7C566E536CF6E910DB654FC1DBF4838F2BAF899/" }, { Name = "V - Undimensioned and Unseen 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404127/F92F123BBD3D857C579B9284988C3AFFBCD84B2B/" }, { Name = "V - Undimensioned and Unseen 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404273/7F8CFE6785BD74BB8D5E34C204AFB8AA580CA3E3/" }, { Name = "V - Undimensioned and Unseen 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404424/C2AE08371CF2DE2777791BBD4AEF446E50532382/" }, { Name = "VI - Where Doom Awaits 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404578/A520CE0F6B0C8591A48ADEF34E68B46AFC2BC83B/" }, { Name = "VI - Where Doom Awaits 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404740/1FF9EF375BDBB73CA8F0A1562F215692AAEA7131/" }, { Name = "VI - Where Doom Awaits 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725404914/5473D20CE0122F55EEADB16C4353D4EDD91E440E/" }, { Name = "VI - Where Doom Awaits 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405088/A0AA8CB864747152763D434D0737D81EB515E71B/" }, { Name = "VI - Where Doom Awaits 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405247/FAF408DAAD4FC72142DFDFE5FCEA4B84293AA72C/" }, { Name = "VII - Lost in Time and Space 1", URL = "https://i.ibb.co/rtTpbDx/Dunwich-8-Lost-in-Time-amp-Space.jpg" }, { Name = "VII - Lost in Time and Space 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725405746/771BAE40F98BB16F8D011FA794E4AC0095131AF1/" }, { Name = "VII - Lost in Time and Space 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725406148/D15D56EA34F27C651D7E7AC202DA4DEBE395E310/" } }, ["The Path to Carcosa"] = { { Name = "I - Curtain Call", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426327/41F6192EDCFFD6AAE2EE44C2BB5708B19D7464A9/" }, { Name = "II - The Last King 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426499/114EAEA245AC51CA219364AF26341E7F7E649A7D/" }, { Name = "II - The Last King 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426683/A2762E95DD79D7A7BC749925166BBFC18B62EF3B/" }, { Name = "II - The Last King 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426818/A6A20773EA95CE3D9896B22E317A0E1ACCA911F0/" }, { Name = "III - Echoes of the Past", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427005/25F51DE4B1F33C16A0E68C929E5002F0C4520A37/" }, { Name = "IV - The Unspeakable Oath 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427178/9575E4F6E53DDAD2D3E61684AB9757B04E1EF787/" }, { Name = "IV - The Unspeakable Oath 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427342/199A6C6411992ACFB8A417E86207FE6CE956EB97/" }, { Name = "IV - The Unspeakable Oath 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427501/48525BCDFA281947FA9ED26507BC1F81C07056E8/" }, { Name = "V - A Phantom of Truth 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427681/F72B02FF1A5E58CBCB0E53C8455310AF37064477/" }, { Name = "V - A Phantom of Truth 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725427848/215A757FF28317EB3EF7CF1F9CAE6F1CFF735091/" }, { Name = "VI - The Pallid Mask 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428067/D46BAD80B112156A2D3DEFF247A74C74F27DDA12/" }, { Name = "VI - The Pallid Mask 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428250/464681CF59770BFD493A0D672C7CB70BA8CD3499/" }, { Name = "VII - Black Stars Rise 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428431/4766E1A4893E0EF16B576749B73CE449F10DA20C/" }, { Name = "VII - Black Stars Rise 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725428896/05ED3D08F29C8E6EC080F0615DE130F2A687A9AC/" }, { Name = "VIII - Dim Carcosa 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725429052/BA81DBDE7A12B993CB8B7001CA93095AD0512449/" }, { Name = "VIII - Dim Carcosa 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725429235/C5C939E0213575B5EDCA6723D209892071DDE4B5/" } }, ["The Forgotten Age"] = { { Name = "I - The Untamed Wilds 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725446729/7F5E48BC9A028AE5117231364F2D5B433A62239A/" }, { Name = "I - The Untamed Wilds 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725446946/55C374DC5BE3620CB0D5BCA379EA55CF471D09B3/" }, { Name = "I - The Untamed Wilds 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447172/6EAE2CFD3AC552CFB744C75E4E26A79264DE17D3/" }, { Name = "I - The Untamed Wilds 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447409/FCF48C94D90F94FBFFD674B0650E288E7312C441/" }, { Name = "I - The Untamed Wilds 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447579/F7C3FB9E31147430C1384684887FC66E616D0302/" }, { Name = "II - The Doom of Eztli 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725447752/44EF68E1BF3C2D9DCD5306DD90B4CCCFBE03891C/" }, { Name = "II - The Doom of Eztli 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448027/F5F14EC590C33BC87D8F0CFF43D7E4DF80D61133/" }, { Name = "II - The Doom of Eztli 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448215/BFD9D940DB8EC9AC8D818C48BBAE3338A8E48A3B/" }, { Name = "III - Threads of Fate", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448393/67F3BE7DC1BEC807A17D3F8914328D408856E019/" }, { Name = "IV - The Boundary Beyond 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448568/3C268415A47430CEEC3F9BFB216EF57E3DBF820A/" }, { Name = "IV - The Boundary Beyond 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448701/3FA23DCA30505AD4C27D8914740AD3138C01122C/" }, { Name = "IV - The Boundary Beyond 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725448863/266C3320AC326C30F08FBC11A95567E1249E7FB7/" }, { Name = "V - Heart of the Elders 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449019/A6CC459ACA004C33DD9605BE8382437F6BBE24F7/" }, { Name = "V - Heart of the Elders 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449150/241FA88572B6B4F652D7FC6D1EDB23DF94E3199C/" }, { Name = "V - Heart of the Elders 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449310/DBD731498FAB399A4155F7B64F8710BF5FBB5C1F/" }, { Name = "VI - The City of Archives 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449473/527CB6470F508D4E1F1E4AFC8A0D3AB0A65E046E/" }, { Name = "VI - The City of Archives 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449630/A8E933F79A646990155CC18A2143B3BC16222750/" }, { Name = "VI - The City of Archives 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449814/30BB7E4F8D9F1571A420372E78ACAF2D7792811F/" }, { Name = "VII - The Depths of Yoth 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725449962/D69532827DFF2D654F8A606B7917D593F52D7624/" }, { Name = "VII - The Depths of Yoth 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450085/479A8A1BDD7BE80B43AE4F2C14DFA811D7B28482/" }, { Name = "VII - The Depths of Yoth 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450258/E617F5A78DFBE913652E20BF97D38B91087FACAE/" }, { Name = "VIII - Shattered Aeons 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450415/5631152D4830C00DB8D8EB2163CE773542A62C79/" }, { Name = "VIII - Shattered Aeons 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725450556/C3000D020B0C32B4DA3420AEE5E286893453FC49/" } }, ["The Circle Undone"] = { { Name = "0 - Disappearance at the Twilight Estate", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457506/6E228F87CEDCD3A0CFA28B680C266B4C68C7682B/" }, { Name = "I - The Witching Hour", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457706/D0FDC0E9287C343745AE6135352194D654D98B64/" }, { Name = "II - At Death's Doorstep 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725457864/3106851EC93B1FC01311BD68F02145BA2FD720B0/" }, { Name = "II - At Death's Doorstep 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458037/155EB572CF28F09A64A021CAC3A3219C31B2CD49/" }, { Name = "II - At Death's Doorstep 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458187/482CC6730F267061A055D6FD402603BC642A9635/" }, { Name = "III - The Secret Name 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458373/769D67103FACFB94E77465E85DBB2A250284B59B/" }, { Name = "III - The Secret Name 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458592/D70CE9B1AD7158AF206A25777A8BA6F284587A83/" }, { Name = "III - The Secret Name 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725458848/2FC0D5AFFA97AB5E80244F1ED711036B2149B0EE/" }, { Name = "III - The Secret Name 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459026/A1A5B18ECB38985A35781CBDFF53935541720AF4/" }, { Name = "IV - The Wages of Sin 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459182/46870E1DBE623E93E675CB2D3C1E959B40CDCC83/" }, { Name = "IV - The Wages of Sin 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459344/9552699A8CEC5E7BF22843990394BB977539CBE0/" }, { Name = "IV - The Wages of Sin 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459466/9B6B55A6F76668929B6D6B1DD5FDAE7CEE427A1C/" }, { Name = "IV - The Wages of Sin 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459609/054A60BDCD266C1A53F29067CFC83D0561666FE4/" }, { Name = "IV - Wages of Sin 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459714/11B3D734AC5229A0DEA5372CD50F5C7841F9D5A0/" }, { Name = "V - For the Greater Good 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459829/9AA9563CCD72A8593BDE3C6D1299E96325ECE747/" }, { Name = "V - For the Greater Good 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725459933/13A103B7BC0ABB611F6A8E61D033C6AD95EED4D4/" }, { Name = "V - For the Greater Good 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460088/C88DDC5CE898ACEF360B8AD72E05F15BF84DE171/" }, { Name = "V - For the Greater Good 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460182/C086EDA78636624FC9C4EA1DBCD8F1D39B7A6A89/" }, { Name = "VI - Union and Disillusioned", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460382/8EFB842A623A2D1E6D0E915268A207A5D7DFC6D4/" }, { Name = "VII - In the Clutches of Chaos 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460586/7E156BF93F211BC425CD37ED273FCC84FF1F4C4D/" }, { Name = "VII - In the Clutches of Chaos 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460740/72A39A0FACA806EF2E0A4E31AEDF6D8FCDF1A876/" }, { Name = "VII - In the Clutches of Chaos 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725460884/5716F6E2CB3F8D14FA5B7B806555896088696057/" }, { Name = "VIII - Before the Black Throne 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725461042/DFF7A992A9440E58CE32D4B8A96A02A8F785AC90/" }, { Name = "VIII - Before the Black Throne 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725461161/18902B2F74C9D70F5EA79A34521E3FDEDEFC893D/" } }, ["The Dream-Eaters"] = { { Name = "I-A - Beyond the Gates of Sleep 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725465733/828EE1FF16928EA0426BC68AAED4B9AA6B6FBB49/" }, { Name = "I-A - Beyond the Gates of Sleep 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725465934/35A85E9056B7A212AC39E7043FDF546A425E62F2/" }, { Name = "I-A - Beyond the Gates of Sleep 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466105/05D29313D2559B6683465A7034DE7B07DE675420/" }, { Name = "I-B - Waking Nightmare", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466267/16FAE20612ED0A6A65836DD1B014AC5A801A172F/" }, { Name = "II-A - The Search for Kadath 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466425/03CCD5F24999CC6CC905CB2FD021DB67D7769163/" }, { Name = "II-A - The Search for Kadath 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466615/085ACE95FEF03D2BE91BAD5E1864E1D0263DCCC0/" }, { Name = "II-A - The Search for Kadath 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466802/83861733568FCA9673B6F5EFE0C9D3337E3DFD27/" }, { Name = "II-A - The Search for Kadath 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725466941/D4FDE1FE722DC6B03AD38D797F2E00531908583D/" }, { Name = "II-A - The Search for Kadath 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467396/C9A476395B9326142BBDBD06D22A14C83EAD2161/" }, { Name = "II-B - A Thousand Shapes of Horror 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467582/5EB69F3A3F20B312FE3FE3C64FEA96200EE51563/" }, { Name = "II-B - A Thousand Shapes of Horror 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725467791/5FE437C821641EDD703D336205A37F8F0CACFD38/" }, { 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 = "http://cloud-3.steamusercontent.com/ugc/2279446315725468100/2DD1038163AD5DAA759EA4BE49DB82A2718E931F/" }, { Name = "III-A - Dark Side of the Moon 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468293/E8145D05833864EEC70AF9AC401039D8E8AFDE3E/" }, { Name = "III-B - Point of No Return 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468506/1F2E3D425A4D97ADBCA59B4A9401C411F91F875F/" }, { Name = "III-B - Point of No Return 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468694/8631E68BA7CE69BECF1D476A03CBDC79112A60BF/" }, { Name = "IV-A - Where the Gods Dwell", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725468880/2C8A9459149D33E526FDC4B68A063475305C15F8/" }, { Name = "IV-B - Weaver of the Cosmos 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469060/9E6AF9E0D68EC0F44B82968CE99E433A25A0E0C4/" }, { Name = "IV-B - Weaver of the Cosmos 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469224/8C969B8ABAEE6CFFEF165C2E4BBA0E7E9B33AA1A/" }, { Name = "IV-B - Weaver of the Cosmos 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725469417/A94C14A64836FB9B5FAFAC5B790C51441F8D475F/" } }, ["The Innsmouth Conspiracy"] = { { Name = "I - The Pit of Despair 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473070/57FEAA8135F62DBAD52E2AAB562EF45EB9A0194A/" }, { Name = "I - The Pit of Despair 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473257/FEC6F9FAA1CC656BFD5861F58E4751BC94AB0424/" }, { Name = "II - The Vanishing of Elina Harper 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473424/B0E2BFA9C7F61A5B7A72CD11AD1AFF4A070AFFA1/" }, { Name = "II - The Vanishing of Elina Harper 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473570/D28C2DA099D656116A0D7BAA8B874E4ED6B6B50E/" }, { Name = "II - The Vanishing of Elina Harper 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725473731/EE9BED3522A1B7CD5E394A67AD7F692DB709A9B5/" }, { 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 = "http://cloud-3.steamusercontent.com/ugc/2279446315725474056/C82E467216DF747AA954C614D7D0B8F649163EDA/" }, { Name = "III - In Too Deep 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474234/C6A72CDEFCDF1F2A3C6036F349B5F368EFDACA2E/" }, { Name = "III - In Too Deep 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474398/752D0CE313C58A5B1C3181503C841EB91D041492/" }, { Name = "III - In Too Deep 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474562/308687DFB9B0F2286A9248698FD38C0BF66B89ED/" }, { Name = "IV - Devil Reef 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474717/DCEC44D2F7F22A950B3CF52C81C8F931710EFADC/" }, { Name = "IV - Devil Reef 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725474883/04913E71194BF766DFF2DF8646251AC461A35FE2/" }, { Name = "V - Horror in High Gear 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475029/FAA34C92FA800E8DDF6449B1C48FCC7468D783BD/" }, { Name = "V - Horror in High Gear 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475133/BC689B58040F74E7DB44CFD8F3F2BF32FE4081E1/" }, { Name = "V - Horror in High Gear 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475307/53ADF5E957F88F1DDCE46828547E5808C3CAEFD7/" }, { Name = "V - Horror in High Gear 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475402/C41EB1D2F8549669DD4323A339F5EC594996816C/" }, { Name = "VI - A Light in the Fog 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475509/C526C9A3AC34195ACF6161D4821D1424A8A288B4/" }, { Name = "VI - A Light in the Fog 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725475660/2C67D57967F300BD1FE1AFC08C49EBCF4A88D11C/" }, { Name = "VII - The Lair of Dagon 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476055/4BC221648012F7A7A37B2F65929705E973FF9CE3/" }, { Name = "VII - The Lair of Dagon 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476271/3F9CF0FE8ACCE12E26ACA5D5777177A10B49D6DA/" }, { Name = "VIII - Into the Maelstrom 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476474/AF8695342FBCE6F6BC7B353C86C6006F1629F43A/" }, { Name = "VIII - Into the Maelstrom 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725476643/CB175401ECDF04F97334CBF8AE7EC76A43A85735/" } }, ["Edge of the Earth"] = { { Name = "I - Ice and Death 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482152/322E07021DC78455859C860D8B1574F1BA2E0F68/" }, { Name = "I - Ice and Death 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482327/BD14DDE856A2062A939F860743FFF15F8B0BFF5A/" }, { Name = "I - Ice and Death 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482520/0FB5AC83DF448994EC0A866ACF6AF57ADCC59C82/" }, { Name = "??? - Fatal Mirage", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725481929/A35EDF11BD6AF52784BA6611C363CBBB373622EE/" }, { Name = "II - To the Forbidden Peaks 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482688/B50455616DFC14FE0B9398DBE2A3A1AE25040516/" }, { Name = "II - To the Forbidden Peaks 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725482839/17786225AA56E75E558491E7E710F555AF3E5799/" }, { Name = "III - City of the Elder Things 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483014/B74378E02A1A99F544CD98141EF62193A2A612FB/" }, { Name = "III - City of the Elder Things 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483208/CDFF7A2D404485DE2B4C4ED54B34E197515F0094/" }, { Name = "IV - The Heart of Madness 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483349/A96BC4AA73C71FE86EF38110236BAEF710C00EE2/" }, { Name = "IV - The Heart of Madness 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725483528/5BF0DD740C5D43EFBFEF0436EB35FF9DA748FA5E/" } }, ["The Scarlet Keys"] = { { Name = "5-A Riddles and Rain", URL = "http://cloud-3.steamusercontent.com/ugc/2037357792057358580/E9E5FE4028C08B3D4883406821221B73C8B5B2C7/" }, { Name = "11-B Dead Heat", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566443853/CAD7771D90141EA6D5FFAFE1EC5E7AD9647C82DB/" }, { Name = "16-D Sanguine Shadows", URL = "http://cloud-3.steamusercontent.com/ugc/2037357792057358704/4A7261EB31511467CBC46E876476DD205F528A4B/" }, { Name = "21-F Dealings in the Dark", URL = "http://cloud-3.steamusercontent.com/ugc/2037357792057358816/7C9FE4C34CD0A7AE87EF054742D878F310C71AA7/" }, { Name = "28-I Dancing Mad", URL = "http://cloud-3.steamusercontent.com/ugc/2037357792056955518/EAB857DD5629EC6A3078FB0A3A703B85B5F514B9/" }, { Name = "23-K On Thin Ice", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444026/EB5628E254AE25DA89A9C999EAAD995ECF67068E/" }, { Name = "38-N Dogs of War", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444199/194FD9A713907197471A55411AE300B62C5F5278/" }, { Name = "46-Q Shades of Suffering", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444330/3ED2CCE95DE933546E1B5CBBF445D773E6D65465/" }, { Name = "56-Y Without a Trace", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444450/FE4C335B0F72E83900A4EED0FD1A1D304D70D6B7/" }, { Name = "59-Z Congress of the Keys 1", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444576/5BB32469ED412D59BB0A46E57D226500B1D0568B/" }, { Name = "59-Z Congress of the Keys 2", URL = "http://cloud-3.steamusercontent.com/ugc/2038485431566444690/B01A1FEAB57473D9B6DF11B92D62C214AA1C2C02/" } } }, ["Official Scenarios"] = { ["The Blob That Ate Everything"] = { { Name = "The Blob That Ate Everything 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489144/53A920E2D1A9F41937B21B0A5B1A4E450ABFC460/" }, { Name = "The Blob That Ate Everything 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725488396/9CC07F923BD1CBFC4BB06DD2CC6747D2C3541737/" } }, ["Carnevale of Horrors"] = { { Name = "Carnevale of Horrors 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725496678/91164AF7C2ED06A3E50225794DE9C5E92D1D3B04/" }, }, ["Curse of the Rougarou"] = { { Name = "Curse of the Rougarou 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494513/DF8E92EA5C1131A0C5D8FA06BFF6FD239412E11C/" }, { Name = "Curse of the Rougarou 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494706/5D2EDE5D07DDA6E5781DB70D13F9A17EF26D36F2/" }, { Name = "Curse of the Rougarou 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725494855/44A751CB66CBE4D75E67A53FC392696F6A3BFD4C/" }, { Name = "Curse of the Rougarou 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725495011/ADD3431B383236BCF057C1573CEF7E43F39FDE72/" }, { Name = "Curse of the Rougarou 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725495146/79159992D5002AD3D7D23ED82D9BB76D437B94C3/" } }, ["Guardians of the Abyss"] = { { Name = "Guardians of the Abyss 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725490870/9C03B2974D7776B8E2AFEEF025756D1885AF0AE3/" }, { Name = "Guardians of the Abyss 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491039/E81F05AB9C802F57F4D9F7229CE3D53231ACB70D/" }, { Name = "Guardians of the Abyss 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491202/384AA7DBA614B61C46D57EF5105A96F25F938B74/" }, { Name = "Guardians of the Abyss 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491392/1C8FF752DF97F362BA8937BFEC65140AE3ADF8A6/" }, { Name = "Guardians of the Abyss 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491512/06B1DCA10B44FF86567CEFCC135D619648CE5F19/" }, { Name = "Guardians of the Abyss 6", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725491658/5446E231AEF72CF4F7B4892116671FF7175EFA0F/" } }, ["The Labyrinths of Lunacy"] = { { Name = "The Labyrinths of Lunacy 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489685/D2D342844212C8A21E030418935A227C2E3279DB/" }, { Name = "The Labyrinths of Lunacy 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489820/E3E18B0940C2604F62E564AD43F178FF9F13B3C9/" }, { Name = "The Labyrinths of Lunacy 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489972/6A34CF53190EAAAF57C31FB97A3C2ACBD27FEE40/" } }, ["Murder at the Excelsior Hotel"] = { { Name = "Murder at the Excelsior Hotel 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725488868/7F7FE8BB3C7E3645B4377F86366C6073CDB8F113/" }, { Name = "Murder at the Excelsior Hotel 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725489144/53A920E2D1A9F41937B21B0A5B1A4E450ABFC460/" } }, ["War of the Outer Gods"] = { { Name = "War of the Outer Gods", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725487627/43A19A6D97A6DA63A487EB247EE95884E2D9F5FD/" } } }, ["Fan-Made Campaigns"] = { ["Cyclopean Foundations"] = { { Name = "I - Lost Moorings 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499518/02DA17FC9D6A1174E484977269F44AE6995C6F7C/" }, { Name = "I - Lost Moorings 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499680/1556F230B59D42FCA47A5A87135330B03C231E92/" }, { Name = "II - Going Twice", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725499855/1220C81273EFA6F36C2AEBA713E31DE1E2F92454/" }, { Name = "III - Private Lives", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500069/452E4427185A7F1AFB3F2CBB263DC55B6A144D49/" }, { Name = "IV - Crumbling Masonry 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500260/94FE8506AB13CA51F087ABF155799F73BCBAB1E9/" }, { Name = "IV - Crumbling Masonry 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500508/04B6C6D8845BF5411D28C79D185EAF6FFBB409F5/" }, { Name = "V - Across Dreadful Waters", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500640/447069BBBF70474439D3CC4F970F6617C8B738F4/" }, { Name = "VI - Blood From Stones", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500803/23C46C5F08E3F911F565D9EC38CFACFFAA5F5B11/" }, { Name = "VII - Pyroclastic Flow 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725500952/804B531E517B1AD2294E304AA6F72F8CC3E6FC4E/" }, { Name = "VII - Pyroclastic Flow 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501115/E771289EB848A695DF47C405300B1EC7CA925009/" }, { Name = "VIII - Tomb of Dead Dreams 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501272/CAE6C4185540F3F8FFA2A8E37458A5B80DBD70FC/" }, { Name = "VIII - Tomb of Dead Dreams 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501415/DA9C07488DA2753FF5621D1731A84D6D0B1CC1BD/" }, { Name = "VIII - Tomb of Dead Dreams 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725501813/030E5DB9F8F6C5F092EFDF2C42AD631318B0923A/" } }, ["Dark Matter"] = { { Name = "I - The Tatterdemalion 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504118/AC852F478D5BDA0C8A54A499B07A66E872560EC7/" }, { Name = "I - The Tatterdemalion 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504319/5B24BB2080AC76D836708AABC1BC90FD884F043D/" }, { Name = "I - The Tatterdemalion 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504461/73E4632A2EAAFA918924E60A64B03838CA6DDD77/" }, { Name = "I - The Tatterdemalion 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504602/6DB8F081CC907A0D6F364E5045BB7E8FADA91B5C/" }, { Name = "II - Electric Nightmares 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504770/C6FB5FDD153ACD07565259AE013FDC7FF567037D/" }, { Name = "II - Electric Nightmares 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725504974/80E29EA68B88B78CDADC475998E832C7245409F4/" }, { Name = "IIIa - Lost Quantum", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505211/07E1254B1C601496E47B7E60B736D1699AAD38C8/" }, { Name = "IIIb - In the Shadow of Earth 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505419/7E8B50470AD6AD27429B58A42271755289FC90EB/" }, { Name = "IIIb - In the Shadow of Earth 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725505603/DCD5B255FE66F8D8F47FB6C928D80583F3F950AC/" }, { Name = "IIIc - Strange Moons", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506071/78597C2FBE2DE55BFC86AEC9F42FE1B20D26544C/" }, { Name = "IV - The Machine in Yellow", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725426327/41F6192EDCFFD6AAE2EE44C2BB5708B19D7464A9/" }, { Name = "V - Fragment of Carcosa 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506388/A299C8D58171A6D78CF55D911C2B81C63D88444F/" }, { Name = "V - Fragment of Carcosa 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506567/C36509CB6520803355E7AE1E9EC8CD35641B28C8/" }, { Name = "VI - Starfall 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506714/327D0E565039B7FA9157FDA04A302DF178C64C44/" }, { Name = "VI - Starfall 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506809/E637DAAD8BEB00E4305756D101E1E6B370CB1644/" }, { Name = "VI - Starfall 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725506978/A17CD45A7770BAC7196218ADD2FB6CEB0E7A0E6B/" } }, ["The Ghosts of Onigawa"] = { { Name = "I - The Hidden Village", URL = "https://i.imgur.com/btTQffc.jpeg" }, { Name = "II - The House on the Hill", URL = "https://i.imgur.com/YTHt8JQ.jpeg" }, { Name = "III - The River Delta", URL = "https://i.imgur.com/9Zk3iLJ.png" }, { Name = "IV - The War Eternal", URL = "https://i.imgur.com/6UtFHhc.jpeg" }, { Name = "V - Half Light", URL = "https://i.imgur.com/hul7lLL.png" }, { Name = "VI - The End of August", URL = "https://i.imgur.com/PKWtpG7.jpeg" }, { Name = "VII - The Molten Armory", URL = "https://i.imgur.com/kMSdBRh.jpeg" }, { Name = "VIII - The Black Harvest", URL = "https://i.imgur.com/6ySucTS.jpeg" } } }, ["Fan-Made Scenarios"] = { ["Side Scenarios (FM)"] = { { Name = "Code Red at Bleeding Heart", URL = "https://i.imgur.com/nTstdlj.jpeg" }, { Name = "Consternation on the Constellation", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725512402/37F34A14CEEA9D2F889F7B97B065C0193F268FE1/" }, { Name = "Symphony of Erich Zann", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725512613/B23EA91E9489E0DDE250DD33F9AF1A12EEE52E0C/" } } }, ["Other Images"] = { ["Arkham Locations"] = { { Name = "Downtown 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516086/53F48F8AA9CFE4BF544BF03A616AC12A5344615C/" }, { Name = "Downtown 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516316/1A337F5D66D7B5F59C66F465710717340B1D56AB/" }, { Name = "Eastside 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516542/09B4BE1E5487C3B11C0178B0B6FFD51620BE6AA6/" }, { Name = "Eastside 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516744/9B7F54E99D9B85884D5E363B97B25DA2DD3F03CC/" }, { Name = "French Hill", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725516949/8BFEF09FDB6608173280F887C1BA3906427678CC/" }, { Name = "Generic 1", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517086/93E00AA823FBA1C6531BBA143408E1E7D89BE3F0/" }, { Name = "Generic 2", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517270/1450BCB6698058F833FAE770D31D0D064B82F5C2/" }, { Name = "Generic 3", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517434/5B529D9DEF3550E898744CE19AAD4CC0AB3F12DF/" }, { Name = "Generic 4", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517622/FE0C331881B776E66D3A2C60D70147A0CABFDAC6/" }, { Name = "Generic 5", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725517833/A123F1A2D1B8BE960AAB371D9FD06F27C282CB9B/" }, { Name = "Generic 6", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518026/10D4F06C8A1AEC3ACAEC5C3B9DA142D3BA5818FE/" }, { Name = "Generic 7", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725518144/72D4A60264C2DD201AAA5FFDCA95C6FF04EF8AC8/" }, { Name = "Generic 8", 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 = "http://cloud-3.steamusercontent.com/ugc/2279446315725518846/79D6BEB0D8C274E3D308A67CD3181418B02D3A7E/" }, { Name = "Northside", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519012/E4B527768AFEFE0E4FB4518CA2AFDD69A98AB5D1/" }, { Name = "Rivertown", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519190/7A9A09861EECE2D98B5C1EB694E88C2073ABDFDF/" }, { Name = "Southside", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519353/FE43349A25231F48662309FEB331DB2C418A5E80/" }, { Name = "Uptown", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725519551/3630457608AD2DB605EC4BCF4332C1D0983305C0/" } }, ["Default Image"] = { { Name = "Default Image", URL = "http://cloud-3.steamusercontent.com/ugc/998015670465071049/FFAE162920D67CF38045EFBD3B85AD0F916147B2/" } }, ["Unsorted"] = { { Name = "Kingsport", URL = "http://cloud-3.steamusercontent.com/ugc/2279446315725522594/1EA2C0AF5D4D346AD3FFDC38215BB20AAA72CE8D/" }, { Name = "Devil", URL = "http://cloud-3.steamusercontent.com/ugc/2115062479282248687/DD84A3CB3C4A475A5D093CB413A16A5CEA5FBF79/" }, { Name = "Mystic Board", URL = "http://cloud-3.steamusercontent.com/ugc/2115062479282248488/EC27B1215F558A39954C27477D8B4F916CA211E5/" } } } } end) __bundle_register("core/PlayAreaSelector", function(require, _LOADED, __bundle_register, __bundle_modules) require("core/PlayAreaImageData") -- this fills the variable "PLAYAREA_IMAGE_DATA" local optionPanelApi = require("core/OptionPanelApi") local playAreaApi = require("core/PlayAreaApi") local typeIndex, selectionIndex, plainNameCache function onSave() return JSON.encode({ typeIndex = typeIndex, selectionIndex = selectionIndex }) end function onLoad(savedData) self.createButton({ function_owner = self, click_function = "onClick_toggleGallery", tooltip = "Show Image Gallery", position = {0, 0.06, 0}, height = 1500, width = 1500, color = { 1, 1, 1, 0 } }) local loadedData = JSON.decode(savedData) or {} typeIndex = loadedData.typeIndex or 1 selectionIndex = loadedData.selectionIndex or 1 Wait.time(updatePlayAreaGallery, 0.5) math.randomseed(os.time()) end -- click function for main button function onClick_toggleGallery(_, playerColor) Global.call("togglePlayAreaGallery", playerColor) end function getDataSubTableByIndex(dataTable, index) local loopId = 1 for i, v in pairs(dataTable) do if index == loopId then return v end loopId = loopId + 1 end return {} end function updatePlayAreaGallery() -- get subtables local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) -- get global xml to insert elements local globalXml = UI.getXmlTable() -- selectable items local itemSelection = getXmlTableElementById(globalXml, 'itemSelection') itemSelection.children = {} local i = 0 for itemName, _ in pairs(dataForType) do i = i + 1 table.insert(itemSelection.children, { tag = "Panel", attributes = { class = "itemPanel", id = "typePanel" .. i }, children = { tag = "Text", value = itemName, attributes = { class = "itemText", id = "typeListText" .. i } } }) end -- selectable images for that item local playareaList = getXmlTableElementById(globalXml, 'playareaList') playareaList.children = {} for i, v in ipairs(dataForSelection) do table.insert(playareaList.children, { tag = "VerticalLayout", attributes = { class = "imageBox", id = "image" .. i }, children = { { tag = 'Image', attributes = { class = "playareaImage", image = v.URL } }, { tag = 'Text', value = v.Name, attributes = { class = "imageName" } } } }) end playareaList.attributes.height = round(#playareaList.children / 2, 0) * 380 Global.call("updateGlobalXml", globalXml) Wait.time(highlightTabAndItem, 0.1) end function onClick_imageTab(_, _, tabId) typeIndex = tonumber(tabId:sub(9)) selectionIndex = 1 updatePlayAreaGallery() end function onClick_listItem(_, _, listId) selectionIndex = tonumber(listId:sub(10)) updatePlayAreaGallery() end function onClick_image(player, _, id) local imageIndex = tonumber(id:sub(6)) local dataForType = getDataSubTableByIndex(PLAYAREA_IMAGE_DATA, typeIndex) local dataForSelection = getDataSubTableByIndex(dataForType, selectionIndex) local newURL = dataForSelection[imageIndex].URL playAreaApi.updateSurface(newURL) Global.call("togglePlayAreaGallery", player.color) end function highlightTabAndItem() -- highlight active tab for i = 1, 5 do local color = "#888888" if i == typeIndex then color = "#ffffff" end UI.setAttribute("imageTab" .. i, "color", color) end -- highlight item UI.setAttribute("typePanel" .. selectionIndex, "color", "grey") UI.setAttribute("typeListText" .. selectionIndex, "color", "black") end -- loops through an XML table and returns the specified object ---@param ui table XmlTable (get this via getXmlTable) ---@param id string Id of the object to return function getXmlTableElementById(ui, id) for _, obj in ipairs(ui) do if obj.attributes and obj.attributes.id and obj.attributes.id == id then return obj end if obj.children then local result = getXmlTableElementById(obj.children, id) if result then return result end end end return nil end -- utility function function round(num, numDecimalPlaces) local mult = 10 ^ (numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult end function maybeUpdatePlayAreaImage(scenarioName) -- check if option is enabled local optionPanelState = optionPanelApi.getOptions() if not optionPanelState["changePlayAreaImage"] then return end -- initialize cache if nil if not plainNameCache then plainNameCache = {} for i, dataForType in pairs(PLAYAREA_IMAGE_DATA) do for j, dataForCycle in pairs(dataForType) do for k, data in ipairs(dataForCycle) do local plainName = getPlainName(data.Name) -- override plainName for all images in the "Other Images" category (except the default image) if i == "Other Images" and data.Name ~= "Default Image" then plainName = "Generic" end if not plainNameCache[plainName] then plainNameCache[plainName] = {} end table.insert(plainNameCache[plainName], data.URL) end end end end -- look for matching playarea image or use generic ones instead local listOfEligibleImages = {} if plainNameCache[scenarioName] then listOfEligibleImages = plainNameCache[scenarioName] else listOfEligibleImages = plainNameCache["Generic"] end -- get a random entry from the eligible list local newImageIndex = math.random(#listOfEligibleImages) playAreaApi.updateSurface(listOfEligibleImages[newImageIndex]) end -- attempts to extract the plain scenario name from the playarea image name function getPlainName(str) -- remove prefix type 1 str = str:gsub("%w+%-%w%s%-%s", "") -- matches "II-B - Thousand Shapes of Horror 1" -- remove prefix type 2 str = str:gsub("%w+%-%w%s", "") -- matches "59-Z Congress of Keys 1" -- remove prefix type 3 str = str:gsub("%w+%s%-%s", "") -- matches "III - The Secret Name 4" -- remove prefix type 4 str = str:gsub("%?+%s%-%s", "") -- matches "??? - Fatal Mirage" -- remove suffix (numbering) str = str:gsub("%s%d+", "") return str end end) return __bundle_require("__root")