Merge branch 'argonui:main' into nkosi

This commit is contained in:
dscarpac 2024-03-31 19:08:26 -05:00 committed by GitHub
commit 7c5c98f278
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 499 additions and 44 deletions

View File

@ -192,7 +192,8 @@
"Decoration-Ammo.b43845", "Decoration-Ammo.b43845",
"Decoration-Ammo.d35ee9", "Decoration-Ammo.d35ee9",
"VictoryDisplay.6ccd6d", "VictoryDisplay.6ccd6d",
"CampaignOverview.e03c01", "OfficialReleasesOverview.8e22bb",
"Fan-MadeExpansionOverview.de7cae",
"OptionPanelSource.830bd0", "OptionPanelSource.830bd0",
"SoundCube.3c988f", "SoundCube.3c988f",
"GameKeyHandler.fce69c", "GameKeyHandler.fce69c",

View File

@ -20,6 +20,11 @@
"RealityAcid.0a1b3a", "RealityAcid.0a1b3a",
"RealityAcidReference.858b0a", "RealityAcidReference.858b0a",
"Ravenous.558b0a", "Ravenous.558b0a",
"RexMurphyParallel.0a5492",
"RexMurphyParallelBack.0a5493",
"RexMurphyParallelFront.0a5494",
"SearchfortheTruth.4156dd",
"RexsCurse.033a36",
"CharlieKane.4deeff", "CharlieKane.4deeff",
"FinnEdwards.dd40c0", "FinnEdwards.dd40c0",
"MontereyJack.46b145", "MontereyJack.46b145",

View File

@ -0,0 +1,11 @@
{
"id": "02002-p",
"type": "Investigator",
"class": "Seeker",
"traits": "Reporter.",
"willpowerIcons": 3,
"intellectIcons": 4,
"combatIcons": 2,
"agilityIcons": 3,
"cycle": "Hunting for Answers"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14000,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"140": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243141810/67954474A3DC9311DA0628A864960FD14DD1C7D0/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243141984/62A87E727E9F6120771487CC69B71224623A018F/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Reporter",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/RexMurphyParallel.0a5492.gmnotes",
"GUID": "0a5492",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Rex Murphy (Parallel)",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 53.274,
"posY": 3.137,
"posZ": 22.081,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "02002-pb",
"type": "Investigator",
"class": "Seeker",
"traits": "Reporter.",
"willpowerIcons": 3,
"intellectIcons": 4,
"combatIcons": 2,
"agilityIcons": 3,
"cycle": "Hunting for Answers"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"141": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243141810/67954474A3DC9311DA0628A864960FD14DD1C7D0/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142219/EB53C43AB498B112B5EA2C488F0EB1543CD43DE5/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Reporter",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/RexMurphyParallelBack.0a5493.gmnotes",
"GUID": "0a5493",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Rex Murphy (Parallel Back)",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 53.274,
"posY": 3.137,
"posZ": 22.081,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "02002-pf",
"type": "Investigator",
"class": "Seeker",
"traits": "Reporter.",
"willpowerIcons": 3,
"intellectIcons": 4,
"combatIcons": 2,
"agilityIcons": 3,
"cycle": "Hunting for Answers"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"142": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142126/51E7BDBC4F3E68487E896E867200B6C9310ADF3D/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243141984/62A87E727E9F6120771487CC69B71224623A018F/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Reporter",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/RexMurphyParallelFront.0a5494.gmnotes",
"GUID": "0a5494",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Rex Murphy (Parallel Front)",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 53.274,
"posY": 3.137,
"posZ": 22.081,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -5,21 +5,21 @@
"z": 0 "z": 0
}, },
"Autoraise": true, "Autoraise": true,
"CardID": 55100, "CardID": 14300,
"ColorDiffuse": { "ColorDiffuse": {
"b": 0.71324, "b": 0.71324,
"g": 0.71324, "g": 0.71324,
"r": 0.71324 "r": 0.71324
}, },
"CustomDeck": { "CustomDeck": {
"551": { "143": {
"BackIsHidden": true, "BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2021607899142907490/4AAE686A793E66311FF78890309D20670A329D16/", "BackURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142126/51E7BDBC4F3E68487E896E867200B6C9310ADF3D/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2021607899142907034/013ED775CA50C6FC71731E4FBAEBF1ECA8C68F1E/", "FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142219/EB53C43AB498B112B5EA2C488F0EB1543CD43DE5/",
"NumHeight": 2, "NumHeight": 1,
"NumWidth": 2, "NumWidth": 1,
"Type": 0, "Type": 0,
"UniqueBack": true "UniqueBack": false
} }
}, },
"Description": "The Reporter", "Description": "The Reporter",
@ -36,7 +36,7 @@
"LuaScript": "", "LuaScript": "",
"LuaScriptState": "", "LuaScriptState": "",
"MeasureMovement": false, "MeasureMovement": false,
"Name": "Card", "Name": "CardCustom",
"Nickname": "Rex Murphy (Taboo)", "Nickname": "Rex Murphy (Taboo)",
"SidewaysCard": true, "SidewaysCard": true,
"Snap": true, "Snap": true,

View File

@ -0,0 +1,8 @@
{
"id": "90080",
"type": "Treachery",
"class": "Neutral",
"traits": "Curse.",
"weakness": true,
"cycle": "Hunting for Answers"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"145": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142499/838D53FA16318A3141B6F5875B11F6B87FA7C37F/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "Advanced",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/RexsCurse.033a36.gmnotes",
"GUID": "033a36",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "Rex's Curse",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.132,
"posY": 5.515,
"posZ": -16.723,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,10 @@
{
"id": "90079",
"type": "Event",
"class": "Neutral",
"cost": 1,
"traits": "Insight.",
"intellectIcons": 2,
"wildIcons": 1,
"cycle": "Hunting for Answers"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"144": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2414565357243142330/B4BB77B904CF3AFAF3181392C4849174F3D87D46/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "Advanced",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/SearchfortheTruth.4156dd.gmnotes",
"GUID": "4156dd",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Search for the Truth",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.099,
"posY": 3.726,
"posZ": -16.715,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,57 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 0
},
"ImageScalar": 1,
"ImageSecondaryURL": "http://cloud-3.steamusercontent.com/ugc/2460726979851342612/65DEC18BEFEFB1117CFEAAE9AB15B442AE8B557B/",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2460726979851342006/859CF14CE18A4F8C2AFDADA3E69E1B6864154696/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "de7cae",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Fan-Made Expansion Overview",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -1.6,
"posY": 1.481,
"posZ": -75,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 13,
"scaleY": 1,
"scaleZ": 13
},
"Value": 0,
"XmlUI": ""
}

View File

@ -18,33 +18,33 @@
"Type": 0 "Type": 0
}, },
"ImageScalar": 1, "ImageScalar": 1,
"ImageSecondaryURL": "http://cloud-3.steamusercontent.com/ugc/2037357232933163412/1D2EE3BD0758463D8F6EB0DA30C59A21694BB1A4/", "ImageSecondaryURL": "http://cloud-3.steamusercontent.com/ugc/2460726979851338290/FD3A124A45AFAACAB85E34060B09B52FE798E991/",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2037357232933163412/1D2EE3BD0758463D8F6EB0DA30C59A21694BB1A4/", "ImageURL": "http://cloud-3.steamusercontent.com/ugc/2460726979851337461/C6A08EA4A71B37F9C27E2545037F557D65BBF521/",
"WidthScale": 0 "WidthScale": 0
}, },
"Description": "", "Description": "",
"DragSelectable": true, "DragSelectable": true,
"GMNotes": "", "GMNotes": "",
"GUID": "e03c01", "GUID": "8e22bb",
"Grid": true, "Grid": true,
"GridProjection": false, "GridProjection": false,
"Hands": false, "Hands": false,
"HideWhenFaceDown": false, "HideWhenFaceDown": false,
"IgnoreFoW": false, "IgnoreFoW": false,
"LayoutGroupSortIndex": 0, "LayoutGroupSortIndex": 0,
"Locked": true, "Locked": false,
"LuaScript": "", "LuaScript": "",
"LuaScriptState": "", "LuaScriptState": "",
"MeasureMovement": false, "MeasureMovement": false,
"Name": "Custom_Tile", "Name": "Custom_Tile",
"Nickname": "Campaign Overview", "Nickname": "Official Releases Overview",
"Snap": true, "Snap": true,
"Sticky": true, "Sticky": true,
"Tooltip": true, "Tooltip": true,
"Transform": { "Transform": {
"posX": -1.6, "posX": -1.6,
"posY": 1.481, "posY": 1.481,
"posZ": -58.5, "posZ": -55,
"rotX": 0, "rotX": 0,
"rotY": 270, "rotY": 270,
"rotZ": 0, "rotZ": 0,

View File

@ -1,7 +1,7 @@
--[[ Cleans up the table for the next scenario in a campaign: -- Cleans up the table for the next scenario in a campaign:
- sets counters to default values (resources and doom) or trauma values (health and sanity, if not disabled) from campaign log -- sets counters to default values (resources and doom) or trauma values (health and sanity, if not disabled) from campaign log
- puts everything on playmats and hands into respective trashcans -- puts everything on playmats and hands into respective trashcans
- use the IGNORE_TAG to exclude objects from tidying (default: "CleanUpHelper_Ignore")]] -- use the IGNORE_TAG to exclude objects from tidying (default: "CleanUpHelper_Ignore")
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi") local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
local chaosBagApi = require("chaosbag/ChaosBagApi") local chaosBagApi = require("chaosbag/ChaosBagApi")
@ -30,7 +30,6 @@ options["removeDrawnLines"] = false
local buttonParameters = {} local buttonParameters = {}
buttonParameters.function_owner = self buttonParameters.function_owner = self
--------------------------------------------------------- ---------------------------------------------------------
-- option loading and GUI setup -- option loading and GUI setup
--------------------------------------------------------- ---------------------------------------------------------
@ -114,7 +113,7 @@ function cleanUp(_, color)
ignoreCustomDataHelper() ignoreCustomDataHelper()
getTrauma() getTrauma()
-- delay to account for potential state change -- delay to account for potential state change of campaign log
Wait.time(updateCounters, 0.2) Wait.time(updateCounters, 0.2)
resetDoomCounter() resetDoomCounter()
@ -279,7 +278,7 @@ function tidyPlayerMatCoroutine()
-- get respective trash -- get respective trash
local trash = guidReferenceApi.getObjectByOwnerAndType(COLORS[i], "Trash") local trash = guidReferenceApi.getObjectByOwnerAndType(COLORS[i], "Trash")
if trash == nil then if trash == nil then
printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found!", "Red") printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found! Skipping this playermat.", "Yellow")
goto continue goto continue
end end
@ -301,23 +300,36 @@ function tidyPlayerMatCoroutine()
coroutine.yield(0) coroutine.yield(0)
trash.putObject(obj) trash.putObject(obj)
-- flip action tokens back to ready -- action token handling
elseif obj.getDescription() == "Action Token" and obj.is_face_down then elseif obj.getDescription() == "Action Token" then
obj.flip() -- move the small action token to the proper position
end if obj.getScale().x < 0.4 then
local pos = playmatApi.transformLocalPosition(Vector(-0.865, 0.1, -0.28), COLORS[i])
obj.setPosition(pos)
end end
-- reset "activeInvestigatorId" -- flip action tokens back to ready
if i < 5 then if obj.is_face_down then
local playermat = guidReferenceApi.getObjectByOwnerAndType(COLORS[i], "Playermat") obj.flip()
if playermat then end
playermat.setVar("activeInvestigatorId", "00000")
-- reset action token state
local stateId = obj.getStateId()
if stateId ~= -1 and stateId ~= 6 then
obj.setState(6)
end
end end
end end
end end
::continue:: ::continue::
end end
-- reset "activeInvestigatorId"
local playerMats = guidReferenceApi.getObjectsByType("Playermat")
for _, mat in pairs(playerMats) do
mat.setVar("activeInvestigatorId", "00000")
end
-- reset spawned data -- reset spawned data
tokenSpawnTrackerApi.resetAll() tokenSpawnTrackerApi.resetAll()
local datahelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") local datahelper = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper")

View File

@ -280,24 +280,30 @@ end
-- takes a clue from a location, player needs to hover the clue directly or the location -- takes a clue from a location, player needs to hover the clue directly or the location
function takeClueFromLocation(playerColor, hoveredObject) function takeClueFromLocation(playerColor, hoveredObject)
-- use different color for messages if player is not seated (because this hotkey is called for a different mat)
local messageColor = playerColor
if not Player[playerColor] or not Player[playerColor].seated then
messageColor = getFirstSeatedPlayer()
end
local cardName, clue local cardName, clue
if hoveredObject == nil then if hoveredObject == nil then
broadcastToColor("Hover a clue or card with clues and try again.", playerColor, "Yellow") broadcastToColor("Hover a clue or card with clues and try again.", messageColor, "Yellow")
return return
elseif hoveredObject.type == "Card" then elseif hoveredObject.type == "Card" then
cardName = hoveredObject.getName() cardName = hoveredObject.getName()
local searchResult = searchLib.onObject(hoveredObject, "isClue") local searchResult = searchLib.onObject(hoveredObject, "isClue")
if #searchResult == 0 then if #searchResult == 0 then
broadcastToColor("This card does not have any clues on it.", playerColor, "Yellow") broadcastToColor("This card does not have any clues on it.", messageColor, "Yellow")
return return
else else
clue = searchResult[1] clue = searchResult[1]
end end
elseif hoveredObject.memo == "clueDoom" then elseif hoveredObject.memo == "clueDoom" then
if hoveredObject.is_face_down then if hoveredObject.is_face_down then
broadcastToColor("This is a doom token and not a clue.", playerColor, "Yellow") broadcastToColor("This is a doom token and not a clue.", messageColor, "Yellow")
return return
end end
@ -311,14 +317,22 @@ function takeClueFromLocation(playerColor, hoveredObject)
clue = hoveredObject.takeObject() clue = hoveredObject.takeObject()
cardName = "token pool" cardName = "token pool"
else else
broadcastToColor("Hover a clue or card with clues and try again.", playerColor, "Yellow") broadcastToColor("Hover a clue or card with clues and try again.", messageColor, "Yellow")
return return
end end
local clickableClues = optionPanelApi.getOptions()["useClueClickers"] local clickableClues = optionPanelApi.getOptions()["useClueClickers"]
local playerName = Player[playerColor].steam_name
local matColor = playmatApi.getMatColor(playerColor) -- handling for calling this for a specific mat via hotkey
local pos = nil local playerName, matColor, pos
if Player[playerColor] and Player[playerColor].seated then
playerName = Player[playerColor].steam_name
matColor = playmatApi.getMatColor(playerColor)
else
playerName = playerColor
matColor = playerColor
end
if clickableClues then if clickableClues then
pos = {x = 0.49, y = 2.66, z = 0.00} pos = {x = 0.49, y = 2.66, z = 0.00}
playmatApi.updateCounter(matColor, "ClickableClueCounter", _, 1) playmatApi.updateCounter(matColor, "ClickableClueCounter", _, 1)
@ -371,3 +385,10 @@ function titleCase(str)
local rest = str:sub(2) local rest = str:sub(2)
return first:upper() .. rest:lower() return first:upper() .. rest:lower()
end end
-- returns the color of the first seated player
function getFirstSeatedPlayer()
for _, color in ipairs(getSeatedPlayers()) do
return color
end
end

View File

@ -255,9 +255,9 @@ INVESTIGATORS["Zoey Samaras"] = {
starterDeck = "2624950" starterDeck = "2624950"
} }
INVESTIGATORS["Rex Murphy"] = { INVESTIGATORS["Rex Murphy"] = {
cards = { "02002", "02002-t" }, cards = { "02002", "02002-t", "02002-p", "02002-pf", "02002-pb" },
minicards = { "02002-m" }, minicards = { "02002-m" },
signatures = { "02008", "02009" }, signatures = { "02008", "02009", "90079", "90080" },
starterDeck = "2624958" starterDeck = "2624958"
} }
INVESTIGATORS["Jenny Barnes"] = { INVESTIGATORS["Jenny Barnes"] = {