Merge branch 'main' into playermat-hider

This commit is contained in:
Chr1Z93 2024-01-15 12:04:21 +01:00
commit 28a8dee817
85 changed files with 2023 additions and 177 deletions

View File

@ -51,4 +51,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -46,11 +46,18 @@
"Hatchet1.2ea0d3",
"TokenofFaith3.2ea0d1",
"Transmogrify.9965dd",
"Absolution.aef183",
"Confound.9965de",
"StrongArmed1.294d6",
"SurvivalTechnique2.2ea0d4",
"ScrimshawCharm.c1fb2e",
"Vamp3.add233",
"Well-Dressed.c6ac33",
"FineTuning1.103fbd",
"PrismaticSpectacles2.3adcf5",
"DrainEssence.9965aa",
"FakeCredentials.acd38d",
"CatMask.847ed6",
"HardTimes.876557",
"PetesGuitar.876557",
"AshcanPeteParallelFront.5294c3",
@ -1610,6 +1617,7 @@
"AlessandraZorzi.54eaa5",
"Zamacona.541ba9",
"WickedAthame.c9fb1f",
"WolfMask.975d89",
"Beguile.019526",
"Ofuda.860c1e",
"Providential2.2cf42a",
@ -1617,10 +1625,26 @@
"IllPayYouBack.40e1ca",
"OccultReliquary3.acd0c2",
"Grift.df75d7",
"GuidedbyFaith.aef282",
"HankSamson.3764cc",
"HankSamson.3764cd",
"HankSamsonAssistant.3764ce",
"HankSamsonWarden.3764cf",
"HoldUp.aef182",
"PeltShipment.aa11bc",
"StirthePot5.add252",
"Snitch2.add242",
"WheresPa.9aba43",
"Persistence1.2cf51",
"Stouthearted.265ad2",
"ControlVariable.133868",
"BlackmailFile.de456d",
"SpeaktotheDead.c763aa",
"Accursed.e91c5e"
"Accursed.e91c5e",
"ThrowTheBookAtThem.d617ab",
"FoxMask.4144cd",
"MouseMask.32ad21"
],
"ContainedObjects_path": "AllPlayerCards.15bb07",
"Description": "",

View File

@ -0,0 +1,9 @@
{
"id": "10024",
"type": "Event",
"class": "Guardian",
"level": 0,
"traits": "Spell. Blessed.",
"willpowerIcons": 2,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 125300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1253": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186529136565/AE4B753BBB284EB12A0BDE36CEA3CD763C835AC0/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Absolution.aef183.gmnotes",
"GUID": "aef183",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Absolution",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -22,7 +22,7 @@
"UniqueBack": false
}
},
"Description": "Cursed Blade",
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/AncestralToken.c1fb1f.gmnotes",
"GUID": "c1fb1f",
@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,18 @@
{
"id": "10084",
"type": "Asset",
"class": "Mystic",
"cost": 1,
"level": 0,
"traits": "Item. Charm. Mask.",
"combatIcons": 1,
"willpowerIcons": 1,
"uses": [
{
"count": 2,
"type": "Offering",
"token": "resource"
}
],
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 40300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"403": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186559601365/6C247C82793481C97E24F74A26AF905E3B708C50/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Capricious Meddler",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/CatMask.847ed6.gmnotes",
"GUID": "847ed6",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Cat Mask",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10057",
"type": "Event",
"class": "Seeker",
"cost": 2,
"level": 3,
"traits": "Insight. Trick.",
"intellectIcons": 1,
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 124100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1241": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186529136671/AC1530FE71D9E5CF4F816A488E07076AC8064BD8/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Confound.9965de.gmnotes",
"GUID": "9965de",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Confound (3)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,18 @@
{
"id": "10067",
"type": "Asset",
"class": "Rogue",
"cost": 1,
"level": 0,
"traits": "Item. Charm. Mask.",
"intellectIcons": 1,
"agilityIcons": 1,
"uses": [
{
"count": 2,
"type": "Offering",
"token": "resource"
}
],
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 2500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"25": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2316603641240799540/C9D5A77FF0A0ED8DB1BBBBF0B02296B49E0E3CE8/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Wise Trickster",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/FoxMask.4144cd.gmnotes",
"GUID": "4144cd",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Fox Mask",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10025",
"type": "Event",
"class": "Guardian",
"cost": 2,
"level": 0,
"traits": "Spirit. Blessed.",
"intellectIcons": 1,
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 105100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1051": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255556703/D151EE26C6909481B57B07C1716A8E7BCED4B988/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/GuidedbyFaith.aef282.gmnotes",
"GUID": "aef282",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Guided by Faith",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 8474100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"84741": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557283/E14EDC6948598047D0D876439AD44E924073F6BF/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557407/20471F625A68290478EF8A681CBA7CB68E1CD521/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes": "{\n \"id\": \"10015-m\",\n \"type\": \"Minicard\"\n}",
"GUID": "3764cc",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Hank Samson",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Minicard"
],
"Tooltip": true,
"Transform": {
"posX": 5.756,
"posY": 3.649,
"posZ": 15.392,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.6,
"scaleY": 1,
"scaleZ": 0.6
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,21 @@
{
"id": "10015",
"type": "Investigator",
"class": "Survivor",
"traits": "Assistant. Warden.",
"bonded": [
{
"count": 1,
"id": "10015-b1"
},
{
"count": 1,
"id": "10015-b2"
}
],
"willpowerIcons": 3,
"intellectIcons": 1,
"combatIcons": 5,
"agilityIcons": 3,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 11600,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"116": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557149/D8D7CA505C221592685FFE01A493875A859DBE3F/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Farmhand",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/HankSamson.3764cd.gmnotes",
"GUID": "3764cd",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Hank Samson",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.227,
"posY": 3.548,
"posZ": 2.42,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10015-b1",
"type": "Investigator",
"class": "Survivor",
"traits": "Assistant. Resolute.",
"willpowerIcons": 3,
"intellectIcons": 3,
"combatIcons": 4,
"agilityIcons": 4,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 115200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1152": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255556877/A9A8E5091268C0B6D076058B2FC4B0FDECC62388/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Farmhand",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/HankSamsonAssistant.3764ce.gmnotes",
"GUID": "3764ce",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Hank Samson (Assistant)",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.227,
"posY": 3.548,
"posZ": 2.42,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10015-b2",
"type": "Investigator",
"class": "Survivor",
"traits": "Warden. Resolute",
"willpowerIcons": 4,
"intellectIcons": 1,
"combatIcons": 6,
"agilityIcons": 3,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 115300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1153": {
"BackIsHidden": true,
"BackURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557010/8DF21C152DA7F606A8037D24279E9517F8BB3E85/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557592/1223DD109412F49A37C56EB5164325C52F0F3924/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Farmhand",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/HankSamsonWarden.3764cf.gmnotes",
"GUID": "3764cf",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Hank Samson (Warden)",
"SidewaysCard": true,
"Snap": true,
"Sticky": true,
"Tags": [
"Investigator",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.227,
"posY": 3.548,
"posZ": 2.42,
"rotX": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 1.15,
"scaleY": 1,
"scaleZ": 1.15
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,11 @@
{
"id": "10026",
"type": "Event",
"class": "Guardian",
"cost": 1,
"level": 0,
"traits": "Tactic. Trick.",
"agilityIcons": 1,
"combatIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 105300,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1053": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557726/4725495E403D9EE65EF5F9136F700D429C81AF52/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/HoldUp.aef182.gmnotes",
"GUID": "aef182",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Hold Up",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,18 @@
{
"id": "10043",
"type": "Asset",
"class": "Seeker",
"cost": 1,
"level": 0,
"traits": "Item. Charm. Mask.",
"willpowerIcons": 1,
"intellectIcons": 1,
"uses": [
{
"count": 2,
"type": "Offering",
"token": "resource"
}
],
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 2400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"24": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2317731538678126539/603CACA51D3BB18D8E97BB18CE9DE3A6E517AFF6/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Meek Watcher",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/MouseMask.32ad21.gmnotes",
"GUID": "32ad21",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Mouse Mask",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,8 @@
{
"id": "10109",
"type": "Asset",
"class": "Survivor",
"level": 0,
"traits": "Item. Supply.",
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 51400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"514": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255557867/008C1DCB5CE961BEB32E83846BBEF4DA0F9EB38E/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/PeltShipment.aa11bc.gmnotes",
"GUID": "aa11bc",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Pelt Shipment",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.005,
"posY": 3.859,
"posZ": -16.695,
"rotX": 1,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,9 @@
{
"id": "10118",
"type": "Skill",
"class": "Survivor",
"level": 1,
"traits": "Innate.",
"wildIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 12400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"124": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255558022/32883D27BAD8B1BD11F955D75BC7DA0BB0C8BBC3/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Persistence1.2cf51.gmnotes",
"GUID": "2cf51",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Persistence (1)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,11 @@
{
"id": "10068",
"type": "Asset",
"slot": "Accessory",
"class": "Rogue",
"cost": 1,
"level": 0,
"traits": "Item. Charm. Cursed.",
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 49100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"491": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186529136814/A09D725A3E1532BDD790011406D8BB68D1F4D2C5/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "From Distant Shores",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/ScrimshawCharm.c1fb2e.gmnotes",
"GUID": "c1fb2e",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Scrimshaw Charm",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10078",
"type": "Event",
"class": "Rogue",
"cost": 1,
"level": 2,
"traits": "Favor. Trick.",
"agilityIcons": 1,
"intellectIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 10800,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"108": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255558157/7F564EC50CF2DED0C98A9D3AB8912C2ACA5C49F5/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Snitch2.add242.gmnotes",
"GUID": "add242",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Snitch (2)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10083",
"type": "Event",
"class": "Rogue",
"cost": 3,
"level": 5,
"traits": "Trick. Gambit.",
"intellectIcons": 1,
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 131500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1315": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255558285/956F8A6681A8C59624AFE2EE21D137D467182515/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/StirthePot5.add252.gmnotes",
"GUID": "add252",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Stir the Pot (5)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,11 @@
{
"id": "10017",
"type": "Event",
"class": "Neutral",
"cost": 2,
"traits": "Spirit.",
"combatIcons": 1,
"wildIcons": 1,
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 25200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"252": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255558420/A4269A773E17F55209B1DEBC2EA627314E1070E5/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Stouthearted.265ad2.gmnotes",
"GUID": "265ad2",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Stouthearted",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.325,
"posY": 3.548,
"posZ": -0.836,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,10 @@
{
"id": "10031",
"type": "Skill",
"class": "Guardian",
"level": 1,
"traits": "Innate.",
"agilityIcons": 1,
"combatIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 2100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"21": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186534148818/349C8EF53B9C78E4A0A9C22F7322423DF23AD5C7/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/StrongArmed1.294d6.gmnotes",
"GUID": "294d6",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Strong-Armed (1)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,10 @@
{
"id": "10123",
"type": "Asset",
"class": "Survivor",
"cost": 2,
"level": 2,
"traits": "Talent. Science.",
"agilityIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 52200,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"522": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186534148947/3C443D851F06103A1FC8D98195AE4B907A442385/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/SurvivalTechnique2.2ea0d4.gmnotes",
"GUID": "2ea0d4",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Survival Technique (2)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 9.005,
"posY": 3.859,
"posZ": -16.695,
"rotX": 1,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,11 @@
{
"id": "10049",
"type": "Event",
"class": "Seeker",
"cost": 1,
"level": 0,
"traits": "Gambit. Improvised.",
"intellectIcons": 1,
"combatIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 13100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"131": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2316603641240722224/B99E98444E70743A1A55DF86CC7EF09C9B4B43FF/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/ThrowTheBookAtThem.d617ab.gmnotes",
"GUID": "d617ab",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "\"Throw the Book at Them!\"",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": -7.159,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -59,4 +59,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,10 @@
{
"id": "10081",
"type": "Event",
"class": "Rogue",
"cost": 1,
"level": 3,
"traits": "Trick.",
"wildIcons": 2,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 14500,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"145": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324186529136955/D4A382DBA69D8CBD9671F2E9F1B55DAFA95F4C3D/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/Vamp3.add233.gmnotes",
"GUID": "add233",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Vamp (3)",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 13.082,
"posY": 3.548,
"posZ": 6.499,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -58,4 +58,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -0,0 +1,8 @@
{
"id": "10018",
"type": "Treachery",
"class": "Neutral",
"traits": "Flaw.",
"weakness": true,
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,61 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 910400,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"9104": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278324073255558543/20409C8476361342F4067117A61ABFC07326F948/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/WheresPa.9aba43.gmnotes",
"GUID": "9aba43",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Card",
"Nickname": "\"Where's Pa?\"",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 10.69,
"posY": 2.439,
"posZ": 43.876,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,18 @@
{
"id": "10023",
"type": "Asset",
"class": "Guardian",
"cost": 1,
"level": 0,
"traits": "Item. Charm. Mask.",
"agilityIcons": 1,
"combatIcons": 1,
"uses": [
{
"count": 2,
"type": "Offering",
"token": "resource"
}
],
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"CardID": 74100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"741": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2278323044302431462/6976437175C83B7356B6C95335C1ED88140CD57A/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "The Moon's Sire",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/WolfMask.975d89.gmnotes",
"GUID": "975d89",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "Wolf Mask",
"SidewaysCard": false,
"Snap": true,
"Sticky": true,
"Tags": [
"Asset",
"PlayerCard"
],
"Tooltip": true,
"Transform": {
"posX": 82.468,
"posY": 3.209,
"posZ": 18.322,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 1,
"scaleY": 1,
"scaleZ": 1
},
"Value": 0,
"XmlUI": ""
}

View File

@ -63,4 +63,4 @@
},
"Value": 0,
"XmlUI": ""
}
}

View File

@ -82,5 +82,5 @@
"scaleZ": 6.5
},
"Value": 0,
"XmlUI": ""
"XmlUI": "\u003cInclude src=\"MythosArea.xml\"/\u003e"
}

View File

@ -25,7 +25,7 @@ do
-- returns a table of object references to the tokens in play (does not include sealed tokens!)
ChaosBagApi.getTokensInPlay = function()
return Global.getTable("chaosTokens")
return Global.call("getChaosTokensinPlay")
end
-- returns all sealed tokens on cards to the chaos bag
@ -60,8 +60,8 @@ do
end
-- called by playermats (by the "Draw chaos token" button)
ChaosBagApi.drawChaosToken = function(mat, tokenOffset, isRightClick)
return Global.call("drawChaosToken", {mat, tokenOffset, isRightClick})
ChaosBagApi.drawChaosToken = function(mat, drawAdditional)
return Global.call("drawChaosToken", {mat = mat, drawAdditional = drawAdditional})
end
-- returns a Table List of chaos token ids in the current chaos bag

View File

@ -63,6 +63,7 @@ local GuidReferences = {
AllCardsBag = "15bb07",
BlessCurseManager = "5933fb",
CampaignThePathToCarcosa = "aca04c",
ChaosBagZone = "83ef06",
DataHelper = "708279",
DeckImporter = "a28140",
DoomCounter = "85c4c6",

View File

@ -1,17 +1,20 @@
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
local guidReferenceApi = require("core/GUIDReferenceApi")
local navigationOverlayApi = require("core/NavigationOverlayApi")
local optionPanelApi = require("core/OptionPanelApi")
local playmatApi = require("playermat/PlaymatApi")
local searchLib = require("util/SearchLib")
local victoryDisplayApi = require("core/VictoryDisplayApi")
function onLoad()
addHotkey("Add Doom to Agenda", addDoomToAgenda)
addHotkey("Bless/Curse Status", showBlessCurseStatus)
addHotkey("Discard Object", discardObject)
addHotkey("Add doom to agenda", addDoomToAgenda)
addHotkey("Discard object", discardObject)
addHotkey("Discard top card", discardTopDeck)
addHotkey("Display Bless/Curse status", showBlessCurseStatus)
addHotkey("Move card to Victory Display", moveCardToVictoryDisplay)
addHotkey("Remove a use", removeOneUse)
addHotkey("Switch seat clockwise", switchSeatClockwise)
addHotkey("Switch seat counter-clockwise", switchSeatCounterClockwise)
addHotkey("Take clue from location", takeClueFromLocation)
addHotkey("Upkeep", triggerUpkeep)
addHotkey("Upkeep (Multi-handed)", triggerUpkeepMultihanded)
@ -200,6 +203,59 @@ function removeOneUse(playerColor, hoveredObject)
playmatApi.discardListOfObjects(discardForMatColor, { targetObject })
end
-- switches the triggering player to the next seat (clockwise)
function switchSeatClockwise(playerColor)
switchSeat(playerColor, "clockwise")
end
-- switches the triggering player to the next seat (counter-clockwise)
function switchSeatCounterClockwise(playerColor)
switchSeat(playerColor, "counter-clockwise")
end
-- handles seat switching in the given direction
function switchSeat(playerColor, direction)
if playerColor == "Black" or playerColor == "Grey" then
broadcastToColor("This hotkey is only available to seated players.", playerColor, "Orange")
return
end
-- sort function for matcolors based on hand position (Green, White, Orange, Red)
local function sortByHandPosition(color1, color2)
local pos1 = Player[color1].getHandTransform().position
local pos2 = Player[color2].getHandTransform().position
return pos1.z > pos2.z
end
-- get used playermats
local usedColors = playmatApi.getUsedMatColors()
table.sort(usedColors, sortByHandPosition)
-- get current seat index
local index
for i, color in ipairs(usedColors) do
if color == playerColor then
index = i
break
end
end
if not index then
broadcastToColor("Couldn't detect investigator.", playerColor, "Orange")
return
end
-- get next color
index = index + ((direction == "clockwise") and -1 or 1)
if index == 0 then
index = #usedColors
elseif index > #usedColors then
index = 1
end
-- swap color
navigationOverlayApi.loadCamera(playerColor, usedColors[index])
end
-- takes a clue from a location, player needs to hover the clue directly or the location
function takeClueFromLocation(playerColor, hoveredObject)
local cardName, clue

View File

@ -30,9 +30,11 @@ local NOT_INTERACTABLE = {
"975c39", -- vertical border right
}
-- global variable for access
chaosTokens = {}
local chaosTokensLastMat = nil
local chaosTokens = {}
local chaosTokensLastMatGUID = nil
-- chaos token stat tracking
local tokenDrawingStats = { ["Overall"] = {} }
local bagSearchers = {}
local MAT_COLORS = { "White", "Orange", "Green", "Red" }
@ -110,27 +112,24 @@ ID_URL_MAP = {
['frost'] = {name = "Frost", url = 'http://cloud-3.steamusercontent.com/ugc/1858293462583104677/195F93C063A8881B805CE2FD4767A9718B27B6AE/'}
}
---------------------------------------------------------
-- data for chaos token stat tracker
---------------------------------------------------------
local tokenDrawingStats = {
["Overall"] = {},
["8b081b"] = {},
["bd0ff4"] = {},
["383d8b"] = {},
["0840d5"] = {}
}
---------------------------------------------------------
-- general code
---------------------------------------------------------
-- saving state of optionPanel to restore later
function onSave()
local chaosTokensGUID = {}
for _, obj in ipairs(chaosTokens) do
if obj ~= nil then
table.insert(chaosTokensGUID, obj.getGUID())
end
end
return JSON.encode({
optionPanel = optionPanel,
acknowledgedUpgradeVersions = acknowledgedUpgradeVersions
acknowledgedUpgradeVersions = acknowledgedUpgradeVersions,
chaosTokensLastMatGUID = chaosTokensLastMatGUID,
chaosTokensGUID = chaosTokensGUID
})
end
@ -140,6 +139,12 @@ function onLoad(savedData)
optionPanel = loadedData.optionPanel
acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions
updateOptionPanelState()
-- restore saved state for drawn chaos tokens
for _, guid in ipairs(loadedData.chaosTokensGUID or {}) do
table.insert(chaosTokens, getObjectFromGUID(guid))
end
chaosTokensLastMatGUID = loadedData.chaosTokensLastMatGUID
else
print("Saved state could not be found!")
end
@ -149,7 +154,6 @@ function onLoad(savedData)
if obj ~= nil then obj.interactable = false end
end
resetChaosTokenStatTracker()
getModVersion()
math.randomseed(os.time())
@ -163,8 +167,8 @@ end
-- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the
-- chaos bag during search operations to avoid this.
function onObjectSearchStart(object, playerColor)
chaosbag = findChaosBag()
if object == chaosbag then
local chaosBag = findChaosBag()
if object == chaosBag then
bagSearchers[playerColor] = true
end
end
@ -173,8 +177,8 @@ end
-- container is being searched, a TTS bug can cause tokens to duplicate or vanish. We lock the
-- chaos bag during search operations to avoid this.
function onObjectSearchEnd(object, playerColor)
chaosbag = findChaosBag()
if object == chaosbag then
local chaosBag = findChaosBag()
if object == chaosBag then
bagSearchers[playerColor] = nil
end
end
@ -200,21 +204,37 @@ function onObjectEnterZone(zone, enteringObj)
end
end
-- handle card drawing via number typing for multihanded gameplay
-- (and additionally allow Norman Withers to draw multiple cards via number)
function onObjectNumberTyped(hoveredObject, playerColor, number)
-- only continue for decks or cards
if hoveredObject.type ~= "Deck" and hoveredObject.type ~= "Card" then return end
-- check whether the hovered object is part of a players draw objects
for _, color in ipairs(playmatApi.getUsedMatColors()) do
local deckAreaObjects = playmatApi.getDeckAreaObjects(color)
if deckAreaObjects.topCard == hoveredObject or deckAreaObjects.draw == hoveredObject then
playmatApi.drawCardsWithReshuffle(color, number)
return true
end
end
end
---------------------------------------------------------
-- chaos token drawing
---------------------------------------------------------
-- checks scripting zone for chaos bag (also called by a lot of objects!)
function findChaosBag()
local chaosbag_zone = getObjectFromGUID("83ef06")
local chaosBagZone = guidReferenceApi.getObjectByOwnerAndType("Mythos", "ChaosBagZone")
-- error handling: scripting zone not found
if chaosbag_zone == nil then
if chaosBagZone == nil then
printToAll("Zone for chaos bag detection couldn't be found.", "Red")
return
end
for _, item in ipairs(chaosbag_zone.getObjects()) do
for _, item in ipairs(chaosBagZone.getObjects()) do
if item.getDescription() == "Chaos Bag" then
return item
end
@ -225,8 +245,9 @@ function findChaosBag()
end
function returnChaosTokens()
local chaosBag = findChaosBag()
for _, token in pairs(chaosTokens) do
if token ~= nil then chaosbag.putObject(token) end
if token ~= nil then chaosBag.putObject(token) end
end
chaosTokens = {}
end
@ -250,31 +271,30 @@ end
function drawChaosToken(params)
if not canTouchChaosTokens() then return end
local mat = params[1]
local tokenOffset = params[2]
local isRightClick = params[3]
chaosbag = findChaosBag()
local tokenOffset = {-1.55, 0.25, -0.58}
local matGUID = params.mat.getGUID()
-- return token(s) on other playmat first
if chaosTokensLastMat ~= nil and chaosTokensLastMat ~= mat and #chaosTokens ~= 0 then
if chaosTokensLastMatGUID ~= nil and chaosTokensLastMatGUID ~= matGUID and #chaosTokens ~= 0 then
returnChaosTokens()
chaosTokensLastMat = nil
chaosTokensLastMatGUID = nil
return
end
chaosTokensLastMat = mat
chaosTokensLastMatGUID = matGUID
-- if we have left clicked and have no tokens OR if we have right clicked
if isRightClick or #chaosTokens == 0 then
if #chaosbag.getObjects() == 0 then return end
chaosbag.shuffle()
if params.drawAdditional or #chaosTokens == 0 then
local chaosBag = findChaosBag()
if #chaosBag.getObjects() == 0 then return end
chaosBag.shuffle()
-- add the token to the list, compute new position based on list length
tokenOffset[1] = tokenOffset[1] + (0.17 * #chaosTokens)
local token = chaosbag.takeObject({
local token = chaosBag.takeObject({
index = 0,
position = mat.positionToWorld(tokenOffset),
rotation = mat.getRotation()
position = params.mat.positionToWorld(tokenOffset),
rotation = params.mat.getRotation()
})
-- get data for token description
@ -284,9 +304,8 @@ function drawChaosToken(params)
token.setDescription(specificData.description or "")
-- track the chaos token (for stat tracker and future returning)
trackChaosToken(name, mat.getGUID())
trackChaosToken(name, matGUID)
chaosTokens[#chaosTokens + 1] = token
return
else
returnChaosTokens()
end
@ -308,6 +327,10 @@ end
---------------------------------------------------------
function trackChaosToken(tokenName, matGUID)
-- initialize tables
if not tokenDrawingStats[matGUID] then tokenDrawingStats[matGUID] = {} end
-- increase stats by 1
tokenDrawingStats["Overall"][tokenName] = (tokenDrawingStats["Overall"][tokenName] or 0) + 1
tokenDrawingStats[matGUID][tokenName] = (tokenDrawingStats[matGUID][tokenName] or 0) + 1
end
@ -333,7 +356,7 @@ function handleStatTrackerClick(_, _, isRightClick)
playerColor = playmatApi.getPlayerColor(matColor)
playerName = Player[playerColor].steam_name or playerColor
local playerSquidCount = personalStats["Auto-fail"]
local playerSquidCount = personalStats["Auto-fail"] or 0
if playerSquidCount > maxSquid then
squidKing = playerName
maxSquid = playerSquidCount
@ -373,12 +396,7 @@ end
-- resets the count for each token to 0
function resetChaosTokenStatTracker()
for key, _ in pairs(tokenDrawingStats) do
tokenDrawingStats[key] = {}
for _, token in pairs(ID_URL_MAP) do
tokenDrawingStats[key][token.name] = 0
end
end
tokenDrawingStats = { ["Overall"] = {} }
end
---------------------------------------------------------
@ -509,14 +527,20 @@ function createChaosTokenNameLookupTable()
return namesToIds
end
-- returns the currently drawn chaos tokens
---@api ChaosBagApi
function getChaosTokensinPlay()
return chaosTokens
end
-- returns a Table List of chaos token ids in the current chaos bag
---@api chaosbag/ChaosBagApi
---@api ChaosBag / ChaosBagApi
function getChaosBagState()
local tokens = {}
local invertedTable = createChaosTokenNameLookupTable()
local chaosbag = findChaosBag()
local chaosBag = findChaosBag()
for _, v in ipairs(chaosbag.getObjects()) do
for _, v in ipairs(chaosBag.getObjects()) do
local id = invertedTable[v.name]
if id then
table.insert(tokens, id)
@ -530,12 +554,12 @@ end
-- respawns the chaos bag with a new state of tokens
---@param tokenList Table List of chaos token ids
---@api chaosbag/ChaosBagApi
---@api ChaosBag / ChaosBagApi
function setChaosBagState(tokenList)
if not canTouchChaosTokens() then return end
local chaosbag = findChaosBag()
local chaosbagData = chaosbag.getData()
local chaosBag = findChaosBag()
local chaosBagData = chaosBag.getData()
local reserveData = getObjectFromGUID("106418").getData()
local tokenCache = {}
local containedObjects = {}
@ -552,16 +576,16 @@ function setChaosBagState(tokenList)
end
-- overwrite chaos bag content and respawn it
chaosbagData.ContainedObjects = containedObjects
chaosbag.destruct()
spawnObjectData({ data = chaosbagData })
chaosBagData.ContainedObjects = containedObjects
chaosBag.destruct()
spawnObjectData({ data = chaosBagData })
-- remove tokens that are still in play
for _, token in pairs(chaosTokens) do
if token ~= nil then token.destruct() end
end
chaosTokens = {}
chaosTokensLastMat = nil
chaosTokensLastMatGUID = nil
-- reset bless / curse manager
blessCurseManagerApi.removeTakenTokensAndReset()
@ -575,7 +599,7 @@ function spawnChaosToken(id)
if not canTouchChaosTokens() then return end
id = id:lower()
local chaosbag = findChaosBag()
local chaosBag = findChaosBag()
local url = ID_URL_MAP[id].url or ""
if url ~= "" then
@ -586,7 +610,7 @@ function spawnChaosToken(id)
rotation = { 0, 270, 0 },
callback_function = function(obj)
obj.setName(ID_URL_MAP[id].name)
chaosbag.putObject(obj)
chaosBag.putObject(obj)
tokenArrangerApi.layout()
end
}).setCustomObject({
@ -603,10 +627,10 @@ function removeChaosToken(id)
if not canTouchChaosTokens() then return end
local tokens = {}
local chaosbag = findChaosBag()
local chaosBag = findChaosBag()
local name = ID_URL_MAP[id].name
for _, v in ipairs(chaosbag.getObjects()) do
for _, v in ipairs(chaosBag.getObjects()) do
if v.name == name then table.insert(tokens, v.guid) end
end
@ -616,7 +640,7 @@ function removeChaosToken(id)
return
end
chaosbag.takeObject({
chaosBag.takeObject({
guid = tokens[1],
smooth = false,
callback_function = function(obj)
@ -631,15 +655,15 @@ end
function emptyChaosBag()
if not canTouchChaosTokens() then return end
local chaosbag = findChaosBag()
for _, object in ipairs(chaosbag.getObjects()) do
chaosbag.takeObject({ callback_function = function(item) item.destruct() end })
local chaosBag = findChaosBag()
for _, object in ipairs(chaosBag.getObjects()) do
chaosBag.takeObject({ callback_function = function(item) item.destruct() end })
end
end
-- returns all sealed tokens on cards to the chaos bag
function releaseAllSealedTokens(playerColor)
local chaosbag = findChaosBag()
local chaosBag = findChaosBag()
for _, obj in ipairs(getObjectsWithTag("CardThatSeals")) do
obj.call("releaseAllTokens", playerColor)
end

View File

@ -134,13 +134,6 @@ end
function getEncounterDeck()
local searchResult = searchLib.atPosition(ENCOUNTER_DECK_POS, "isCardOrDeck")
for _, obj in ipairs(searchResult) do
if obj.type == 'Deck' then
return obj
end
end
-- if no deck was found, return the first hit (a card)
if #searchResult > 0 then
return searchResult[1]
end
@ -151,6 +144,7 @@ function drawEncounterCard(params)
local encounterDeck = getEncounterDeck()
if encounterDeck then
reshuffledAlready = false
local card
if encounterDeck.type == "Deck" then
card = encounterDeck.takeObject()
@ -160,7 +154,13 @@ function drawEncounterCard(params)
actualEncounterCardDraw(card, params)
else
-- nothing here, time to reshuffle
reshuffleEncounterDeck(params)
if reshuffledAlready == true then
reshuffledAlready = false
return
end
reshuffleEncounterDeck() -- if there is no discard pile either, reshuffleEncounterDeck will give an error message already
reshuffledAlready = true
drawEncounterCard(params)
end
end
@ -172,30 +172,41 @@ function actualEncounterCardDraw(card, params)
faceUpRotation = 180
end
end
deckLib.placeOrMergeIntoDeck(card, params.pos, { 0, params.rotY, faceUpRotation })
local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625}
local pos = params.mat.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET)
local rotY = params.mat.getRotation().y
deckLib.placeOrMergeIntoDeck(card, pos, { 0, rotY, faceUpRotation })
end
function reshuffleEncounterDeck(params)
function reshuffleEncounterDeck()
-- flag to avoid multiple calls
if isReshuffling then return end
isReshuffling = true
-- shuffle and flip deck, draw card after completion
local searchResult = searchLib.atPosition(ENCOUNTER_DISCARD_POSITION, "isCardOrDeck")
if #searchResult > 0 then
local deck = searchResult[1]
if not deck.is_face_down then deck.flip() end
deck.shuffle()
deck.setPositionSmooth(Vector(ENCOUNTER_DECK_POS) + Vector(0, 2, 0), false, true)
Wait.time(function() actualEncounterCardDraw(deck.takeObject({ index = 0 }), params) end, 0.5)
local encounterDeck = getEncounterDeck()
local discardPile = searchLib.atPosition(ENCOUNTER_DISCARD_POSITION, "isCardOrDeck")
if #discardPile > 0 then
local discardDeck = discardPile[1]
if not discardDeck.is_face_down then --flips discard pile
discardDeck.setRotation({0, -90, 180})
end
if encounterDeck == nil then
discardDeck.setPosition(Vector(ENCOUNTER_DECK_POS) + Vector({0, 1, 0}))
discardDeck.shuffle()
else
encounterDeck.putObject(discardDeck)
encounterDeck.shuffle()
end
broadcastToAll("Shuffled encounter discard into deck.", "White")
else
printToAll("Couldn't find encounter discard pile to reshuffle.", { 1, 0, 0 })
broadcastToAll("Encounter discard pile is already empty.", "Red")
end
-- disable flag
Wait.time(function() isReshuffling = false end, 1)
end
---------------------------------------------------------
-- helper functions
---------------------------------------------------------

View File

@ -16,13 +16,9 @@ do
return getMythosArea().call("getEncounterDeck")
end
-- draw an encounter card to the requested position/rotation
MythosAreaApi.drawEncounterCard = function(pos, rotY, alwaysFaceUp)
getMythosArea().call("drawEncounterCard", {
pos = pos,
rotY = rotY,
alwaysFaceUp = alwaysFaceUp
})
-- draw an encounter card for the requesting mat
MythosAreaApi.drawEncounterCard = function(mat, alwaysFaceUp)
getMythosArea().call("drawEncounterCard", {mat = mat, alwaysFaceUp = alwaysFaceUp})
end
return MythosAreaApi

View File

@ -22,5 +22,15 @@ do
getNOHandler().call("cycleVisibility", playerColor)
end
-- loads the specified camera for a player
---@param player TTSPlayerInstance Player whose camera should be moved
---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to
NavigationOverlayApi.loadCamera = function(playerColor, camera)
getNOHandler().call("loadCameraFromApi", {
playerColor = playerColor,
camera = camera
})
end
return NavigationOverlayApi
end

View File

@ -291,9 +291,30 @@ function getDynamicViewBounds(objList)
return totalBounds
end
function loadCameraFromApi(params)
loadCamera(Player[params.playerColor], params.camera)
end
-- loads the specified camera for a player
function loadCamera(player, index)
local lookHere
---@param player TTSPlayerInstance Player whose camera should be moved
---@param camera Variant If number: Index of the camera view to load | If string: Color of the playermat to swap to
function loadCamera(player, camera)
local lookHere, index, matColor
local matColorList = { "White", "Orange", "Green", "Red" }
local indexList = {
White = 3,
Orange = 4,
Green = 5,
Red = 6
}
if tonumber(camera) then
index = tonumber(camera)
matColor = matColorList[index - 2] -- mat index 1 - 4
else
index = indexList[camera]
matColor = camera
end
-- dynamic view of the play area
if index == 2 then
@ -307,9 +328,6 @@ function loadCamera(player, index)
}
-- dynamic view of the clicked play mat
elseif index >= 3 and index <= 6 then
local matColorList = { "White", "Orange", "Green", "Red" }
local matColor = matColorList[index - 2] -- mat index 1 - 4
-- check if anyone (except for yourself) has claimed this color
local isClaimed = false
@ -325,6 +343,7 @@ function loadCamera(player, index)
local newPlayerColor = playmatApi.getPlayerColor(matColor)
copyVisibility({ startColor = player.color, targetColor = newPlayerColor })
player.changeColor(newPlayerColor)
player = Player[newPlayerColor]
end
-- search on the playmat for objects

View File

@ -113,7 +113,8 @@ INVESTIGATOR_GROUPS = {
"Stella Clark",
"Silas Marsh",
"Bob Jenkins",
"Darrell Simmons"
"Darrell Simmons",
"Hank Samson"
},
["Neutral"] = {
"Lola Hayes",
@ -198,7 +199,8 @@ INVESTIGATOR_GROUPS = {
"Wilson Richards",
"Kate Winthrop",
"Alessandra Zorzi",
"Kōhaku Narukami"
"Kōhaku Narukami",
"Hank Samson"
}
}
@ -556,6 +558,12 @@ INVESTIGATORS["Kōhaku Narukami"] = {
signatures = { "10013", "10014" },
starterDeck = "2636199" --gloria deck as placeholder
}
INVESTIGATORS["Hank Samson"] = {
cards = { "10015", "10015-b1", "10015-b2" },
minicards = { "10015-m" },
signatures = { "10017", "10018"},
starterDeck = "2643934" --stella deck as placeholder
}
-- PnP content
INVESTIGATORS["Subject 5U-21"] = {
cards = { "89001" },

View File

@ -1,62 +1,56 @@
local BUTTON_PARAMETERS = {}
BUTTON_PARAMETERS.function_owner = self
BUTTON_PARAMETERS.height = 650
BUTTON_PARAMETERS.width = 700
BUTTON_PARAMETERS.position = { x = -4.775, y = 0.1, z = -0.03 }
BUTTON_PARAMETERS.color = { 0, 0, 0, 0 }
BUTTON_PARAMETERS.font_color = { 0, 0, 0, 100 }
BUTTON_PARAMETERS.font_size = 450
local buttonParameters = {}
buttonParameters.function_owner = self
buttonParameters.height = 650
buttonParameters.width = 700
buttonParameters.position = { x = -4.775, y = 0.1, z = -0.03 }
buttonParameters.color = { 0, 0, 0, 0 }
buttonParameters.font_color = { 0, 0, 0, 100 }
buttonParameters.font_size = 450
function onSave() return JSON.encode(stats) end
-- load stats and make buttons (left to right)
function onLoad(saved_data)
stats = JSON.decode(saved_data) or { 1, 1, 1, 1 }
function onLoad(savedData)
stats = JSON.decode(savedData) or { 1, 1, 1, 1 }
for i = 1, 4 do
BUTTON_PARAMETERS.label = stats[i] .. " "
BUTTON_PARAMETERS.position.x = BUTTON_PARAMETERS.position.x + 1.91
BUTTON_PARAMETERS.click_function = attachIndex("button_click", i)
self.createButton(BUTTON_PARAMETERS)
for index = 1, 4 do
local fnName = "buttonClick" .. index
_G[fnName] = function(_, _, isRightClick) buttonClick(isRightClick, index) end
buttonParameters.click_function = fnName
buttonParameters.position.x = buttonParameters.position.x + 1.91
self.createButton(buttonParameters)
updateButtonLabel(index)
end
self.addContextMenuItem("Reset to 1s", function() updateStats({ 1, 1, 1, 1 }) end)
end
-- helper function to carry index
function attachIndex(click_function, index)
local fn_name = click_function .. index
_G[fn_name] = function(obj, player_color, isRightClick)
_G[click_function](obj, player_color, isRightClick, index)
end
return fn_name
end
function button_click(_, _, isRightClick, index)
function buttonClick(isRightClick, index)
stats[index] = math.min(math.max(stats[index] + (isRightClick and -1 or 1), 0), 99)
changeButton(index)
updateButtonLabel(index)
end
function changeButton(index)
local font_size = BUTTON_PARAMETERS.font_size
-- sync the button label to the internal value
function updateButtonLabel(index)
local fontSize = buttonParameters.font_size
local whitespace = " "
if stats[index] > 9 then
font_size = BUTTON_PARAMETERS.font_size * 0.65
fontSize = buttonParameters.font_size * 0.65
whitespace = " "
end
self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = font_size })
self.editButton({ index = index - 1, label = stats[index] .. whitespace, font_size = fontSize })
end
-- formatting of "newStats": {Willpower, Intellect, Fight, Agility}
-- update the stats to the provided values
---@param newStats Table Contains the new values for the stats: {Willpower, Intellect, Fight, Agility}
function updateStats(newStats)
if newStats and #newStats == 4 then
stats = newStats
for i = 1, 4 do updateButtonLabel(i) end
elseif newStats then
printToAll("Provided new stats are incomplete or incorrectly formatted.", "Red")
return
end
for i = 1, 4 do changeButton(i) end
end

View File

@ -10,10 +10,6 @@ local tokenManager = require("core/token/TokenManager")
-- we use this to turn off collision handling until onLoad() is complete
local collisionEnabled = false
-- position offsets relative to mat [x, y, z]
local DRAWN_ENCOUNTER_CARD_OFFSET = {1.365, 0.5, -0.625}
local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58}
-- x-Values for discard buttons
local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91}
@ -787,13 +783,11 @@ end
---------------------------------------------------------
function drawChaosTokenButton(_, _, isRightClick)
chaosBagApi.drawChaosToken(self, DRAWN_CHAOS_TOKEN_OFFSET, isRightClick)
chaosBagApi.drawChaosToken(self, isRightClick)
end
function drawEncounterCard(_, _, isRightClick)
local pos = self.positionToWorld(DRAWN_ENCOUNTER_CARD_OFFSET)
local rotY = self.getRotation().y
mythosAreaApi.drawEncounterCard(pos, rotY, isRightClick)
mythosAreaApi.drawEncounterCard(self, isRightClick)
end
function returnGlobalDiscardPosition()

View File

@ -1,6 +1,7 @@
do
local PlaymatApi = {}
local guidReferenceApi = require("core/GUIDReferenceApi")
local searchLib = require("util/SearchLib")
-- Convenience function to look up a mat's object by color, or get all mats.
---@param matColor String Color of the playmat - White, Orange, Green, Red or All
@ -180,6 +181,15 @@ do
end
end
-- triggers the draw function for the specified playmat
---@param matColor String Color of the playmat - White, Orange, Green, Red or All
---@param number Number Amount of cards to draw
PlaymatApi.drawCardsWithReshuffle = function(matColor, number)
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("drawCardsWithReshuffle", number)
end
end
-- returns the resource counter amount
---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All")
---@param type String Counter to target
@ -189,6 +199,22 @@ do
end
end
-- returns a list of mat colors that have an investigator placed
PlaymatApi.getUsedMatColors = function()
local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 }
local usedColors = {}
for matColor, mat in pairs(getMatForColor("All")) do
local searchPos = mat.positionToWorld(localInvestigatorPosition)
local searchResult = searchLib.atPosition(searchPos, "isCardOrDeck")
if #searchResult > 0 then
table.insert(usedColors, matColor)
end
end
return usedColors
end
-- resets the specified skill tracker to "1, 1, 1, 1"
---@param matColor String Color of the playmat - White, Orange, Green, Red or All
PlaymatApi.resetSkillTracker = function(matColor)

3
xml/MythosArea.xml Normal file
View File

@ -0,0 +1,3 @@
<Panel position="160 70 -13" rotation="0 0 180" height="74" width="315">
<Button scale="0.1 0.1 1" color="#ffffff00" textColors="#ffffff|#88e3cf|#4f8478" font="font_teutonic-arkham" fontSize="62" onClick="reshuffleEncounterDeck">Reshuffle ➡</Button>
</Panel>