Merge branch 'main' into playermat-xml
This commit is contained in:
commit
e2d31038f7
@ -138,7 +138,7 @@
|
|||||||
"Playermat3Green.383d8b",
|
"Playermat3Green.383d8b",
|
||||||
"Playermat4Red.0840d5",
|
"Playermat4Red.0840d5",
|
||||||
"LeadInvestigator.acaa93",
|
"LeadInvestigator.acaa93",
|
||||||
"ArkhamDBDeckImporter.a28140",
|
"DeckImporter.a28140",
|
||||||
"Configuration.03804b",
|
"Configuration.03804b",
|
||||||
"DrawingTool.280086",
|
"DrawingTool.280086",
|
||||||
"PlayAreaImageSwapper.b7b45b",
|
"PlayAreaImageSwapper.b7b45b",
|
||||||
@ -229,7 +229,7 @@
|
|||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
],
|
],
|
||||||
"SaveName": "Arkham SCE - 3.9.0",
|
"SaveName": "Arkham SCE - 3.9.1",
|
||||||
"Sky": "Sky_Museum",
|
"Sky": "Sky_Museum",
|
||||||
"SkyURL": "https://i.imgur.com/GkQqaOF.jpg",
|
"SkyURL": "https://i.imgur.com/GkQqaOF.jpg",
|
||||||
"SnapPoints_path": "SnapPoints.json",
|
"SnapPoints_path": "SnapPoints.json",
|
||||||
|
@ -401,6 +401,7 @@
|
|||||||
"WarningShot.ec38db",
|
"WarningShot.ec38db",
|
||||||
"TheHomeFront.b80459",
|
"TheHomeFront.b80459",
|
||||||
"JennysTwin45s.d87128",
|
"JennysTwin45s.d87128",
|
||||||
|
"JennysTwin45s.d87129",
|
||||||
"TokenofFaith.2ea0d0",
|
"TokenofFaith.2ea0d0",
|
||||||
"MistsofRlyeh.5558f1",
|
"MistsofRlyeh.5558f1",
|
||||||
"Shortcut.d4fd4a",
|
"Shortcut.d4fd4a",
|
||||||
@ -569,6 +570,7 @@
|
|||||||
"TennesseeSourMash3.b5e5f1",
|
"TennesseeSourMash3.b5e5f1",
|
||||||
"TheBellTolls.6cbc01",
|
"TheBellTolls.6cbc01",
|
||||||
"SearchingforIzzie.426d28",
|
"SearchingforIzzie.426d28",
|
||||||
|
"SearchingforIzzie.426d29",
|
||||||
"StunningBlow.58c435",
|
"StunningBlow.58c435",
|
||||||
"SharpVision1.4d9a97",
|
"SharpVision1.4d9a97",
|
||||||
"Letmehandlethis.36c0cb",
|
"Letmehandlethis.36c0cb",
|
||||||
@ -1524,6 +1526,9 @@
|
|||||||
"NormanWithers.a5d9bb",
|
"NormanWithers.a5d9bb",
|
||||||
"NormanWithers.e0a155",
|
"NormanWithers.e0a155",
|
||||||
"JennyBarnes.9058d3",
|
"JennyBarnes.9058d3",
|
||||||
|
"JennyBarnesParallel.9058d4",
|
||||||
|
"JennyBarnesParallelBack.9058d5",
|
||||||
|
"JennyBarnesParallelFront.9058d6",
|
||||||
"CarolynFern.b03b12",
|
"CarolynFern.b03b12",
|
||||||
"DexterDrake.e015f8",
|
"DexterDrake.e015f8",
|
||||||
"SilasMarsh.3f92cf",
|
"SilasMarsh.3f92cf",
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
"traits": "Pact.",
|
"traits": "Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"cycle": "The Forgotten Age"
|
"cycle": "The Forgotten Age"
|
||||||
}
|
}
|
||||||
|
@ -5,5 +5,6 @@
|
|||||||
"traits": "Curse.",
|
"traits": "Curse.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"cycle": "The Forgotten Age"
|
"cycle": "The Forgotten Age"
|
||||||
}
|
}
|
||||||
|
@ -5,5 +5,6 @@
|
|||||||
"traits": "Monster. Geist.",
|
"traits": "Monster. Geist.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"classRestriction": "Mystic",
|
||||||
"cycle": "The Scarlet Keys"
|
"cycle": "The Scarlet Keys"
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"id": "02003-p",
|
||||||
|
"type": "Investigator",
|
||||||
|
"class": "Rogue",
|
||||||
|
"traits": "Drifter. Socialite.",
|
||||||
|
"willpowerIcons": 3,
|
||||||
|
"intellectIcons": 3,
|
||||||
|
"combatIcons": 3,
|
||||||
|
"agilityIcons": 3,
|
||||||
|
"cycle": "Pistols and Pearls",
|
||||||
|
"extraToken": "Reaction"
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"AltLookAngle": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"Autoraise": true,
|
||||||
|
"CardID": 15000,
|
||||||
|
"ColorDiffuse": {
|
||||||
|
"b": 0.71324,
|
||||||
|
"g": 0.71324,
|
||||||
|
"r": 0.71324
|
||||||
|
},
|
||||||
|
"CustomDeck": {
|
||||||
|
"150": {
|
||||||
|
"BackIsHidden": true,
|
||||||
|
"BackURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803235/A5A41E0B1229028C82F0451ED9DA1A97D11030C6/",
|
||||||
|
"FaceURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803373/86292022002FE355597BCB4D81D3692AEFA1207D/",
|
||||||
|
"NumHeight": 1,
|
||||||
|
"NumWidth": 1,
|
||||||
|
"Type": 0,
|
||||||
|
"UniqueBack": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Description": "The Dilettante",
|
||||||
|
"DragSelectable": true,
|
||||||
|
"GMNotes_path": "AllPlayerCards.15bb07/JennyBarnesParallel.9058d4.gmnotes",
|
||||||
|
"GUID": "9058d4",
|
||||||
|
"Grid": true,
|
||||||
|
"GridProjection": false,
|
||||||
|
"Hands": true,
|
||||||
|
"HideWhenFaceDown": false,
|
||||||
|
"IgnoreFoW": false,
|
||||||
|
"LayoutGroupSortIndex": 0,
|
||||||
|
"Locked": false,
|
||||||
|
"LuaScript": "",
|
||||||
|
"LuaScriptState": "",
|
||||||
|
"MeasureMovement": false,
|
||||||
|
"Name": "CardCustom",
|
||||||
|
"Nickname": "Jenny Barnes (Parallel)",
|
||||||
|
"SidewaysCard": true,
|
||||||
|
"Snap": true,
|
||||||
|
"Sticky": true,
|
||||||
|
"Tags": [
|
||||||
|
"Investigator",
|
||||||
|
"PlayerCard"
|
||||||
|
],
|
||||||
|
"Tooltip": true,
|
||||||
|
"Transform": {
|
||||||
|
"posX": 26.925,
|
||||||
|
"posY": 3.688,
|
||||||
|
"posZ": -2.775,
|
||||||
|
"rotX": 0,
|
||||||
|
"rotY": 270,
|
||||||
|
"rotZ": 0,
|
||||||
|
"scaleX": 1.15,
|
||||||
|
"scaleY": 1,
|
||||||
|
"scaleZ": 1.15
|
||||||
|
},
|
||||||
|
"Value": 0,
|
||||||
|
"XmlUI": ""
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"id": "02003-pb",
|
||||||
|
"type": "Investigator",
|
||||||
|
"class": "Rogue",
|
||||||
|
"traits": "Drifter.",
|
||||||
|
"willpowerIcons": 3,
|
||||||
|
"intellectIcons": 3,
|
||||||
|
"combatIcons": 3,
|
||||||
|
"agilityIcons": 3,
|
||||||
|
"cycle": "Pistols and Pearls",
|
||||||
|
"extraToken": "None"
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"AltLookAngle": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"Autoraise": true,
|
||||||
|
"CardID": 15100,
|
||||||
|
"ColorDiffuse": {
|
||||||
|
"b": 0.71324,
|
||||||
|
"g": 0.71324,
|
||||||
|
"r": 0.71324
|
||||||
|
},
|
||||||
|
"CustomDeck": {
|
||||||
|
"151": {
|
||||||
|
"BackIsHidden": true,
|
||||||
|
"BackURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803235/A5A41E0B1229028C82F0451ED9DA1A97D11030C6/",
|
||||||
|
"FaceURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803104/B281F0E5830527F2B8C733BE48C7D9FB7465965E/",
|
||||||
|
"NumHeight": 1,
|
||||||
|
"NumWidth": 1,
|
||||||
|
"Type": 0,
|
||||||
|
"UniqueBack": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Description": "The Dilettante",
|
||||||
|
"DragSelectable": true,
|
||||||
|
"GMNotes_path": "AllPlayerCards.15bb07/JennyBarnesParallelBack.9058d5.gmnotes",
|
||||||
|
"GUID": "9058d5",
|
||||||
|
"Grid": true,
|
||||||
|
"GridProjection": false,
|
||||||
|
"Hands": true,
|
||||||
|
"HideWhenFaceDown": false,
|
||||||
|
"IgnoreFoW": false,
|
||||||
|
"LayoutGroupSortIndex": 0,
|
||||||
|
"Locked": false,
|
||||||
|
"LuaScript": "",
|
||||||
|
"LuaScriptState": "",
|
||||||
|
"MeasureMovement": false,
|
||||||
|
"Name": "CardCustom",
|
||||||
|
"Nickname": "Jenny Barnes (Parallel Back)",
|
||||||
|
"SidewaysCard": true,
|
||||||
|
"Snap": true,
|
||||||
|
"Sticky": true,
|
||||||
|
"Tags": [
|
||||||
|
"Investigator",
|
||||||
|
"PlayerCard"
|
||||||
|
],
|
||||||
|
"Tooltip": true,
|
||||||
|
"Transform": {
|
||||||
|
"posX": 26.925,
|
||||||
|
"posY": 3.688,
|
||||||
|
"posZ": -2.775,
|
||||||
|
"rotX": 0,
|
||||||
|
"rotY": 270,
|
||||||
|
"rotZ": 0,
|
||||||
|
"scaleX": 1.15,
|
||||||
|
"scaleY": 1,
|
||||||
|
"scaleZ": 1.15
|
||||||
|
},
|
||||||
|
"Value": 0,
|
||||||
|
"XmlUI": ""
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"id": "02003-pf",
|
||||||
|
"type": "Investigator",
|
||||||
|
"class": "Rogue",
|
||||||
|
"traits": "Drifter. Socialite.",
|
||||||
|
"willpowerIcons": 3,
|
||||||
|
"intellectIcons": 3,
|
||||||
|
"combatIcons": 3,
|
||||||
|
"agilityIcons": 3,
|
||||||
|
"cycle": "Pistols and Pearls",
|
||||||
|
"extraToken": "Reaction"
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"AltLookAngle": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"Autoraise": true,
|
||||||
|
"CardID": 15200,
|
||||||
|
"ColorDiffuse": {
|
||||||
|
"b": 0.71324,
|
||||||
|
"g": 0.71324,
|
||||||
|
"r": 0.71324
|
||||||
|
},
|
||||||
|
"CustomDeck": {
|
||||||
|
"152": {
|
||||||
|
"BackIsHidden": true,
|
||||||
|
"BackURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691802940/2292AE6457CB938D1656262EAAF92C780BE8741C/",
|
||||||
|
"FaceURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803373/86292022002FE355597BCB4D81D3692AEFA1207D/",
|
||||||
|
"NumHeight": 1,
|
||||||
|
"NumWidth": 1,
|
||||||
|
"Type": 0,
|
||||||
|
"UniqueBack": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Description": "The Dilettante",
|
||||||
|
"DragSelectable": true,
|
||||||
|
"GMNotes_path": "AllPlayerCards.15bb07/JennyBarnesParallelFront.9058d6.gmnotes",
|
||||||
|
"GUID": "9058d6",
|
||||||
|
"Grid": true,
|
||||||
|
"GridProjection": false,
|
||||||
|
"Hands": true,
|
||||||
|
"HideWhenFaceDown": false,
|
||||||
|
"IgnoreFoW": false,
|
||||||
|
"LayoutGroupSortIndex": 0,
|
||||||
|
"Locked": false,
|
||||||
|
"LuaScript": "",
|
||||||
|
"LuaScriptState": "",
|
||||||
|
"MeasureMovement": false,
|
||||||
|
"Name": "CardCustom",
|
||||||
|
"Nickname": "Jenny Barnes (Parallel Front)",
|
||||||
|
"SidewaysCard": true,
|
||||||
|
"Snap": true,
|
||||||
|
"Sticky": true,
|
||||||
|
"Tags": [
|
||||||
|
"Investigator",
|
||||||
|
"PlayerCard"
|
||||||
|
],
|
||||||
|
"Tooltip": true,
|
||||||
|
"Transform": {
|
||||||
|
"posX": 26.925,
|
||||||
|
"posY": 3.688,
|
||||||
|
"posZ": -2.775,
|
||||||
|
"rotX": 0,
|
||||||
|
"rotY": 270,
|
||||||
|
"rotZ": 0,
|
||||||
|
"scaleX": 1.15,
|
||||||
|
"scaleY": 1,
|
||||||
|
"scaleZ": 1.15
|
||||||
|
},
|
||||||
|
"Value": 0,
|
||||||
|
"XmlUI": ""
|
||||||
|
}
|
@ -6,5 +6,12 @@
|
|||||||
"traits": "Item. Weapon. Firearm.",
|
"traits": "Item. Weapon. Firearm.",
|
||||||
"agilityIcons": 2,
|
"agilityIcons": 2,
|
||||||
"wildIcons": 1,
|
"wildIcons": 1,
|
||||||
|
"uses": [
|
||||||
|
{
|
||||||
|
"count": 0,
|
||||||
|
"type": "Ammo",
|
||||||
|
"token": "resource"
|
||||||
|
}
|
||||||
|
],
|
||||||
"cycle": "The Dunwich Legacy"
|
"cycle": "The Dunwich Legacy"
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
"UniqueBack": false
|
"UniqueBack": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Description": "",
|
"Description": "A Perfect Fit",
|
||||||
"DragSelectable": true,
|
"DragSelectable": true,
|
||||||
"GMNotes_path": "AllPlayerCards.15bb07/JennysTwin45s.d87128.gmnotes",
|
"GMNotes_path": "AllPlayerCards.15bb07/JennysTwin45s.d87128.gmnotes",
|
||||||
"GUID": "d87128",
|
"GUID": "d87128",
|
||||||
|
17
objects/AllPlayerCards.15bb07/JennysTwin45s.d87129.gmnotes
Normal file
17
objects/AllPlayerCards.15bb07/JennysTwin45s.d87129.gmnotes
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"id": "90085",
|
||||||
|
"type": "Asset",
|
||||||
|
"slot": "Hand x2",
|
||||||
|
"class": "Neutral",
|
||||||
|
"traits": "Item. Weapon. Firearm.",
|
||||||
|
"agilityIcons": 1,
|
||||||
|
"wildIcons": 2,
|
||||||
|
"uses": [
|
||||||
|
{
|
||||||
|
"count": 0,
|
||||||
|
"type": "Ammo",
|
||||||
|
"token": "resource"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"cycle": "Pistols and Pearls"
|
||||||
|
}
|
62
objects/AllPlayerCards.15bb07/JennysTwin45s.d87129.json
Normal file
62
objects/AllPlayerCards.15bb07/JennysTwin45s.d87129.json
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"AltLookAngle": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"Autoraise": true,
|
||||||
|
"CardID": 15300,
|
||||||
|
"ColorDiffuse": {
|
||||||
|
"b": 0.71324,
|
||||||
|
"g": 0.71324,
|
||||||
|
"r": 0.71324
|
||||||
|
},
|
||||||
|
"CustomDeck": {
|
||||||
|
"153": {
|
||||||
|
"BackIsHidden": true,
|
||||||
|
"BackURL": "https://steamusercontent-a.akamaihd.net/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/",
|
||||||
|
"FaceURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803450/5C647BCF9EBE08572D746C439A543A18C4BE2DD9/",
|
||||||
|
"NumHeight": 1,
|
||||||
|
"NumWidth": 1,
|
||||||
|
"Type": 0,
|
||||||
|
"UniqueBack": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Description": "A Perfect Fit (Advanced)",
|
||||||
|
"DragSelectable": true,
|
||||||
|
"GMNotes_path": "AllPlayerCards.15bb07/JennysTwin45s.d87129.gmnotes",
|
||||||
|
"GUID": "d87129",
|
||||||
|
"Grid": true,
|
||||||
|
"GridProjection": false,
|
||||||
|
"Hands": true,
|
||||||
|
"HideWhenFaceDown": true,
|
||||||
|
"IgnoreFoW": false,
|
||||||
|
"LayoutGroupSortIndex": 0,
|
||||||
|
"Locked": false,
|
||||||
|
"LuaScript": "",
|
||||||
|
"LuaScriptState": "",
|
||||||
|
"MeasureMovement": false,
|
||||||
|
"Name": "CardCustom",
|
||||||
|
"Nickname": "Jenny's Twin .45s",
|
||||||
|
"SidewaysCard": false,
|
||||||
|
"Snap": true,
|
||||||
|
"Sticky": true,
|
||||||
|
"Tags": [
|
||||||
|
"Asset",
|
||||||
|
"PlayerCard"
|
||||||
|
],
|
||||||
|
"Tooltip": true,
|
||||||
|
"Transform": {
|
||||||
|
"posX": 9.005,
|
||||||
|
"posY": 3.859,
|
||||||
|
"posZ": -16.695,
|
||||||
|
"rotX": 1,
|
||||||
|
"rotY": 270,
|
||||||
|
"rotZ": 0,
|
||||||
|
"scaleX": 1,
|
||||||
|
"scaleY": 1,
|
||||||
|
"scaleZ": 1
|
||||||
|
},
|
||||||
|
"Value": 0,
|
||||||
|
"XmlUI": ""
|
||||||
|
}
|
@ -5,5 +5,6 @@
|
|||||||
"traits": "Monster. Shoggoth.",
|
"traits": "Monster. Shoggoth.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"classRestriction": "Guardian",
|
||||||
"cycle": "The Scarlet Keys"
|
"cycle": "The Scarlet Keys"
|
||||||
}
|
}
|
||||||
|
@ -5,5 +5,6 @@
|
|||||||
"traits": "Pact.",
|
"traits": "Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"cycle": "Return to the Forgotten Age"
|
"cycle": "Return to the Forgotten Age"
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
"traits": "Pact.",
|
"traits": "Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"classRestriction": "Rogue",
|
||||||
"cycle": "The Scarlet Keys"
|
"cycle": "The Scarlet Keys"
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
"traits": "Paradox.",
|
"traits": "Paradox.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"classRestriction": "Seeker",
|
||||||
"cycle": "The Scarlet Keys"
|
"cycle": "The Scarlet Keys"
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"id": "90086",
|
||||||
|
"type": "Treachery",
|
||||||
|
"class": "Neutral",
|
||||||
|
"traits": "Task.",
|
||||||
|
"weakness": true,
|
||||||
|
"cycle": "Pistols and Pearls"
|
||||||
|
}
|
61
objects/AllPlayerCards.15bb07/SearchingforIzzie.426d29.json
Normal file
61
objects/AllPlayerCards.15bb07/SearchingforIzzie.426d29.json
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"AltLookAngle": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"Autoraise": true,
|
||||||
|
"CardID": 15400,
|
||||||
|
"ColorDiffuse": {
|
||||||
|
"b": 0.71324,
|
||||||
|
"g": 0.71324,
|
||||||
|
"r": 0.71324
|
||||||
|
},
|
||||||
|
"CustomDeck": {
|
||||||
|
"154": {
|
||||||
|
"BackIsHidden": true,
|
||||||
|
"BackURL": "https://steamusercontent-a.akamaihd.net/ugc/2342503777940352139/A2D42E7E5C43D045D72CE5CFC907E4F886C8C690/",
|
||||||
|
"FaceURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691803586/22C0433DD0E36AF34DA9A08F93EC43A00F0E2EBE/",
|
||||||
|
"NumHeight": 1,
|
||||||
|
"NumWidth": 1,
|
||||||
|
"Type": 0,
|
||||||
|
"UniqueBack": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Description": "Advanced",
|
||||||
|
"DragSelectable": true,
|
||||||
|
"GMNotes_path": "AllPlayerCards.15bb07/SearchingforIzzie.426d29.gmnotes",
|
||||||
|
"GUID": "426d29",
|
||||||
|
"Grid": true,
|
||||||
|
"GridProjection": false,
|
||||||
|
"Hands": true,
|
||||||
|
"HideWhenFaceDown": true,
|
||||||
|
"IgnoreFoW": false,
|
||||||
|
"LayoutGroupSortIndex": 0,
|
||||||
|
"Locked": false,
|
||||||
|
"LuaScript": "",
|
||||||
|
"LuaScriptState": "",
|
||||||
|
"MeasureMovement": false,
|
||||||
|
"Name": "CardCustom",
|
||||||
|
"Nickname": "Searching for Izzie",
|
||||||
|
"SidewaysCard": false,
|
||||||
|
"Snap": true,
|
||||||
|
"Sticky": true,
|
||||||
|
"Tags": [
|
||||||
|
"PlayerCard"
|
||||||
|
],
|
||||||
|
"Tooltip": true,
|
||||||
|
"Transform": {
|
||||||
|
"posX": 9.074,
|
||||||
|
"posY": 3.685,
|
||||||
|
"posZ": -16.71,
|
||||||
|
"rotX": 0,
|
||||||
|
"rotY": 270,
|
||||||
|
"rotZ": 0,
|
||||||
|
"scaleX": 1,
|
||||||
|
"scaleY": 1,
|
||||||
|
"scaleZ": 1
|
||||||
|
},
|
||||||
|
"Value": 0,
|
||||||
|
"XmlUI": ""
|
||||||
|
}
|
@ -6,5 +6,6 @@
|
|||||||
"traits": "Blunder.",
|
"traits": "Blunder.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"classRestriction": "Survivor",
|
||||||
"cycle": "The Scarlet Keys"
|
"cycle": "The Scarlet Keys"
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
"traits": "Madness. Pact.",
|
"traits": "Madness. Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"hidden": true,
|
"hidden": true,
|
||||||
"cycle": "Return to the Path to Carcosa"
|
"cycle": "Return to the Path to Carcosa"
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
"traits": "Madness. Pact.",
|
"traits": "Madness. Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"hidden": true,
|
"hidden": true,
|
||||||
"cycle": "Return to the Path to Carcosa"
|
"cycle": "Return to the Path to Carcosa"
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
"traits": "Madness. Pact.",
|
"traits": "Madness. Pact.",
|
||||||
"weakness": true,
|
"weakness": true,
|
||||||
"basicWeaknessCount": 1,
|
"basicWeaknessCount": 1,
|
||||||
|
"modeRestriction": "Campaign",
|
||||||
"hidden": true,
|
"hidden": true,
|
||||||
"cycle": "Return to the Path to Carcosa"
|
"cycle": "Return to the Path to Carcosa"
|
||||||
}
|
}
|
||||||
|
@ -1 +0,0 @@
|
|||||||
{"greenDeck":"","investigators":true,"loadNewest":true,"orangeDeck":"","privateDeck":true,"redDeck":"","whiteDeck":""}
|
|
@ -1 +1,95 @@
|
|||||||
{"ml":{"0d6da1":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-28.014},"rot":{"x":0,"y":270.0014,"z":0}},"451eaa":{"lock":false,"pos":{"x":12.252,"y":1.4815,"z":11.986},"rot":{"x":0,"y":269.9999,"z":0}},"5302f2":{"lock":false,"pos":{"x":12.2505,"y":1.4815,"z":-20.0137},"rot":{"x":0,"y":270.0014,"z":0}},"72ab92":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":19.986},"rot":{"x":0,"y":269.9999,"z":0}},"9e73fa":{"lock":false,"pos":{"x":12.2501,"y":1.4815,"z":-12.0137},"rot":{"x":0,"y":269.9998,"z":0}},"cc7eb3":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":3.986},"rot":{"x":0,"y":269.9999,"z":0}},"e2dd57":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-4.014},"rot":{"x":0,"y":270,"z":0}}}}
|
{
|
||||||
|
"ml": {
|
||||||
|
"0d6da1": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -28.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0014,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"451eaa": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.252,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 11.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9999,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5302f2": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.2505,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -20.0137
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0014,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"72ab92": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 19.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9999,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9e73fa": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.2501,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -12.0137
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9998,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cc7eb3": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 3.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9999,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"e2dd57": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -4.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
},
|
},
|
||||||
"ImageScalar": 1,
|
"ImageScalar": 1,
|
||||||
"ImageSecondaryURL": "",
|
"ImageSecondaryURL": "",
|
||||||
"ImageURL": "https://i.imgur.com/wDp1Woo.jpg",
|
"ImageURL": "https://steamusercontent-a.akamaihd.net/ugc/2466368617691603054/ABA4AB3A811107629323CDA2765871EB36626242/",
|
||||||
"WidthScale": 0
|
"WidthScale": 0
|
||||||
},
|
},
|
||||||
"Description": "",
|
"Description": "",
|
||||||
@ -34,10 +34,10 @@
|
|||||||
"LayoutGroupSortIndex": 0,
|
"LayoutGroupSortIndex": 0,
|
||||||
"Locked": true,
|
"Locked": true,
|
||||||
"LuaScript": "require(\"arkhamdb/DeckImporter\")",
|
"LuaScript": "require(\"arkhamdb/DeckImporter\")",
|
||||||
"LuaScriptState_path": "ArkhamDBDeckImporter.a28140.luascriptstate",
|
"LuaScriptState_path": "DeckImporter.a28140.luascriptstate",
|
||||||
"MeasureMovement": false,
|
"MeasureMovement": false,
|
||||||
"Name": "Custom_Tile",
|
"Name": "Custom_Tile",
|
||||||
"Nickname": "ArkhamDB Deck Importer",
|
"Nickname": "Deck Importer",
|
||||||
"Snap": false,
|
"Snap": false,
|
||||||
"Sticky": true,
|
"Sticky": true,
|
||||||
"Tooltip": false,
|
"Tooltip": false,
|
9
objects/DeckImporter.a28140.luascriptstate
Normal file
9
objects/DeckImporter.a28140.luascriptstate
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"greenDeck": "",
|
||||||
|
"loadNewest": true,
|
||||||
|
"orangeDeck": "",
|
||||||
|
"privateDeck": true,
|
||||||
|
"redDeck": "",
|
||||||
|
"standalone": false,
|
||||||
|
"whiteDeck": ""
|
||||||
|
}
|
@ -1 +1,20 @@
|
|||||||
{"cd":{"move":false,"scale":false},"tid":[{"name":"Felt - Grey","url":"https://i.imgur.com/N0O6aqj.jpg"},{"name":"Wood","url":"https://i.imgur.com/iOFFsGh.jpg"},{"name":"Wood 2","url":"https://i.imgur.com/SQ2t01d.jpg"}]}
|
{
|
||||||
|
"cd": {
|
||||||
|
"move": false,
|
||||||
|
"scale": false
|
||||||
|
},
|
||||||
|
"tid": [
|
||||||
|
{
|
||||||
|
"name": "Felt - Grey",
|
||||||
|
"url": "https://i.imgur.com/N0O6aqj.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Wood",
|
||||||
|
"url": "https://i.imgur.com/iOFFsGh.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Wood 2",
|
||||||
|
"url": "https://i.imgur.com/SQ2t01d.jpg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -1 +1,29 @@
|
|||||||
{"acknowledgedUpgradeVersions":[],"chaosTokensGUID":[],"optionPanel":{"cardLanguage":"en","changePlayAreaImage":false,"enableCardHelpers":true,"playAreaConnectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"playAreaConnections":true,"playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":false,"showSearchAssistant":false,"showTitleSplash":true,"useClassTexture":true,"useClueClickers":false,"useResourceCounters":"disabled","useSnapTags":true}}
|
{
|
||||||
|
"acknowledgedUpgradeVersions": [],
|
||||||
|
"chaosTokensGUID": [],
|
||||||
|
"optionPanel": {
|
||||||
|
"cardLanguage": "en",
|
||||||
|
"changePlayAreaImage": false,
|
||||||
|
"enableCardHelpers": true,
|
||||||
|
"playAreaConnectionColor": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 0.4,
|
||||||
|
"g": 0.4,
|
||||||
|
"r": 0.4
|
||||||
|
},
|
||||||
|
"playAreaConnections": true,
|
||||||
|
"playAreaSnapTags": true,
|
||||||
|
"showAttachmentHelper": false,
|
||||||
|
"showCYOA": false,
|
||||||
|
"showCleanUpHelper": false,
|
||||||
|
"showDisplacementTool": false,
|
||||||
|
"showDrawButton": false,
|
||||||
|
"showHandHelper": false,
|
||||||
|
"showSearchAssistant": false,
|
||||||
|
"showTitleSplash": true,
|
||||||
|
"useClassTexture": true,
|
||||||
|
"useClueClickers": false,
|
||||||
|
"useResourceCounters": "disabled",
|
||||||
|
"useSnapTags": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1 +1,68 @@
|
|||||||
{"claims":{"Black":[],"Blue":[],"Brown":[],"Green":[],"Grey":[],"Orange":[],"Pink":[],"Purple":[],"Red":[],"Teal":[],"White":[],"Yellow":[]},"distance":[],"pitch":[],"visibility":{"Black":{"full":false,"play":false},"Blue":{"full":false,"play":false},"Brown":{"full":false,"play":false},"Green":{"full":false,"play":false},"Grey":{"full":false,"play":false},"Orange":{"full":false,"play":false},"Pink":{"full":false,"play":false},"Purple":{"full":false,"play":false},"Red":{"full":false,"play":false},"Teal":{"full":false,"play":false},"White":{"full":false,"play":false},"Yellow":{"full":false,"play":false}}}
|
{
|
||||||
|
"claims": {
|
||||||
|
"Black": [],
|
||||||
|
"Blue": [],
|
||||||
|
"Brown": [],
|
||||||
|
"Green": [],
|
||||||
|
"Grey": [],
|
||||||
|
"Orange": [],
|
||||||
|
"Pink": [],
|
||||||
|
"Purple": [],
|
||||||
|
"Red": [],
|
||||||
|
"Teal": [],
|
||||||
|
"White": [],
|
||||||
|
"Yellow": []
|
||||||
|
},
|
||||||
|
"distance": [],
|
||||||
|
"pitch": [],
|
||||||
|
"visibility": {
|
||||||
|
"Black": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Blue": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Brown": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Green": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Grey": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Orange": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Pink": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Purple": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Red": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Teal": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"White": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
},
|
||||||
|
"Yellow": {
|
||||||
|
"full": false,
|
||||||
|
"play": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1 +1,144 @@
|
|||||||
{"checks":[],"decals":[{"locked":false,"name":"Arkham SCE logo","pos":{"x":3.1,"y":2.2},"rotation":0,"scale":{"x":"2","y":"2"},"tooltip":"None","url":"https://steamusercontent-a.akamaihd.net/ugc/2501268517218943111/803E57A7B3E9765DF342050EE6C71D69473A7388/"},{"locked":false,"name":"Bootlegger Finn","pos":{"x":3.5,"y":-1.89},"rotation":"25","scale":{"x":"1","y":"1"},"tooltip":"None","url":"https://steamusercontent-a.akamaihd.net/ugc/2037357792052848566/5DA900C430E97D3DFF2C9B8A3DB1CB2271791FC7/"},{"locked":false,"name":"black bar","pos":{"x":0,"y":-2.7},"rotation":0,"scale":{"x":"8","y":"0.03"},"tooltip":"None","url":"https://steamusercontent-a.akamaihd.net/ugc/2501268517219098388/0936FEE03B410319658B5E05DB5D486CEDDE98F5/"}],"fields":[{"align":3,"array":{"x":"1","y":"1"},"counter":"False","distance":{"x":"1","y":"1"},"fieldColor":{"a":0,"b":1,"g":1,"r":1},"font":"200","locked":false,"name":"Patch Notes","pos":{"x":"0","y":-2.9},"role":"Normal Field","size":{"x":"3750","y":"250"},"textColor":{"a":1,"b":0,"g":0,"r":0},"tooltip":"None","value":["Arkham Horror LCG SCE 3.9.0 - 07/08/2024"]},{"align":2,"array":{"x":"1","y":1},"distance":{"x":"1","y":"1"},"fieldColor":{"a":0,"b":1,"g":1,"r":1},"font":"89","locked":false,"name":"Details","pos":{"x":"0","y":0.4},"role":"Nothing","size":{"x":"3750","y":"2750"},"textColor":{"a":1,"b":0,"g":0,"r":0},"tooltip":"None","value":["Thanks for downloading! We're happy to present you a rather big update this time :-)\n\nNew things\n- updated note card for patch notes (bless Marum for his awesome tool!)\n- automated discarding for Patrice\n- confirmation dialog for discard hotkey (e.g. for locations)\n- helpers for cards that redraw tokens and Kohaku\n- displaying of token count for cards that seal tokens\r\n- new action / ability tokens (replacing the old ones)\r\n- option to enable all card helpers (e.g. Heavy Furs)\r\n- option to load class-colored playermat backgrounds\n- coloring for player names in broadcasts\n- right-click option for RBW button on Player Card Panel to specify trait(s)\n\nUpdates\r\n- performed a small clean up of the bottom corners of the table\n- \"Numpad 9\" to rearranges present tokens (on top of adding a resource)\n- Scroll of Secrets context menu helper now displays player names instead of colors\r\n- Player Card Panel can display fan-made cards with a new \"custom\" cycle button)\n- updated Family Inheritance helper to a proper UI\n- \"Discard object\" gamekey works for selected objects\r\n- updated a bunch of tools like Clean Up Helper, Drawing Tool,\nHand Helper, Token Arranger and Search Assistant\n\nFixes\r\r\n- Bugfix for attempting to draw an encounter card while there is no deck\r\n- Bugfix for Navigation Overlay: now checks if playmat is occupied\r\n- Bugfix for Phase Tracker broadcasting\r\n- Performance and file size improvements (e.g. by adding download\nfunctions for CYOA campaign guides and Arkham Fantasy standees)"]}],"flip":"False","height":"0.1","locks":{"checks":false,"decals":false,"fields":false},"nudgeDistance":0.1,"scale":{"x":"0.3","y":"0.3"},"sheetLocked":true}
|
{
|
||||||
|
"checks": [],
|
||||||
|
"decals": [
|
||||||
|
{
|
||||||
|
"locked": false,
|
||||||
|
"name": "Arkham SCE logo",
|
||||||
|
"pos": {
|
||||||
|
"x": 3.1,
|
||||||
|
"y": 2.2
|
||||||
|
},
|
||||||
|
"rotation": 0,
|
||||||
|
"scale": {
|
||||||
|
"x": "2",
|
||||||
|
"y": "2"
|
||||||
|
},
|
||||||
|
"tooltip": "None",
|
||||||
|
"url": "https://steamusercontent-a.akamaihd.net/ugc/2501268517218943111/803E57A7B3E9765DF342050EE6C71D69473A7388/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"locked": false,
|
||||||
|
"name": "Bootlegger Finn",
|
||||||
|
"pos": {
|
||||||
|
"x": 3.5,
|
||||||
|
"y": -1.89
|
||||||
|
},
|
||||||
|
"rotation": "25",
|
||||||
|
"scale": {
|
||||||
|
"x": "1",
|
||||||
|
"y": "1"
|
||||||
|
},
|
||||||
|
"tooltip": "None",
|
||||||
|
"url": "https://steamusercontent-a.akamaihd.net/ugc/2037357792052848566/5DA900C430E97D3DFF2C9B8A3DB1CB2271791FC7/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"locked": false,
|
||||||
|
"name": "black bar",
|
||||||
|
"pos": {
|
||||||
|
"x": 0,
|
||||||
|
"y": -2.7
|
||||||
|
},
|
||||||
|
"rotation": 0,
|
||||||
|
"scale": {
|
||||||
|
"x": "8",
|
||||||
|
"y": "0.03"
|
||||||
|
},
|
||||||
|
"tooltip": "None",
|
||||||
|
"url": "https://steamusercontent-a.akamaihd.net/ugc/2501268517219098388/0936FEE03B410319658B5E05DB5D486CEDDE98F5/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"align": 3,
|
||||||
|
"array": {
|
||||||
|
"x": "1",
|
||||||
|
"y": "1"
|
||||||
|
},
|
||||||
|
"counter": "False",
|
||||||
|
"distance": {
|
||||||
|
"x": "1",
|
||||||
|
"y": "1"
|
||||||
|
},
|
||||||
|
"fieldColor": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1,
|
||||||
|
"g": 1,
|
||||||
|
"r": 1
|
||||||
|
},
|
||||||
|
"font": "200",
|
||||||
|
"locked": false,
|
||||||
|
"name": "Patch Notes",
|
||||||
|
"pos": {
|
||||||
|
"x": "0",
|
||||||
|
"y": -2.9
|
||||||
|
},
|
||||||
|
"role": "Normal Field",
|
||||||
|
"size": {
|
||||||
|
"x": "3750",
|
||||||
|
"y": "250"
|
||||||
|
},
|
||||||
|
"textColor": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 0,
|
||||||
|
"g": 0,
|
||||||
|
"r": 0
|
||||||
|
},
|
||||||
|
"tooltip": "None",
|
||||||
|
"value": [
|
||||||
|
"Arkham Horror LCG SCE 3.9.1 - 08/01/2024"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"align": 2,
|
||||||
|
"array": {
|
||||||
|
"x": "1",
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"distance": {
|
||||||
|
"x": "1",
|
||||||
|
"y": "1"
|
||||||
|
},
|
||||||
|
"fieldColor": {
|
||||||
|
"a": 0,
|
||||||
|
"b": 1,
|
||||||
|
"g": 1,
|
||||||
|
"r": 1
|
||||||
|
},
|
||||||
|
"font": "75",
|
||||||
|
"locked": false,
|
||||||
|
"name": "Details",
|
||||||
|
"pos": {
|
||||||
|
"x": "0",
|
||||||
|
"y": 0.4
|
||||||
|
},
|
||||||
|
"role": "Nothing",
|
||||||
|
"size": {
|
||||||
|
"x": "3750",
|
||||||
|
"y": "2750"
|
||||||
|
},
|
||||||
|
"textColor": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 0,
|
||||||
|
"g": 0,
|
||||||
|
"r": 0
|
||||||
|
},
|
||||||
|
"tooltip": "None",
|
||||||
|
"value": [
|
||||||
|
"Minor release notes (3.9.1)\n- Added Parallel Jenny!\r\n- Re-Added Learn to Play PDF to table\n- Fixed bug with \"Remove one Use\" gamekey\n- Updated clue replenishing to locations via hotkey (Numpad 8)\r\r\n- Updated Deck Importer (arkham.build support and better RBW drawing)\n- Updated Search Assistant to properly handle a revealed top card (looking at Norman)\n\nNew things\n- updated note card for patch notes (bless Marum for his awesome tool!)\n- automated discarding for Patrice\n- confirmation dialog for discard hotkey (e.g. for locations)\n- helpers for cards that redraw tokens and Kohaku\n- displaying of token count for cards that seal tokens\r\n- new action / ability tokens (replacing the old ones)\r\n- option to enable all card helpers (e.g. Heavy Furs)\r\n- option to load class-colored playermat backgrounds\n- coloring for player names in broadcasts\n- right-click option for RBW button on Player Card Panel to specify trait(s)\n\nUpdates\r\n- performed a small clean up of the bottom corners of the table\n- \"Numpad 9\" to rearranges present tokens (on top of adding a resource)\n- Scroll of Secrets context menu helper now displays player names instead of colors\r\n- Player Card Panel can display fan-made cards with a new \"custom\" cycle button)\n- updated Family Inheritance helper to a proper UI\n- \"Discard object\" gamekey works for selected objects\r\n- updated a bunch of tools like Clean Up Helper, Drawing Tool,\nHand Helper, Token Arranger and Search Assistant\n\nFixes\r\r\n- Bugfix for attempting to draw an encounter card while there is no deck\r\n- Bugfix for Navigation Overlay: now checks if playmat is occupied\r\n- Bugfix for Phase Tracker broadcasting\r\n- Performance and file size improvements (e.g. by adding download\nfunctions for CYOA campaign guides and Arkham Fantasy standees)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flip": "False",
|
||||||
|
"height": "0.1",
|
||||||
|
"locks": {
|
||||||
|
"checks": false,
|
||||||
|
"decals": false,
|
||||||
|
"fields": false
|
||||||
|
},
|
||||||
|
"nudgeDistance": "0.1",
|
||||||
|
"scale": {
|
||||||
|
"x": "0.3",
|
||||||
|
"y": "0.3"
|
||||||
|
},
|
||||||
|
"sheetLocked": true
|
||||||
|
}
|
||||||
|
@ -1 +1,10 @@
|
|||||||
{"connectionColor":{"a":1,"b":0.4,"g":0.4,"r":0.4},"connectionsEnabled":true,"trackedLocations":[]}
|
{
|
||||||
|
"connectionColor": {
|
||||||
|
"a": 1,
|
||||||
|
"b": 0.4,
|
||||||
|
"g": 0.4,
|
||||||
|
"r": 0.4
|
||||||
|
},
|
||||||
|
"connectionsEnabled": true,
|
||||||
|
"trackedLocations": []
|
||||||
|
}
|
||||||
|
@ -1 +1,23 @@
|
|||||||
{"activeInvestigatorClass":"Neutral","activeInvestigatorId":"00000","isClassTextureEnabled":true,"isDrawButtonVisible":false,"playerColor":"White","slotData":["any","any","any","Tarot","Hand (left)","Hand (right)","Ally","any","any","any","Accessory","Arcane","Arcane","Body"]}
|
{
|
||||||
|
"activeInvestigatorClass": "Neutral",
|
||||||
|
"activeInvestigatorId": "00000",
|
||||||
|
"isClassTextureEnabled": true,
|
||||||
|
"isDrawButtonVisible": false,
|
||||||
|
"playerColor": "White",
|
||||||
|
"slotData": [
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Tarot",
|
||||||
|
"Hand (left)",
|
||||||
|
"Hand (right)",
|
||||||
|
"Ally",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Accessory",
|
||||||
|
"Arcane",
|
||||||
|
"Arcane",
|
||||||
|
"Body"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -1 +1,23 @@
|
|||||||
{"activeInvestigatorClass":"Neutral","activeInvestigatorId":"00000","isClassTextureEnabled":true,"isDrawButtonVisible":false,"playerColor":"Orange","slotData":["any","any","any","Tarot","Hand (left)","Hand (right)","Ally","any","any","any","Accessory","Arcane","Arcane","Body"]}
|
{
|
||||||
|
"activeInvestigatorClass": "Neutral",
|
||||||
|
"activeInvestigatorId": "00000",
|
||||||
|
"isClassTextureEnabled": true,
|
||||||
|
"isDrawButtonVisible": false,
|
||||||
|
"playerColor": "Orange",
|
||||||
|
"slotData": [
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Tarot",
|
||||||
|
"Hand (left)",
|
||||||
|
"Hand (right)",
|
||||||
|
"Ally",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Accessory",
|
||||||
|
"Arcane",
|
||||||
|
"Arcane",
|
||||||
|
"Body"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -1 +1,23 @@
|
|||||||
{"activeInvestigatorClass":"Neutral","activeInvestigatorId":"00000","isClassTextureEnabled":true,"isDrawButtonVisible":false,"playerColor":"Green","slotData":["any","any","any","Tarot","Hand (left)","Hand (right)","Ally","any","any","any","Accessory","Arcane","Arcane","Body"]}
|
{
|
||||||
|
"activeInvestigatorClass": "Neutral",
|
||||||
|
"activeInvestigatorId": "00000",
|
||||||
|
"isClassTextureEnabled": true,
|
||||||
|
"isDrawButtonVisible": false,
|
||||||
|
"playerColor": "Green",
|
||||||
|
"slotData": [
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Tarot",
|
||||||
|
"Hand (left)",
|
||||||
|
"Hand (right)",
|
||||||
|
"Ally",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Accessory",
|
||||||
|
"Arcane",
|
||||||
|
"Arcane",
|
||||||
|
"Body"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -1 +1,23 @@
|
|||||||
{"activeInvestigatorClass":"Neutral","activeInvestigatorId":"00000","isClassTextureEnabled":true,"isDrawButtonVisible":false,"playerColor":"Red","slotData":["any","any","any","Tarot","Hand (left)","Hand (right)","Ally","any","any","any","Accessory","Arcane","Arcane","Body"]}
|
{
|
||||||
|
"activeInvestigatorClass": "Neutral",
|
||||||
|
"activeInvestigatorId": "00000",
|
||||||
|
"isClassTextureEnabled": true,
|
||||||
|
"isDrawButtonVisible": false,
|
||||||
|
"playerColor": "Red",
|
||||||
|
"slotData": [
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Tarot",
|
||||||
|
"Hand (left)",
|
||||||
|
"Hand (right)",
|
||||||
|
"Ally",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"any",
|
||||||
|
"Accessory",
|
||||||
|
"Arcane",
|
||||||
|
"Arcane",
|
||||||
|
"Body"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
@ -1 +1,134 @@
|
|||||||
{"ml":{"01d780":{"lock":false,"pos":{"x":12.252,"y":1.4815,"z":11.986},"rot":{"x":0,"y":270.0001,"z":0}},"0dce91":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-28.014},"rot":{"x":0,"y":269.9792,"z":0}},"23dd51":{"lock":false,"pos":{"x":12.249,"y":1.4815,"z":35.986},"rot":{"x":0,"y":270,"z":0}},"3c4f3c":{"lock":false,"pos":{"x":12.251,"y":1.4815,"z":-20.014},"rot":{"x":0,"y":269.9867,"z":0}},"4c173f":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":3.986},"rot":{"x":0,"y":269.9998,"z":0}},"4dee5a":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-4.014},"rot":{"x":0,"y":269.9999,"z":0}},"d02940":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":-36.014},"rot":{"x":0,"y":270.0045,"z":0}},"db7039":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":27.986},"rot":{"x":0,"y":270.0001,"z":0}},"ee987d":{"lock":false,"pos":{"x":12.25,"y":1.4815,"z":19.986},"rot":{"x":0,"y":270.0001,"z":0}},"fc7674":{"lock":false,"pos":{"x":12.247,"y":1.4815,"z":-12.016},"rot":{"x":0,"y":270.0001,"z":0}}}}
|
{
|
||||||
|
"ml": {
|
||||||
|
"01d780": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.252,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 11.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0001,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0dce91": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -28.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9792,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"23dd51": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.249,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 35.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3c4f3c": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.251,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -20.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9867,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4c173f": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 3.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9998,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4dee5a": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -4.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 269.9999,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"d02940": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -36.014
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0045,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"db7039": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 27.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0001,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ee987d": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": 19.986
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0001,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fc7674": {
|
||||||
|
"lock": false,
|
||||||
|
"pos": {
|
||||||
|
"x": 12.247,
|
||||||
|
"y": 1.4815,
|
||||||
|
"z": -12.016
|
||||||
|
},
|
||||||
|
"rot": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 270.0001,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1 +1,46 @@
|
|||||||
{"includeDrawnTokens":true,"percentage":false,"tokenPrecedence":{"":[0,11],"Auto-fail":[-100,7],"Bless":[110,8],"Cultist":[-2,4],"Curse":[-110,9],"Elder Sign":[100,2],"Elder Thing":[-4,6],"Frost":[-105,10],"Skull":[-1,3],"Tablet":[-3,5]}}
|
{
|
||||||
|
"includeDrawnTokens": true,
|
||||||
|
"percentage": false,
|
||||||
|
"tokenPrecedence": {
|
||||||
|
"": [
|
||||||
|
0,
|
||||||
|
11
|
||||||
|
],
|
||||||
|
"Auto-fail": [
|
||||||
|
-100,
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"Bless": [
|
||||||
|
110,
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"Cultist": [
|
||||||
|
-2,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"Curse": [
|
||||||
|
-110,
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"Elder Sign": [
|
||||||
|
100,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"Elder Thing": [
|
||||||
|
-4,
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"Frost": [
|
||||||
|
-105,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"Skull": [
|
||||||
|
-1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"Tablet": [
|
||||||
|
-3,
|
||||||
|
5
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -113,11 +113,25 @@ function startSearch(messageColor, number)
|
|||||||
|
|
||||||
-- get draw deck
|
-- get draw deck
|
||||||
local deckAreaObjects = playermatApi.getDeckAreaObjects(matColor)
|
local deckAreaObjects = playermatApi.getDeckAreaObjects(matColor)
|
||||||
if deckAreaObjects.draw == nil then
|
if deckAreaObjects.draw == nil and deckAreaObjects.topCard == nil then
|
||||||
printToColor(matColor .. " draw deck could not be found!", messageColor, "Red")
|
printToColor(matColor .. " draw deck could not be found!", messageColor, "Red")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check for harbinger
|
||||||
|
local harbinger
|
||||||
|
if deckAreaObjects.topCard then
|
||||||
|
harbinger = isHarbinger(deckAreaObjects.topCard.getGMNotes())
|
||||||
|
elseif deckAreaObjects.draw and not deckAreaObjects.draw.is_face_down then
|
||||||
|
local cards = deckAreaObjects.draw.getObjects()
|
||||||
|
harbinger = isHarbinger(cards[#cards].gm_notes)
|
||||||
|
end
|
||||||
|
|
||||||
|
if harbinger then
|
||||||
|
printToColor("The Harbinger is on top of your deck, searching isn't allowed", messageColor)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- get bounds to know the height of the deck
|
-- get bounds to know the height of the deck
|
||||||
local bounds = deckAreaObjects.draw.getBounds()
|
local bounds = deckAreaObjects.draw.getBounds()
|
||||||
drawDeckPosition = bounds.center + Vector(0, bounds.size.y / 2 + 0.2, 0)
|
drawDeckPosition = bounds.center + Vector(0, bounds.size.y / 2 + 0.2, 0)
|
||||||
@ -158,16 +172,21 @@ function startSearch(messageColor, number)
|
|||||||
|
|
||||||
-- handling for Norman Withers
|
-- handling for Norman Withers
|
||||||
if deckAreaObjects.topCard then
|
if deckAreaObjects.topCard then
|
||||||
deckAreaObjects.topCard.setRotation(setAsideRotation)
|
deckAreaObjects.topCard.deal(1, handColor)
|
||||||
|
number = number - 1
|
||||||
topCardDetected = true
|
topCardDetected = true
|
||||||
end
|
end
|
||||||
|
|
||||||
searchView()
|
searchView()
|
||||||
|
|
||||||
Wait.time(function()
|
if number > 0 then
|
||||||
deckAreaObjects = playermatApi.getDeckAreaObjects(matColor)
|
|
||||||
deckAreaObjects.draw.deal(number, handColor)
|
deckAreaObjects.draw.deal(number, handColor)
|
||||||
end, 1)
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function isHarbinger(notes)
|
||||||
|
local md = JSON.decode(notes or "") or {}
|
||||||
|
return md.id == "08006"
|
||||||
end
|
end
|
||||||
|
|
||||||
-- place handCards back into deck and optionally shuffle
|
-- place handCards back into deck and optionally shuffle
|
||||||
|
@ -34,19 +34,19 @@ do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Start the deck build process for the given player color and deck ID. This
|
-- Start the deck build process for the given player color and deck ID. This
|
||||||
-- will retrieve the deck from ArkhamDB, and pass to a callback for processing.
|
-- will retrieve the deck from ArkhamDB, and pass to a callback for processing.
|
||||||
---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red").
|
---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red").
|
||||||
---@param deckId string ArkhamDB deck id to be loaded
|
---@param deckId string ArkhamDB deck id to be loaded
|
||||||
---@param isPrivate boolean Whether this deck is published or private on ArkhamDB
|
---@param isPrivate boolean Whether this deck is published or private on ArkhamDB
|
||||||
---@param loadNewest boolean Whether the newest version of this deck should be loaded
|
---@param loadNewest boolean Whether the newest version of this deck should be loaded
|
||||||
---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck
|
---@param standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
---@param callback function Callback which will be sent the results of this load
|
---@param callback function Callback which will be sent the results of this load
|
||||||
--- Parameters to the callback will be:
|
--- Parameters to the callback will be:
|
||||||
--- slots table A map of card ID to count in the deck
|
--- slots table A map of card ID to count in the deck
|
||||||
--- investigatorCode String. ID of the investigator in this deck
|
--- investigatorCode String. ID of the investigator in this deck
|
||||||
--- customizations table The decoded table of customization upgrades in this deck
|
--- customizations table The decoded table of customization upgrades in this deck
|
||||||
--- playerColor String. Color this deck is being loaded for
|
--- playerColor String. Color this deck is being loaded for
|
||||||
---@return boolean
|
---@return boolean
|
||||||
---@return string
|
---@return string
|
||||||
ArkhamDb.getDecklist = function(
|
ArkhamDb.getDecklist = function(
|
||||||
@ -54,7 +54,7 @@ do
|
|||||||
deckId,
|
deckId,
|
||||||
isPrivate,
|
isPrivate,
|
||||||
loadNewest,
|
loadNewest,
|
||||||
loadInvestigators,
|
standalone,
|
||||||
callback)
|
callback)
|
||||||
-- Get a simple card to see if the bag indexes are complete. If not, abort
|
-- Get a simple card to see if the bag indexes are complete. If not, abort
|
||||||
-- the deck load. The called method will handle player notification.
|
-- the deck load. The called method will handle player notification.
|
||||||
@ -90,11 +90,11 @@ do
|
|||||||
return true, json
|
return true, json
|
||||||
end)
|
end)
|
||||||
|
|
||||||
deck:with(internal.onDeckResult, playerColor, loadNewest, loadInvestigators, callback)
|
deck:with(internal.onDeckResult, playerColor, loadNewest, standalone, callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Logs that a card could not be loaded in the mod by printing it to the console in the given
|
-- Logs that a card could not be loaded in the mod by printing it to the console in the given
|
||||||
-- color of the player owning the deck. Attempts to look up the name on ArkhamDB for clarity,
|
-- color of the player owning the deck. Attempts to look up the name on ArkhamDB for clarity,
|
||||||
-- but prints the card ID if the name cannot be retrieved.
|
-- but prints the card ID if the name cannot be retrieved.
|
||||||
---@param cardId string ArkhamDB ID of the card that could not be found
|
---@param cardId string ArkhamDB ID of the card that could not be found
|
||||||
---@param playerColor string Color of the player's deck that had the problem
|
---@param playerColor string Color of the player's deck that had the problem
|
||||||
@ -118,23 +118,23 @@ do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Callback when the deck information is received from ArkhamDB. Parses the
|
-- Callback when the deck information is received from ArkhamDB. Parses the
|
||||||
-- response then applies standard transformations to the deck such as adding
|
-- response then applies standard transformations to the deck such as adding
|
||||||
-- random weaknesses and checking for taboos. Once the deck is processed,
|
-- random weaknesses and checking for taboos. Once the deck is processed,
|
||||||
-- passes to loadCards to actually spawn the defined deck.
|
-- passes to loadCards to actually spawn the defined deck.
|
||||||
---@param deck table ArkhamImportDeck
|
---@param deck table ArkhamImportDeck
|
||||||
---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red")
|
---@param playerColor string Color name of the player mat to place this deck on (e.g. "Red")
|
||||||
---@param loadNewest boolean Whether the newest version of this deck should be loaded
|
---@param loadNewest boolean Whether the newest version of this deck should be loaded
|
||||||
---@param loadInvestigators boolean Whether investigator cards should be loaded as part of this deck
|
---@param standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
---@param callback function Callback which will be sent the results of this load.
|
---@param callback function Callback which will be sent the results of this load.
|
||||||
--- Parameters to the callback will be:
|
--- Parameters to the callback will be:
|
||||||
--- slots table A map of card ID to count in the deck
|
--- slots table A map of card ID to count in the deck
|
||||||
--- investigatorCode String. ID of the investigator in this deck
|
--- investigatorCode String. ID of the investigator in this deck
|
||||||
--- bondedList A table of cardID keys to meaningless values. Card IDs in this list were
|
--- bondedList A table of cardID keys to meaningless values. Card IDs in this list were
|
||||||
--- added from a parent bonded card.
|
--- added from a parent bonded card.
|
||||||
--- customizations table The decoded table of customization upgrades in this deck
|
--- customizations table The decoded table of customization upgrades in this deck
|
||||||
--- playerColor String. Color this deck is being loaded for
|
--- playerColor String. Color this deck is being loaded for
|
||||||
internal.onDeckResult = function(deck, playerColor, loadNewest, loadInvestigators, callback)
|
internal.onDeckResult = function(deck, playerColor, loadNewest, standalone, callback)
|
||||||
-- Load the next deck in the upgrade path if the option is enabled
|
-- Load the next deck in the upgrade path if the option is enabled
|
||||||
if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then
|
if (loadNewest and deck.next_deck ~= nil and deck.next_deck ~= "") then
|
||||||
buildDeck(playerColor, deck.next_deck)
|
buildDeck(playerColor, deck.next_deck)
|
||||||
@ -143,17 +143,20 @@ do
|
|||||||
|
|
||||||
internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor)
|
internal.maybePrint(table.concat({ "Found decklist: ", deck.name }), playerColor)
|
||||||
|
|
||||||
-- Initialize deck slot table and perform common transformations. The order of these should not
|
-- Initialize deck slot table and perform common transformations. The order of these should not
|
||||||
-- be changed, as later steps may act on cards added in each. For example, a random weakness or
|
-- be changed, as later steps may act on cards added in each. For example, a random weakness or
|
||||||
-- investigator may have bonded cards or taboo entries, and should be present
|
-- investigator may have bonded cards or taboo entries, and should be present
|
||||||
local slots = deck.slots
|
local slots = deck.slots
|
||||||
internal.maybeDrawRandomWeakness(slots, playerColor)
|
|
||||||
|
-- get class for investigator to handle specific weaknesses
|
||||||
|
local class
|
||||||
|
local card = allCardsBagApi.getCardById(deck.investigator_code)
|
||||||
|
if card and card.metadata then class = card.metadata.class end
|
||||||
|
local restrictions = { class = class, standalone = standalone }
|
||||||
|
internal.maybeDrawRandomWeakness(slots, playerColor, restrictions)
|
||||||
|
|
||||||
-- handles alternative investigators (parallel, promo or revised art)
|
-- handles alternative investigators (parallel, promo or revised art)
|
||||||
local loadAltInvestigator = "normal"
|
local loadAltInvestigator = internal.addInvestigatorCards(deck, slots)
|
||||||
if loadInvestigators then
|
|
||||||
loadAltInvestigator = internal.addInvestigatorCards(deck, slots)
|
|
||||||
end
|
|
||||||
|
|
||||||
internal.maybeModifyDeckFromDescription(slots, deck.description_md, playerColor)
|
internal.maybeModifyDeckFromDescription(slots, deck.description_md, playerColor)
|
||||||
internal.maybeAddSummonedServitor(slots)
|
internal.maybeAddSummonedServitor(slots)
|
||||||
@ -179,22 +182,26 @@ do
|
|||||||
--- of those cards which will be spawned
|
--- of those cards which will be spawned
|
||||||
---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast
|
---@param playerColor string Color of the player this deck is being loaded for. Used for broadcast
|
||||||
--- if a weakness is added.
|
--- if a weakness is added.
|
||||||
internal.maybeDrawRandomWeakness = function(slots, playerColor)
|
---@param restrictions table Additional restrictions:
|
||||||
|
--- class string Class to restrict weakness to
|
||||||
|
--- standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
|
--- traits? string Trait(s) to use as filter
|
||||||
|
internal.maybeDrawRandomWeakness = function(slots, playerColor, restrictions)
|
||||||
local randomWeaknessAmount = slots[RANDOM_WEAKNESS_ID] or 0
|
local randomWeaknessAmount = slots[RANDOM_WEAKNESS_ID] or 0
|
||||||
slots[RANDOM_WEAKNESS_ID] = nil
|
slots[RANDOM_WEAKNESS_ID] = nil
|
||||||
|
|
||||||
if randomWeaknessAmount > 0 then
|
if randomWeaknessAmount > 0 then
|
||||||
for i = 1, randomWeaknessAmount do
|
local weaknessIds = allCardsBagApi.getRandomWeaknessIds(randomWeaknessAmount, restrictions)
|
||||||
local weaknessId = allCardsBagApi.getRandomWeaknessId()
|
for _, weaknessId in ipairs(weaknessIds) do
|
||||||
slots[weaknessId] = (slots[weaknessId] or 0) + 1
|
slots[weaknessId] = (slots[weaknessId] or 0) + 1
|
||||||
end
|
end
|
||||||
internal.maybePrint("Added " .. randomWeaknessAmount .. " random basic weakness(es) to deck", playerColor)
|
internal.maybePrint("Added " .. #weaknessIds .. " random basic weakness(es) to deck", playerColor)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Adds both the investigator (XXXXX) and minicard (XXXXX-m) slots with one copy each
|
-- Adds both the investigator (XXXXX) and minicard (XXXXX-m) slots with one copy each
|
||||||
---@param deck table The processed ArkhamDB deck response
|
---@param deck table The processed ArkhamDB deck response
|
||||||
---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the
|
---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the
|
||||||
--- number of those cards which will be spawned
|
--- number of those cards which will be spawned
|
||||||
---@return string: Contains the name of the art that should be loaded ("normal", "promo" or "revised")
|
---@return string: Contains the name of the art that should be loaded ("normal", "promo" or "revised")
|
||||||
internal.addInvestigatorCards = function(deck, slots)
|
internal.addInvestigatorCards = function(deck, slots)
|
||||||
@ -271,7 +278,7 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- On the Mend should have 1-per-investigator copies set aside, but ArkhamDB always sends 1. Update
|
-- On the Mend should have 1-per-investigator copies set aside, but ArkhamDB always sends 1. Update
|
||||||
-- the count based on the investigator count
|
-- the count based on the investigator count
|
||||||
---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number
|
---@param slots table The slot list for cards in this deck. Table key is the cardId, value is the number
|
||||||
-- of those cards which will be spawned
|
-- of those cards which will be spawned
|
||||||
|
@ -21,18 +21,18 @@ local UPGRADED_TOGGLE_LABELS = {}
|
|||||||
UPGRADED_TOGGLE_LABELS[true] = "Upgraded"
|
UPGRADED_TOGGLE_LABELS[true] = "Upgraded"
|
||||||
UPGRADED_TOGGLE_LABELS[false] = "Specific"
|
UPGRADED_TOGGLE_LABELS[false] = "Specific"
|
||||||
|
|
||||||
local LOAD_INVESTIGATOR_TOGGLE_LABELS = {}
|
local STANDALONE_TOGGLE_LABELS = {}
|
||||||
LOAD_INVESTIGATOR_TOGGLE_LABELS[true] = "Yes"
|
STANDALONE_TOGGLE_LABELS[true] = "Yes"
|
||||||
LOAD_INVESTIGATOR_TOGGLE_LABELS[false] = "No"
|
STANDALONE_TOGGLE_LABELS[false] = "No"
|
||||||
|
|
||||||
local redDeckId = ""
|
redDeckId = ""
|
||||||
local orangeDeckId = ""
|
orangeDeckId = ""
|
||||||
local whiteDeckId = ""
|
whiteDeckId = ""
|
||||||
local greenDeckId = ""
|
greenDeckId = ""
|
||||||
|
|
||||||
local privateDeck = true
|
local privateDeck = true
|
||||||
local loadNewestDeck = true
|
local loadNewestDeck = true
|
||||||
local loadInvestigators = false
|
local standalone = false
|
||||||
|
|
||||||
function onLoad(script_state)
|
function onLoad(script_state)
|
||||||
initializeUi(JSON.decode(script_state))
|
initializeUi(JSON.decode(script_state))
|
||||||
@ -53,7 +53,7 @@ function getUiState()
|
|||||||
greenDeck = greenDeckId,
|
greenDeck = greenDeckId,
|
||||||
privateDeck = privateDeck,
|
privateDeck = privateDeck,
|
||||||
loadNewest = loadNewestDeck,
|
loadNewest = loadNewestDeck,
|
||||||
investigators = loadInvestigators
|
standalone = standalone
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ function initializeUi(savedUiState)
|
|||||||
greenDeckId = savedUiState.greenDeck
|
greenDeckId = savedUiState.greenDeck
|
||||||
privateDeck = savedUiState.privateDeck
|
privateDeck = savedUiState.privateDeck
|
||||||
loadNewestDeck = savedUiState.loadNewest
|
loadNewestDeck = savedUiState.loadNewest
|
||||||
loadInvestigators = savedUiState.investigators
|
standalone = savedUiState.standalone
|
||||||
end
|
end
|
||||||
|
|
||||||
makeOptionToggles()
|
makeOptionToggles()
|
||||||
@ -84,72 +84,74 @@ end
|
|||||||
|
|
||||||
function makeOptionToggles()
|
function makeOptionToggles()
|
||||||
-- common parameters
|
-- common parameters
|
||||||
local checkboxParameters = {}
|
local cParams = {}
|
||||||
checkboxParameters.function_owner = self
|
cParams.function_owner = self
|
||||||
checkboxParameters.width = INPUT_FIELD_WIDTH
|
cParams.width = 1750
|
||||||
checkboxParameters.height = INPUT_FIELD_HEIGHT
|
cParams.height = INPUT_FIELD_HEIGHT
|
||||||
checkboxParameters.scale = { 0.1, 0.1, 0.1 }
|
cParams.position = Vector( 0.22, 0.1, -0.102)
|
||||||
checkboxParameters.font_size = 240
|
cParams.scale = { 0.1, 0.1, 0.1 }
|
||||||
checkboxParameters.hover_color = { 0.4, 0.6, 0.8 }
|
cParams.font_size = 240
|
||||||
checkboxParameters.color = FIELD_COLOR
|
cParams.hover_color = { 0.4, 0.6, 0.8 }
|
||||||
|
cParams.color = FIELD_COLOR
|
||||||
|
|
||||||
-- public / private deck
|
-- public / private deck
|
||||||
checkboxParameters.click_function = "publicPrivateChanged"
|
cParams.click_function = "publishedPrivateChanged"
|
||||||
checkboxParameters.position = { 0.25, 0.1, -0.102 }
|
cParams.tooltip = "Published or private deck?\n\nPLEASE USE A PRIVATE DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!\n\nMake sure to enable deck sharing in your account settings.\n\nKeep this on 'Private' for arkham.build."
|
||||||
checkboxParameters.tooltip = "Published or private deck?\n\nPLEASE USE A PRIVATE DECK IF JUST FOR TTS TO AVOID FLOODING ARKHAMDB PUBLISHED DECK LISTS!"
|
cParams.label = PRIVATE_TOGGLE_LABELS[privateDeck]
|
||||||
checkboxParameters.label = PRIVATE_TOGGLE_LABELS[privateDeck]
|
self.createButton(cParams)
|
||||||
self.createButton(checkboxParameters)
|
|
||||||
|
|
||||||
-- load upgraded?
|
-- load upgraded?
|
||||||
checkboxParameters.click_function = "loadUpgradedChanged"
|
cParams.click_function = "loadUpgradedChanged"
|
||||||
checkboxParameters.position = { 0.25, 0.1, -0.01 }
|
cParams.position.z = -0.01
|
||||||
checkboxParameters.tooltip = "Load newest upgrade or exact deck?"
|
cParams.tooltip = "Load newest upgrade or exact deck?"
|
||||||
checkboxParameters.label = UPGRADED_TOGGLE_LABELS[loadNewestDeck]
|
cParams.label = UPGRADED_TOGGLE_LABELS[loadNewestDeck]
|
||||||
self.createButton(checkboxParameters)
|
self.createButton(cParams)
|
||||||
|
|
||||||
-- load investigators?
|
-- standalone mode?
|
||||||
checkboxParameters.click_function = "loadInvestigatorsChanged"
|
cParams.click_function = "standaloneChanged"
|
||||||
checkboxParameters.position = { 0.25, 0.1, 0.081 }
|
cParams.position.z = 0.081
|
||||||
checkboxParameters.tooltip = "Spawn investigator cards?"
|
cParams.tooltip = "Are you playing standalone mode? Enabling this will make all 'Campaign Only' weaknesses ineligible when determining the random basic weakness(es)."
|
||||||
checkboxParameters.label = LOAD_INVESTIGATOR_TOGGLE_LABELS[loadInvestigators]
|
cParams.label = STANDALONE_TOGGLE_LABELS[standalone]
|
||||||
self.createButton(checkboxParameters)
|
self.createButton(cParams)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create the four deck ID entry fields
|
-- Create the four deck ID entry fields
|
||||||
function makeDeckIdFields()
|
function makeDeckIdFields()
|
||||||
local inputParameters = {}
|
local iParams = {}
|
||||||
-- Parameters common to all entry fields
|
iParams.function_owner = self
|
||||||
inputParameters.function_owner = self
|
iParams.scale = { 0.1, 0.1, 0.1 }
|
||||||
inputParameters.scale = { 0.1, 0.1, 0.1 }
|
iParams.width = INPUT_FIELD_WIDTH
|
||||||
inputParameters.width = INPUT_FIELD_WIDTH
|
iParams.height = INPUT_FIELD_HEIGHT
|
||||||
inputParameters.height = INPUT_FIELD_HEIGHT
|
iParams.font_size = 320
|
||||||
inputParameters.font_size = 320
|
iParams.tooltip = "Deck ID from ArkhamDB URL of the deck\nPublished URL: 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0' = '101'\nPrivate URL: 'https://arkhamdb.com/deck/view/102' = '102'\n\nAlso supports the deck ID from shared decks from arkham.build!"
|
||||||
inputParameters.tooltip = "Deck ID from ArkhamDB URL of the deck\nPublic URL: 'https://arkhamdb.com/decklist/view/101/knowledge-overwhelming-solo-deck-1.0' = '101'\nPrivate URL: 'https://arkhamdb.com/deck/view/102' = '102'\n\nAlso supports the deck ID from shared decks from arkham.build!"
|
iParams.alignment = 3 -- Center
|
||||||
inputParameters.alignment = 3 -- Center
|
iParams.color = FIELD_COLOR
|
||||||
inputParameters.color = FIELD_COLOR
|
iParams.font_color = { 0, 0, 0 }
|
||||||
inputParameters.font_color = { 0, 0, 0 }
|
iParams.validation = 4 -- alphanumeric (to support arkham.build IDs)
|
||||||
inputParameters.validation = 4 -- alphanumeric (to support arkham.build IDs)
|
|
||||||
|
|
||||||
-- Green
|
-- Green
|
||||||
inputParameters.input_function = "greenDeckChanged"
|
iParams.input_function = "greenDeckChanged"
|
||||||
inputParameters.position = { -0.166, 0.1, 0.385 }
|
iParams.position = { -0.16, 0.1, 0.385 }
|
||||||
inputParameters.value = greenDeckId
|
iParams.value = greenDeckId
|
||||||
self.createInput(inputParameters)
|
self.createInput(iParams)
|
||||||
|
|
||||||
-- Red
|
-- Red
|
||||||
inputParameters.input_function = "redDeckChanged"
|
iParams.input_function = "redDeckChanged"
|
||||||
inputParameters.position = { 0.171, 0.1, 0.385 }
|
iParams.position = { 0.165, 0.1, 0.385 }
|
||||||
inputParameters.value = redDeckId
|
iParams.value = redDeckId
|
||||||
self.createInput(inputParameters)
|
self.createInput(iParams)
|
||||||
|
|
||||||
-- White
|
-- White
|
||||||
inputParameters.input_function = "whiteDeckChanged"
|
iParams.input_function = "whiteDeckChanged"
|
||||||
inputParameters.position = { -0.166, 0.1, 0.474 }
|
iParams.position = { -0.16, 0.1, 0.474 }
|
||||||
inputParameters.value = whiteDeckId
|
iParams.value = whiteDeckId
|
||||||
self.createInput(inputParameters)
|
self.createInput(iParams)
|
||||||
|
|
||||||
-- Orange
|
-- Orange
|
||||||
inputParameters.input_function = "orangeDeckChanged"
|
iParams.input_function = "orangeDeckChanged"
|
||||||
inputParameters.position = { 0.171, 0.1, 0.474 }
|
iParams.position = { 0.165, 0.1, 0.474 }
|
||||||
inputParameters.value = orangeDeckId
|
iParams.value = orangeDeckId
|
||||||
self.createInput(inputParameters)
|
self.createInput(iParams)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create the Build All button. This is a transparent button which covers the Build All portion of the background graphic
|
-- Create the Build All button. This is a transparent button which covers the Build All portion of the background graphic
|
||||||
@ -172,7 +174,7 @@ function whiteDeckChanged(_, _, inputValue) whiteDeckId = inputValue end
|
|||||||
function greenDeckChanged(_, _, inputValue) greenDeckId = inputValue end
|
function greenDeckChanged(_, _, inputValue) greenDeckId = inputValue end
|
||||||
|
|
||||||
-- Event handlers for toggle buttons
|
-- Event handlers for toggle buttons
|
||||||
function publicPrivateChanged()
|
function publishedPrivateChanged()
|
||||||
privateDeck = not privateDeck
|
privateDeck = not privateDeck
|
||||||
self.editButton({ index = 0, label = PRIVATE_TOGGLE_LABELS[privateDeck] })
|
self.editButton({ index = 0, label = PRIVATE_TOGGLE_LABELS[privateDeck] })
|
||||||
end
|
end
|
||||||
@ -182,25 +184,37 @@ function loadUpgradedChanged()
|
|||||||
self.editButton({ index = 1, label = UPGRADED_TOGGLE_LABELS[loadNewestDeck] })
|
self.editButton({ index = 1, label = UPGRADED_TOGGLE_LABELS[loadNewestDeck] })
|
||||||
end
|
end
|
||||||
|
|
||||||
function loadInvestigatorsChanged()
|
function standaloneChanged()
|
||||||
loadInvestigators = not loadInvestigators
|
standalone = not standalone
|
||||||
self.editButton({ index = 2, label = LOAD_INVESTIGATOR_TOGGLE_LABELS[loadInvestigators] })
|
self.editButton({ index = 2, label = STANDALONE_TOGGLE_LABELS[standalone] })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- start the deck importing process
|
||||||
function loadDecks()
|
function loadDecks()
|
||||||
|
co = coroutine.create(loadDecksCoroutine)
|
||||||
|
resumeLoadDecks()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- perform the deck importing (with a pause after each deck load)
|
||||||
|
-- this pause will for example allow weaknesses to be spawned so that the RBW drawing can detect them
|
||||||
|
function loadDecksCoroutine()
|
||||||
if not allCardsBagApi.isIndexReady() then return end
|
if not allCardsBagApi.isIndexReady() then return end
|
||||||
matsWithInvestigator = playermatApi.getUsedMatColors()
|
matsWithInvestigator = playermatApi.getUsedMatColors()
|
||||||
if redDeckId ~= nil and redDeckId ~= "" then
|
|
||||||
buildDeck("Red", redDeckId)
|
for _, matColor in ipairs({"White", "Orange", "Green", "Red"}) do
|
||||||
|
local deckId = _G[string.lower(matColor) .. "DeckId"]
|
||||||
|
if deckId ~= nil and deckId ~= "" then
|
||||||
|
buildDeck(matColor, deckId)
|
||||||
|
coroutine.yield()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if orangeDeckId ~= nil and orangeDeckId ~= "" then
|
end
|
||||||
buildDeck("Orange", orangeDeckId)
|
|
||||||
end
|
-- resume the deck importing process
|
||||||
if whiteDeckId ~= nil and whiteDeckId ~= "" then
|
function resumeLoadDecks()
|
||||||
buildDeck("White", whiteDeckId)
|
if co and coroutine.status(co) ~= "dead" then
|
||||||
end
|
local status, err = coroutine.resume(co)
|
||||||
if greenDeckId ~= nil and greenDeckId ~= "" then
|
if not status then error(err) end
|
||||||
buildDeck("Green", greenDeckId)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -247,7 +261,7 @@ function buildDeck(playerColor, deckId)
|
|||||||
deckId,
|
deckId,
|
||||||
uiState.privateDeck,
|
uiState.privateDeck,
|
||||||
uiState.loadNewest,
|
uiState.loadNewest,
|
||||||
uiState.investigators,
|
uiState.standalone,
|
||||||
loadCards)
|
loadCards)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -343,6 +357,7 @@ function loadCards(slots, investigatorId, bondedList, customizations, playerColo
|
|||||||
if (not hadError) then
|
if (not hadError) then
|
||||||
printToAll("Deck loaded successfully!", playerColor)
|
printToAll("Deck loaded successfully!", playerColor)
|
||||||
end
|
end
|
||||||
|
resumeLoadDecks()
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ local bagSearchers = {}
|
|||||||
local hideTitleSplashWaitFunctionId = nil
|
local hideTitleSplashWaitFunctionId = nil
|
||||||
|
|
||||||
-- online functionality related variables
|
-- online functionality related variables
|
||||||
local MOD_VERSION = "3.9.0"
|
local MOD_VERSION = "3.9.1"
|
||||||
local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main'
|
local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main'
|
||||||
local library, requestObj, modMeta
|
local library, requestObj, modMeta
|
||||||
local acknowledgedUpgradeVersions = {}
|
local acknowledgedUpgradeVersions = {}
|
||||||
@ -258,7 +258,7 @@ function onObjectNumberTyped(hoveredObject, playerColor, number)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- check whether the hovered object is part of a players draw objects
|
-- check whether the hovered object is part of a players draw objects
|
||||||
for _, color in ipairs(playermatApi.getUsedMatColors()) do
|
for color, _ in pairs(guidReferenceApi.getObjectsByType("Playermat")) do
|
||||||
local deckAreaObjects = playermatApi.getDeckAreaObjects(color)
|
local deckAreaObjects = playermatApi.getDeckAreaObjects(color)
|
||||||
if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then
|
if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then
|
||||||
playermatApi.drawCardsWithReshuffle(color, number)
|
playermatApi.drawCardsWithReshuffle(color, number)
|
||||||
|
@ -370,19 +370,45 @@ end
|
|||||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned it will be
|
-- Gets a random basic weakness from the bag. Once a given ID has been returned it will be
|
||||||
-- removed from the list and cannot be selected again until a reload occurs or the indexes
|
-- removed from the list and cannot be selected again until a reload occurs or the indexes
|
||||||
-- are rebuilt, which will refresh the list to include all weaknesses.
|
-- are rebuilt, which will refresh the list to include all weaknesses.
|
||||||
---@return string: ID of the selected weakness
|
---@param params table Bundled parameters:
|
||||||
function getRandomWeaknessId()
|
--- count number Number of weaknesses
|
||||||
local availableWeaknesses = buildAvailableWeaknesses()
|
--- restrictions table Additional restrictions:
|
||||||
if #availableWeaknesses > 0 then
|
--- class string Class to restrict weakness to
|
||||||
return availableWeaknesses[math.random(#availableWeaknesses)]
|
--- standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
|
--- traits? string Trait(s) to use as filter
|
||||||
|
---@return table: Table with IDs of the selected weaknesses
|
||||||
|
function getRandomWeaknessIds(params)
|
||||||
|
params.count = params.count or 1
|
||||||
|
local availableWeaknesses = buildAvailableWeaknesses(params.restrictions)
|
||||||
|
|
||||||
|
-- check if enough weaknesses are available
|
||||||
|
local missingWeaknesses = params.count - #availableWeaknesses
|
||||||
|
if missingWeaknesses > 0 then
|
||||||
|
broadcastToAll("Not enough basic weaknesses available! (" .. missingWeaknesses .. " missing)", { 0.9, 0.2, 0.2 })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local drawnWeaknesses = {}
|
||||||
|
|
||||||
|
-- Fisher-Yates shuffle algorithm
|
||||||
|
local n = #availableWeaknesses
|
||||||
|
for i = 1, math.min(params.count, n) do
|
||||||
|
local index = math.random(i, n)
|
||||||
|
table.insert(drawnWeaknesses, availableWeaknesses[index])
|
||||||
|
availableWeaknesses[index], availableWeaknesses[i] = availableWeaknesses[i], availableWeaknesses[index]
|
||||||
|
end
|
||||||
|
|
||||||
|
return drawnWeaknesses
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Constructs a list of available basic weaknesses by starting with the full pool of basic
|
-- Constructs a list of available basic weaknesses by starting with the full pool of basic
|
||||||
-- weaknesses then removing any which are currently in the play or deck construction areas
|
-- weaknesses then removing any which are currently in the play or deck construction areas
|
||||||
---@param traits? string Trait(s) to use as filter
|
---@param restrictions? table Additional restrictions:
|
||||||
|
--- class string Class to restrict weakness to
|
||||||
|
--- standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
|
--- traits? string Trait(s) to use as filter
|
||||||
---@return table: Array of weakness IDs which are valid to choose from
|
---@return table: Array of weakness IDs which are valid to choose from
|
||||||
function buildAvailableWeaknesses(traits)
|
function buildAvailableWeaknesses(restrictions)
|
||||||
|
restrictions = restrictions or {}
|
||||||
local weaknessesInPlay = {}
|
local weaknessesInPlay = {}
|
||||||
local allObjects = getAllObjects()
|
local allObjects = getAllObjects()
|
||||||
for _, object in ipairs(allObjects) do
|
for _, object in ipairs(allObjects) do
|
||||||
@ -400,10 +426,29 @@ function buildAvailableWeaknesses(traits)
|
|||||||
if (weaknessesInPlay[weaknessId] ~= nil and weaknessesInPlay[weaknessId] > 0) then
|
if (weaknessesInPlay[weaknessId] ~= nil and weaknessesInPlay[weaknessId] > 0) then
|
||||||
weaknessesInPlay[weaknessId] = weaknessesInPlay[weaknessId] - 1
|
weaknessesInPlay[weaknessId] = weaknessesInPlay[weaknessId] - 1
|
||||||
else
|
else
|
||||||
if traits then
|
local eligible = true
|
||||||
|
|
||||||
|
-- disable 'Campaign only' weaknesses in standalone mode
|
||||||
|
if restrictions.standalone then
|
||||||
|
local card = cardIdIndex[weaknessId]
|
||||||
|
if card.metadata.modeRestriction == "Campaign" then
|
||||||
|
eligible = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- disable class restricted weaknesses
|
||||||
|
if restrictions.class then
|
||||||
|
local card = cardIdIndex[weaknessId]
|
||||||
|
if card.metadata.classRestriction and card.metadata.classRestriction ~= restrictions.class then
|
||||||
|
eligible = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- disable non-matching traits
|
||||||
|
if restrictions.traits then
|
||||||
-- split the string into separate traits (separated by "|")
|
-- split the string into separate traits (separated by "|")
|
||||||
local allowedTraits = {}
|
local allowedTraits = {}
|
||||||
for str in traits:gmatch("([^|]+)") do
|
for str in restrictions.traits:gmatch("([^|]+)") do
|
||||||
-- remove dots
|
-- remove dots
|
||||||
str = str:gsub("[%.]", "")
|
str = str:gsub("[%.]", "")
|
||||||
|
|
||||||
@ -415,15 +460,24 @@ function buildAvailableWeaknesses(traits)
|
|||||||
table.insert(allowedTraits, str)
|
table.insert(allowedTraits, str)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local match = false
|
||||||
|
|
||||||
-- make sure the trait is present on the weakness
|
-- make sure the trait is present on the weakness
|
||||||
local card = cardIdIndex[weaknessId]
|
local card = cardIdIndex[weaknessId]
|
||||||
for _, allowedTrait in ipairs(allowedTraits) do
|
for _, allowedTrait in ipairs(allowedTraits) do
|
||||||
if string.contains(string.lower(card.metadata.traits), allowedTrait) then
|
if string.contains(string.lower(card.metadata.traits), allowedTrait) then
|
||||||
table.insert(availableWeaknesses, weaknessId)
|
match = true
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
|
||||||
|
if not match then
|
||||||
|
eligible = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- add weakness to list if eligible
|
||||||
|
if eligible then
|
||||||
table.insert(availableWeaknesses, weaknessId)
|
table.insert(availableWeaknesses, weaknessId)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -28,9 +28,14 @@ do
|
|||||||
-- Gets a random basic weakness from the bag. Once a given ID has been returned it
|
-- Gets a random basic weakness from the bag. Once a given ID has been returned it
|
||||||
-- will be removed from the list and cannot be selected again until a reload occurs
|
-- will be removed from the list and cannot be selected again until a reload occurs
|
||||||
-- or the indexes are rebuilt, which will refresh the list to include all weaknesses.
|
-- or the indexes are rebuilt, which will refresh the list to include all weaknesses.
|
||||||
---@return string: ID of the selected weakness
|
---@param count number Number of weaknesses
|
||||||
AllCardsBagApi.getRandomWeaknessId = function()
|
---@param restrictions table Additional restrictions:
|
||||||
return getAllCardsBag().call("getRandomWeaknessId")
|
--- class string Class to restrict weakness to
|
||||||
|
--- standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
|
--- traits? string Trait(s) to use as filter
|
||||||
|
---@return table: Table with IDs of the selected weaknesses
|
||||||
|
AllCardsBagApi.getRandomWeaknessIds = function(count, restrictions)
|
||||||
|
return returnCopyOfList(getAllCardsBag().call("getRandomWeaknessIds", {count = count, restrictions = restrictions}))
|
||||||
end
|
end
|
||||||
|
|
||||||
AllCardsBagApi.isIndexReady = function()
|
AllCardsBagApi.isIndexReady = function()
|
||||||
@ -82,10 +87,13 @@ do
|
|||||||
|
|
||||||
-- Constructs a list of available basic weaknesses by starting with the full pool of basic
|
-- Constructs a list of available basic weaknesses by starting with the full pool of basic
|
||||||
-- weaknesses then removing any which are currently in the play or deck construction areas
|
-- weaknesses then removing any which are currently in the play or deck construction areas
|
||||||
---@param traits? string Trait(s) to use as filter
|
---@param restrictions table Additional restrictions:
|
||||||
|
--- class string Class to restrict weakness to
|
||||||
|
--- standalone boolean Whether 'Campaign only' weaknesses should be exluded
|
||||||
|
--- traits? string Trait(s) to use as filter
|
||||||
---@return table: Array of weakness IDs which are valid to choose from
|
---@return table: Array of weakness IDs which are valid to choose from
|
||||||
AllCardsBagApi.buildAvailableWeaknesses = function(traits)
|
AllCardsBagApi.buildAvailableWeaknesses = function(restrictions)
|
||||||
return returnCopyOfList(getAllCardsBag().call("buildAvailableWeaknesses", traits))
|
return returnCopyOfList(getAllCardsBag().call("buildAvailableWeaknesses", restrictions))
|
||||||
end
|
end
|
||||||
|
|
||||||
AllCardsBagApi.getUniqueWeaknesses = function()
|
AllCardsBagApi.getUniqueWeaknesses = function()
|
||||||
|
@ -104,7 +104,9 @@ local tokenColor = {
|
|||||||
[""] = "#77674DE6"
|
[""] = "#77674DE6"
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSave() return JSON.encode(sealedTokens) end
|
function updateSave()
|
||||||
|
self.script_state = JSON.encode(sealedTokens)
|
||||||
|
end
|
||||||
|
|
||||||
function onLoad(savedData)
|
function onLoad(savedData)
|
||||||
sealedTokens = JSON.decode(savedData) or {}
|
sealedTokens = JSON.decode(savedData) or {}
|
||||||
@ -185,6 +187,7 @@ end
|
|||||||
|
|
||||||
function resetSealedTokens()
|
function resetSealedTokens()
|
||||||
sealedTokens = {}
|
sealedTokens = {}
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- native event from TTS - used to update the context menu for cards like "Unrelenting"
|
-- native event from TTS - used to update the context menu for cards like "Unrelenting"
|
||||||
@ -228,6 +231,7 @@ function sealToken(name, playerColor)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
updateStackSize()
|
updateStackSize()
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
@ -244,6 +248,7 @@ function releaseOneToken(playerColor)
|
|||||||
else
|
else
|
||||||
printToColor("Releasing token", playerColor)
|
printToColor("Releasing token", playerColor)
|
||||||
putTokenAway(table.remove(sealedTokens))
|
putTokenAway(table.remove(sealedTokens))
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -262,6 +267,7 @@ function releaseMultipleTokens(playerColor)
|
|||||||
for i = 1, numRemoved do
|
for i = 1, numRemoved do
|
||||||
putTokenAway(table.remove(sealedTokens))
|
putTokenAway(table.remove(sealedTokens))
|
||||||
end
|
end
|
||||||
|
updateSave()
|
||||||
printToColor("Releasing " .. numRemoved .. " tokens", playerColor)
|
printToColor("Releasing " .. numRemoved .. " tokens", playerColor)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -276,6 +282,7 @@ function releaseAllTokens(playerColor)
|
|||||||
putTokenAway(guid)
|
putTokenAway(guid)
|
||||||
end
|
end
|
||||||
sealedTokens = {}
|
sealedTokens = {}
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -285,6 +292,7 @@ function returnMultipleTokens(playerColor)
|
|||||||
for i = 1, SHOW_MULTI_RETURN do
|
for i = 1, SHOW_MULTI_RETURN do
|
||||||
returnToken(table.remove(sealedTokens))
|
returnToken(table.remove(sealedTokens))
|
||||||
end
|
end
|
||||||
|
updateSave()
|
||||||
printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor)
|
printToColor("Returning " .. SHOW_MULTI_RETURN .. " tokens", playerColor)
|
||||||
else
|
else
|
||||||
printToColor("Not enough tokens sealed.", playerColor)
|
printToColor("Not enough tokens sealed.", playerColor)
|
||||||
@ -331,6 +339,7 @@ function resolveSealed()
|
|||||||
local resolvedToken = getObjectFromGUID(guidToBeResolved)
|
local resolvedToken = getObjectFromGUID(guidToBeResolved)
|
||||||
resolvedToken.UI.setXml("")
|
resolvedToken.UI.setXml("")
|
||||||
updateStackSize()
|
updateStackSize()
|
||||||
|
updateSave()
|
||||||
chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved)
|
chaosBagApi.drawChaosToken(mat, true, _, guidToBeResolved)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -603,9 +603,14 @@ function spawnStarterDeck(investigatorName, investigatorData, position)
|
|||||||
local cardIdList = {}
|
local cardIdList = {}
|
||||||
for id, count in pairs(slots) do
|
for id, count in pairs(slots) do
|
||||||
for i = 1, count do
|
for i = 1, count do
|
||||||
table.insert(cardIdList, id)
|
-- don't include mini-cards and investigators
|
||||||
|
local card = allCardsBagApi.getCardById(id)
|
||||||
|
if card and card.metadata and card.metadata.type ~= "Investigator" and card.metadata.type ~= "Minicard" then
|
||||||
|
table.insert(cardIdList, id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
spawnBag.spawn({
|
spawnBag.spawn({
|
||||||
name = investigatorName .. "starter",
|
name = investigatorName .. "starter",
|
||||||
cards = cardIdList,
|
cards = cardIdList,
|
||||||
@ -782,21 +787,17 @@ function spawnRandomWeakness(_, playerColor, isRightClick)
|
|||||||
prepareToPlaceCards()
|
prepareToPlaceCards()
|
||||||
|
|
||||||
if not isRightClick then
|
if not isRightClick then
|
||||||
local weaknessId = allCardsBagApi.getRandomWeaknessId()
|
local weaknessIds = allCardsBagApi.getRandomWeaknessIds(1)
|
||||||
if weaknessId == nil then
|
if weaknessIds[1] then
|
||||||
broadcastToAll("All basic weaknesses are in play!", { 0.9, 0.2, 0.2 })
|
spawnSingleWeakness(weaknessIds[1])
|
||||||
else
|
|
||||||
spawnSingleWeakness(weaknessId)
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
Player[playerColor].showInputDialog("Specify a trait for the weakness (split multiple eligible traits with '|'):", lastWeaknessTrait,
|
Player[playerColor].showInputDialog("Specify a trait for the weakness (split multiple eligible traits with '|'):", lastWeaknessTrait,
|
||||||
function(text)
|
function(text)
|
||||||
lastWeaknessTrait = text
|
lastWeaknessTrait = text
|
||||||
local availableWeaknesses = allCardsBagApi.buildAvailableWeaknesses(text)
|
local weaknessIds = allCardsBagApi.getRandomWeaknessIds(1, { traits = text })
|
||||||
if #availableWeaknesses > 0 then
|
if weaknessIds[1] then
|
||||||
spawnSingleWeakness(availableWeaknesses[math.random(#availableWeaknesses)])
|
spawnSingleWeakness(weaknessIds[1])
|
||||||
else
|
|
||||||
broadcastToAll("No matching weakness available!", { 0.9, 0.2, 0.2 })
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@ -808,6 +809,6 @@ function spawnSingleWeakness(weaknessId)
|
|||||||
name = "randomWeakness",
|
name = "randomWeakness",
|
||||||
cards = { weaknessId },
|
cards = { weaknessId },
|
||||||
globalPos = self.positionToWorld(startPositions.randomWeakness),
|
globalPos = self.positionToWorld(startPositions.randomWeakness),
|
||||||
rotation = FACE_UP_ROTATION,
|
rotation = FACE_UP_ROTATION
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
@ -261,9 +261,9 @@ INVESTIGATORS["Rex Murphy"] = {
|
|||||||
starterDeck = "2624958"
|
starterDeck = "2624958"
|
||||||
}
|
}
|
||||||
INVESTIGATORS["Jenny Barnes"] = {
|
INVESTIGATORS["Jenny Barnes"] = {
|
||||||
cards = { "02003" },
|
cards = { "02003", "02003-p", "02003-pf", "02003-pb" },
|
||||||
minicards = { "02003-m" },
|
minicards = { "02003-m" },
|
||||||
signatures = { "02010", "02011", "98002", "98003" },
|
signatures = { "02010", "02011", "90085", "90086", "98002", "98003" },
|
||||||
starterDeck = "2624961"
|
starterDeck = "2624961"
|
||||||
}
|
}
|
||||||
INVESTIGATORS["Jim Culver"] = {
|
INVESTIGATORS["Jim Culver"] = {
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
require("playercards/CardsWithHelper")
|
require("playercards/CardsWithHelper")
|
||||||
|
|
||||||
|
-- intentionally global
|
||||||
|
hasXML = false
|
||||||
|
isHelperEnabled = false
|
||||||
|
|
||||||
local chaosBagApi = require("chaosbag/ChaosBagApi")
|
local chaosBagApi = require("chaosbag/ChaosBagApi")
|
||||||
|
|
||||||
-- XML background color for each token
|
-- XML background color for each token
|
||||||
@ -14,18 +19,25 @@ local tokenColor = {
|
|||||||
[""] = "#77674DE6"
|
[""] = "#77674DE6"
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSave()
|
function updateSave()
|
||||||
return JSON.encode(sigil)
|
self.script_state = JSON.encode({
|
||||||
|
isHelperEnabled = isHelperEnabled,
|
||||||
|
sigil = sigil
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
function onLoad(savedData)
|
function onLoad(savedData)
|
||||||
self.addContextMenuItem("Enable Helper", chooseSigil)
|
if savedData and savedData ~= "" then
|
||||||
sigil = JSON.decode(savedData)
|
local loadedData = JSON.decode(savedData)
|
||||||
if sigil and sigil ~= nil then
|
isHelperEnabled = loadedData.isHelperEnabled
|
||||||
makeXMLButton()
|
sigil = loadedData.sigil
|
||||||
|
if sigil and sigil ~= nil then
|
||||||
|
makeXMLButton()
|
||||||
|
end
|
||||||
self.clearContextMenu()
|
self.clearContextMenu()
|
||||||
self.addContextMenuItem("Clear Helper", deleteButtons)
|
self.addContextMenuItem("Clear Helper", toggleHelper)
|
||||||
end
|
end
|
||||||
|
syncDisplayWithOptionPanel()
|
||||||
end
|
end
|
||||||
|
|
||||||
function makeXMLButton()
|
function makeXMLButton()
|
||||||
@ -57,13 +69,42 @@ function makeXMLButton()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
updateSave()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Create XML button to prompt choosing a sigil; acts as this card's helper
|
||||||
|
function initialize()
|
||||||
|
if sigil and sigil ~= nil then
|
||||||
|
makeXMLButton()
|
||||||
|
else
|
||||||
|
self.UI.setXmlTable({
|
||||||
|
{
|
||||||
|
tag = "Button",
|
||||||
|
attributes = {
|
||||||
|
height = 450,
|
||||||
|
width = 1400,
|
||||||
|
rotation = "0 0 180",
|
||||||
|
scale = "0.1 0.1 1",
|
||||||
|
position = "0 -55 -22",
|
||||||
|
padding = "50 50 50 50",
|
||||||
|
font = "font_teutonic-arkham",
|
||||||
|
fontSize = 300,
|
||||||
|
onClick = "chooseSigil",
|
||||||
|
color = "#77674DE6",
|
||||||
|
textColor = "White"
|
||||||
|
},
|
||||||
|
value = "Choose Sigil"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Create dialog window to choose sigil and create sigil-drawing button
|
-- Create dialog window to choose sigil and create sigil-drawing button
|
||||||
function chooseSigil(playerColor)
|
function chooseSigil(player)
|
||||||
Player[playerColor].clearSelectedObjects()
|
player.clearSelectedObjects()
|
||||||
self.clearContextMenu()
|
self.clearContextMenu()
|
||||||
self.addContextMenuItem("Clear Helper", deleteButtons)
|
self.addContextMenuItem("Clear Helper", toggleHelper)
|
||||||
|
|
||||||
-- get list of readable names
|
-- get list of readable names
|
||||||
local readableNames = {}
|
local readableNames = {}
|
||||||
@ -72,21 +113,19 @@ function chooseSigil(playerColor)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- prompt player to choose sigil
|
-- prompt player to choose sigil
|
||||||
Player[playerColor].showOptionsDialog("Choose Sigil", readableNames, 1,
|
player.showOptionsDialog("Choose Sigil", readableNames, 1,
|
||||||
function(chosenToken)
|
function(chosenToken)
|
||||||
sigil = Global.call("getChaosTokenName", chosenToken)
|
sigil = Global.call("getChaosTokenName", chosenToken)
|
||||||
makeXMLButton()
|
makeXMLButton()
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Delete button and remove sigil
|
function shutOff()
|
||||||
function deleteButtons(playerColor)
|
|
||||||
Player[playerColor].clearSelectedObjects()
|
|
||||||
self.clearContextMenu()
|
|
||||||
self.addContextMenuItem("Enable Helper", chooseSigil)
|
|
||||||
self.UI.setXml("")
|
self.UI.setXml("")
|
||||||
sigil = nil
|
sigil = nil
|
||||||
|
updateSave()
|
||||||
end
|
end
|
||||||
|
|
||||||
function resolveSigil()
|
function resolveSigil()
|
||||||
|
@ -451,14 +451,12 @@ function drawCardsWithReshuffle(numCards)
|
|||||||
local deckAreaObjects = getDeckAreaObjects()
|
local deckAreaObjects = getDeckAreaObjects()
|
||||||
|
|
||||||
-- Norman Withers handling
|
-- Norman Withers handling
|
||||||
local harbinger = false
|
local harbinger
|
||||||
if deckAreaObjects.topCard and deckAreaObjects.topCard.getName() == "The Harbinger" then
|
if deckAreaObjects.topCard then
|
||||||
harbinger = true
|
harbinger = isHarbinger(deckAreaObjects.topCard.getGMNotes())
|
||||||
elseif deckAreaObjects.draw and not deckAreaObjects.draw.is_face_down then
|
elseif deckAreaObjects.draw and not deckAreaObjects.draw.is_face_down then
|
||||||
local cards = deckAreaObjects.draw.getObjects()
|
local cards = deckAreaObjects.draw.getObjects()
|
||||||
if cards[#cards].name == "The Harbinger" then
|
harbinger = isHarbinger(cards[#cards].gm_notes)
|
||||||
harbinger = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if harbinger then
|
if harbinger then
|
||||||
@ -486,8 +484,7 @@ function drawCardsWithReshuffle(numCards)
|
|||||||
|
|
||||||
if deckSize >= numCards then
|
if deckSize >= numCards then
|
||||||
drawCards(numCards)
|
drawCards(numCards)
|
||||||
-- flip top card again for Norman
|
if topCardDetected then
|
||||||
if topCardDetected and string.match(activeInvestigatorId, "%d%d%d%d%d") == "08004" then
|
|
||||||
flipTopCardFromDeck()
|
flipTopCardFromDeck()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -496,8 +493,7 @@ function drawCardsWithReshuffle(numCards)
|
|||||||
shuffleDiscardIntoDeck()
|
shuffleDiscardIntoDeck()
|
||||||
Wait.time(function()
|
Wait.time(function()
|
||||||
drawCards(numCards - deckSize)
|
drawCards(numCards - deckSize)
|
||||||
-- flip top card again for Norman
|
if topCardDetected then
|
||||||
if topCardDetected and string.match(activeInvestigatorId, "%d%d%d%d%d") == "08004" then
|
|
||||||
flipTopCardFromDeck()
|
flipTopCardFromDeck()
|
||||||
end
|
end
|
||||||
end, 1)
|
end, 1)
|
||||||
@ -506,6 +502,11 @@ function drawCardsWithReshuffle(numCards)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function isHarbinger(notes)
|
||||||
|
local md = JSON.decode(notes or "") or {}
|
||||||
|
return md.id == "08006"
|
||||||
|
end
|
||||||
|
|
||||||
-- get the draw deck and discard pile objects and returns the references
|
-- get the draw deck and discard pile objects and returns the references
|
||||||
---@return table: string-indexed table with references to the found objects
|
---@return table: string-indexed table with references to the found objects
|
||||||
function getDeckAreaObjects()
|
function getDeckAreaObjects()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user