ah_sce_unpacked/unpacked/Custom_Token Playmat Image ...

1446 lines
56 KiB
Plaintext

-- 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")