Merge branch 'main' into scroll-of-secrets

This commit is contained in:
Entrox-Licher 2023-11-11 10:14:28 -05:00 committed by GitHub
commit 9a2141cb82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 694 additions and 401 deletions

View File

@ -194,14 +194,15 @@
"OptionPanelSource.830bd0",
"SoundCube.3c988f",
"GameKeyHandler.fce69c",
"TokenSpawningReference.f8b3a7",
"3DText.d628cc",
"NavigationOverlayHandler.797ede",
"CampaignImporterExporter.334ee3",
"TokenArranger.022907",
"ChaosBagManager.023240",
"ArkhamSCE330-1092023-Page1.964222",
"PlaceholderBoxDummy.a93466",
"SoulsofDarkness.a94e6b"
"BaldursGateIII.695abd",
"ArkhamSCE340-1192023-Page1.964222"
],
"PlayArea": 1,
"PlayerCounts": [
@ -212,7 +213,7 @@
0,
0
],
"SaveName": "Arkham SCE - 3.3.0",
"SaveName": "Arkham SCE - 3.4.0",
"Sky": "Sky_Museum",
"SkyURL": "https://i.imgur.com/GkQqaOF.jpg",
"SnapPoints_path": "SnapPoints.json",
@ -222,4 +223,4 @@
"Turns_path": "Turns.json",
"VersionNumber": "v13.2.2",
"XmlUI": "\u003cInclude src=\"Global/Global.xml\"/\u003e"
}
}

View File

@ -41,7 +41,7 @@
"Transform": {
"posX": -19.5,
"posY": 1.697,
"posZ": -84,
"posZ": -87,
"rotX": 90,
"rotY": 90,
"rotZ": 0,

View File

@ -30,6 +30,8 @@
"AshcanPeteParallelFront.5294c3",
"AshcanPeteParallelBack.5294c3",
"AshcanPeteParallel.5294c3",
"EldritchTongue.e8765a",
"FalseSurrender.adf28e",
"TheNecronomicon.5b2e10",
"Rolands38Special.4edb91",
"StubbornDetective.4ea68b",

View File

@ -0,0 +1,10 @@
{
"id": "10128",
"type": "Asset",
"class": "Neutral",
"cost": 2,
"level": 0,
"traits": "Ritual.",
"willpowerIcons": 1,
"cycle": "The Feast of Hemlock Vale"
}

View File

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

View File

@ -5,5 +5,12 @@
"cost": 0,
"level": 3,
"traits": "Supply.",
"uses": [
{
"count": 4,
"type": "Supply",
"token": "resource"
}
],
"cycle": "The Path to Carcosa"
}

View File

@ -0,0 +1,11 @@
{
"id": "10070",
"type": "Event",
"class": "Rogue",
"cost": 1,
"level": 0,
"traits": "Tactic. Trick.",
"willpowerIcons": 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": 100,
"ColorDiffuse": {
"b": 0.71324,
"g": 0.71324,
"r": 0.71324
},
"CustomDeck": {
"1": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2172484009099794971/0D542175146E0E2FBBBDCC8110B32A573FDBB03E/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,
"UniqueBack": false
}
},
"Description": "",
"DragSelectable": true,
"GMNotes_path": "AllPlayerCards.15bb07/FalseSurrender.adf28e.gmnotes",
"GUID": "adf28e",
"Grid": true,
"GridProjection": false,
"Hands": true,
"HideWhenFaceDown": true,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "CardCustom",
"Nickname": "False Surrender",
"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

@ -15,7 +15,7 @@
"5": {
"BackIsHidden": true,
"BackURL": "https://i.imgur.com/EcbhVuh.jpg/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2172484009070978215/441D7A6C03C10EEFD166E4D336C77F50C7FEEB58/",
"FaceURL": "http://cloud-3.steamusercontent.com/ugc/2172484009099857520/D9FD0353EAE4B1CEB3A3F220C26B09543FD71BD3/",
"NumHeight": 1,
"NumWidth": 1,
"Type": 0,

View File

@ -7,5 +7,12 @@
"class": "Neutral",
"traits": "Task.",
"weakness": true,
"uses": [
{
"count": 0,
"type": "Resource",
"token": "resource"
}
],
"cycle": "Core"
}

View File

@ -4,5 +4,12 @@
"class": "Neutral",
"traits": "Task.",
"weakness": true,
"uses": [
{
"count": 0,
"type": "Resource",
"token": "resource"
}
],
"cycle": "Standalone"
}

View File

@ -3,7 +3,6 @@
"type": "Event",
"class": "Seeker",
"cost": 1,
"level": 0,
"traits": "Insight. Science.",
"cycle": "The Feast of Hemlock Vale"
}

View File

@ -1,227 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "Thanks for downloading Arkham SCE 3.3.0!\n\n- Added 2023-08-30 taboo list. Note that the prior 2022-08-26 taboo list is no longer supported.\n- Added some of the previewed player cards from Feast of Hemlock Vale.\n- Removed broken content from and cleaned up the community player card/investigator box.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "964222",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.3.0 - 10/9/2023 - Page 1",
"Snap": true,
"States": {
"2": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Added the following community contributions:\n Buffy the Vampire Slayer by AtomicZ!\n City of Secrets by Exhaled Innards!\n Circus Ex Mortis Investigator Expansion by The\n Beard!\n Heart of Darkness by Vinn Quest!\n The Red Coterie Investigators by\n Mattastrophic!\n (continued)",
"DragSelectable": true,
"GMNotes": "",
"GUID": "d7faf7",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.3.0 - 10/9/2023 - Page 2",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.88849,
"posY": 1.551499,
"posZ": -60.2882576,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"3": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": " The Sands of Memphis by Myriad!\n Souls of Darkness by JackOfHearts!\n- The options panel has a new option to spawn clickable counters only on \"0 uses\" cards. Try the \"Chef's Selection\" option for the best of both worlds!\n- Increased readability of master Clue Counter's text.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "50d85e",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.3.0 - 10/9/2023 - Page 3",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.88849,
"posY": 1.551499,
"posZ": -60.2882576,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"4": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- General refactoring of code involving encounter card drawing, metadata, and the deck importer.\n- Added context menu option to Well-Connected to auto-calculate its skill bonus.\n- Fixed clues not spawning properly at very high clue counts.\n- Underworld Market helper no longer breaks when saving and loading.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "e4e509",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.3.0 - 10/9/2023 - Page 4",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.88849,
"posY": 1.551499,
"posZ": -60.2882576,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
},
"5": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Fixed Token Arranger to be much less likely to \"explode\".\n- Resource spawning via hotkey on a card now auto-detects the right type of resource to spawn.\n- Various bits of community content have been updated to their most recent Workshop versions.\n\n- Thank you everyone for continuing to report bugs and create content for the mod!",
"DragSelectable": true,
"GMNotes": "",
"GUID": "c0ef49",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.3.0 - 10/9/2023 - Page 5",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -25.7359982,
"posY": 1.70084918,
"posZ": -59.9714432,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}
},
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.978,
"posY": 1.551,
"posZ": -56.165,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,92 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "Thanks for downloading Arkham SCE 3.4.0!\n\r\n- Revamped the download menu! This is now the primary way to access custom content instead of the container with placeholder boxes.\n- Added Parallel Jim and Parallel Zoey!\n- Added new community content!\n- Added a helper for Subject 5U-21.\r\n- Added a tool to hide unused playermats.\n",
"DragSelectable": true,
"GMNotes": "",
"GUID": "964222",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.4.0 - 11/9/2023 - Page 1",
"Snap": true,
"States": {
"2": {
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"Description": "- Added an image gallery for play area images.\n- Added QoL features for Norman Withers\r.\n\r- Added a discard gamekey.\r\n- Increased readability of master clue counter.\r\n- Cleaned up the option panel.\n- Added default camera states (Shift + 1/2).\n- Fixed bugs with discarding cards from hand, the token arranger, and taboo card widths.\r\n- Misc. metadata fixes.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "d7faf7",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Notecard",
"Nickname": "Arkham SCE 3.4.0 - 11/9/2023 - Page 2",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -23.74739,
"posY": 1.55149889,
"posZ": -57.1334763,
"rotX": 2.26350938e-8,
"rotY": 90.00001,
"rotZ": 2.55191921e-8,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}
},
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -27,
"posY": 1.551,
"posZ": -56.165,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}

View File

@ -0,0 +1,56 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"a": 0.27843,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2117314083163063648/B404BC484394C1B241A97479C3A1FDC8D33ADE2F/",
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 0
},
"Description": "by Mint Tea Fan",
"DragSelectable": true,
"GMNotes": "fancreations/investigators_baldurs_gate_3.json",
"GUID": "695abd",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "require(\"core/DownloadBox\")",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
"Nickname": " Baldur's Gate III",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26,
"posY": 1.481,
"posZ": -87,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 2.21,
"scaleY": 0.46,
"scaleZ": 2.42
},
"Value": 0,
"XmlUI": ""
}

View File

@ -34,7 +34,7 @@
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "require(\"core/PlayAreaSelector\")",
"LuaScriptState": "",
"LuaScriptState": "{\"selectionIndex\":1,\"typeIndex\":1}",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "Playmat Image Swapper",

View File

@ -1,85 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"AttachedDecals": [
{
"CustomDecal": {
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/959719855119695911/931B9829687A20F4DEADB36DA57B7E6D76792231/",
"Name": "dunwich_back",
"Size": 7.4
},
"Transform": {
"posX": -0.0021877822,
"posY": -0.08963572,
"posZ": -0.00288731651,
"rotX": 270,
"rotY": 359.869568,
"rotZ": 0,
"scaleX": 2.00000215,
"scaleY": 2.00000238,
"scaleZ": 2.00000262
}
}
],
"Autoraise": true,
"ColorDiffuse": {
"b": 0.40592,
"g": 0.40592,
"r": 0.40592
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "https://i.ibb.co/SrtzMNN/souls-of-darkness.png",
"MaterialIndex": 3,
"MeshURL": "https://raw.githubusercontent.com/RobMayer/TTSLibrary/master/advboxes/tuckbox_h_MSH.obj",
"NormalURL": "",
"TypeIndex": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "fancreations/campaign_souls_of_darkness.json",
"GUID": "a94e6b",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "require(\"core/DownloadBox\")",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
"Nickname": "Souls of Darkness",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -26.956,
"posY": 1.481,
"posZ": -84.507,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 2.21,
"scaleY": 0.46,
"scaleZ": 2.42
},
"Value": 0,
"XmlUI": ""
}

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,62 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0,
"g": 0,
"r": 0
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.2,
"Type": 3
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093238162/ACF3BBD93CB517B0BD0952E9BB78A2D35A62F377/",
"WidthScale": 0
},
"Description": "Press a numpad key to spawn the indicated token.",
"DragSelectable": true,
"GMNotes": "",
"GUID": "f8b3a7",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Token Spawning Reference",
"Snap": true,
"Sticky": true,
"Tags": [
"CameraZoom_ignore",
"CleanUpHelper_ignore",
"displacement_excluded"
],
"Tooltip": true,
"Transform": {
"posX": -48,
"posY": 1.48,
"posZ": 55,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 3,
"scaleY": 1,
"scaleZ": 3
},
"Value": 0,
"XmlUI": ""
}

View File

@ -9,17 +9,17 @@
"Order": 0
},
"ColorDiffuse": {
"b": 0.99796,
"g": 0.99623,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "",
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064421/956617F74D651E2B2CD1F7E7EC6B34C3A30617B2/",
"MaterialIndex": 0,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/1293045649230453355/2F68BC7FA71E051E2BBA46C0D1B06A5972D52E7C/",
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064278/BFF258FC90A0E56581C5C302752CF67C4947A540/",
"NormalURL": "",
"TypeIndex": 6
},
@ -47,14 +47,14 @@
"Tooltip": true,
"Transform": {
"posX": -47.73,
"posY": 1.624,
"posY": 1.55,
"posZ": 4,
"rotX": 0,
"rotY": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.3,
"scaleY": 0.3,
"scaleZ": 0.3
"scaleX": 0.75,
"scaleY": 1.0,
"scaleZ": 0.75
},
"Value": 0,
"XmlUI": ""

View File

@ -9,17 +9,17 @@
"Order": 0
},
"ColorDiffuse": {
"b": 0.99796,
"g": 0.99623,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "",
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064421/956617F74D651E2B2CD1F7E7EC6B34C3A30617B2/",
"MaterialIndex": 0,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/1293045649230453355/2F68BC7FA71E051E2BBA46C0D1B06A5972D52E7C/",
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064278/BFF258FC90A0E56581C5C302752CF67C4947A540/",
"NormalURL": "",
"TypeIndex": 6
},
@ -47,14 +47,14 @@
"Tooltip": true,
"Transform": {
"posX": -42.25,
"posY": 1.653,
"posY": 1.55,
"posZ": -19.3,
"rotX": 0,
"rotY": 0,
"rotY": 180,
"rotZ": 0,
"scaleX": 0.3,
"scaleY": 0.3,
"scaleZ": 0.3
"scaleX": 0.75,
"scaleY": 1.0,
"scaleZ": 0.75
},
"Value": 0,
"XmlUI": ""

View File

@ -9,17 +9,17 @@
"Order": 0
},
"ColorDiffuse": {
"b": 0.99796,
"g": 0.99623,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "",
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064421/956617F74D651E2B2CD1F7E7EC6B34C3A30617B2/",
"MaterialIndex": 0,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/1293045649230453355/2F68BC7FA71E051E2BBA46C0D1B06A5972D52E7C/",
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064278/BFF258FC90A0E56581C5C302752CF67C4947A540/",
"NormalURL": "",
"TypeIndex": 6
},
@ -47,14 +47,14 @@
"Tooltip": true,
"Transform": {
"posX": -42.25,
"posY": 1.664,
"posY": 1.55,
"posZ": 19.3,
"rotX": 0,
"rotY": 0,
"rotZ": 0,
"scaleX": 0.3,
"scaleY": 0.3,
"scaleZ": 0.3
"scaleX": 0.75,
"scaleY": 1.0,
"scaleZ": 0.75
},
"Value": 0,
"XmlUI": ""

View File

@ -9,17 +9,17 @@
"Order": 0
},
"ColorDiffuse": {
"b": 0.99796,
"g": 0.99623,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "",
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064421/956617F74D651E2B2CD1F7E7EC6B34C3A30617B2/",
"MaterialIndex": 0,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/1293045649230453355/2F68BC7FA71E051E2BBA46C0D1B06A5972D52E7C/",
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064278/BFF258FC90A0E56581C5C302752CF67C4947A540/",
"NormalURL": "",
"TypeIndex": 6
},
@ -47,14 +47,14 @@
"Tooltip": true,
"Transform": {
"posX": 0.493,
"posY": 1.656,
"posY": 1.55,
"posZ": 0,
"rotX": 0,
"rotY": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.4,
"scaleY": 0.3,
"scaleZ": 0.4
"scaleX": 0.75,
"scaleY": 1.0,
"scaleZ": 0.75
},
"Value": 0,
"XmlUI": ""

View File

@ -9,17 +9,17 @@
"Order": 0
},
"ColorDiffuse": {
"b": 0.99796,
"g": 0.99623,
"b": 1,
"g": 1,
"r": 1
},
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"DiffuseURL": "",
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064421/956617F74D651E2B2CD1F7E7EC6B34C3A30617B2/",
"MaterialIndex": 0,
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/1293045649230453355/2F68BC7FA71E051E2BBA46C0D1B06A5972D52E7C/",
"MeshURL": "http://cloud-3.steamusercontent.com/ugc/2172484009093064278/BFF258FC90A0E56581C5C302752CF67C4947A540/",
"NormalURL": "",
"TypeIndex": 6
},
@ -47,14 +47,14 @@
"Tooltip": true,
"Transform": {
"posX": -47.73,
"posY": 1.622,
"posY": 1.55,
"posZ": -4,
"rotX": 0,
"rotY": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.3,
"scaleY": 0.3,
"scaleZ": 0.3
"scaleX": 0.75,
"scaleY": 1.0,
"scaleZ": 0.75
},
"Value": 0,
"XmlUI": ""

View File

@ -7,7 +7,9 @@ local victoryDisplayApi = require("core/VictoryDisplayApi")
function onLoad()
addHotkey("Add Doom to Agenda", addDoomToAgenda)
addHotkey("Bless/Curse Status", showBlessCurseStatus)
addHotkey("Discard Object", discardObject)
addHotkey("Move card to Victory Display", moveCardToVictoryDisplay)
addHotkey("Remove a use", removeOneUse)
addHotkey("Take clue from location", takeClueFromLocation)
addHotkey("Upkeep", triggerUpkeep)
addHotkey("Upkeep (Multi-handed)", triggerUpkeepMultihanded)
@ -46,11 +48,142 @@ function addDoomToAgenda()
doomCounter.call("addVal", 1)
end
-- discard the hovered object to the respective trashcan and discard tokens on it if it was a card
function discardObject(playerColor, hoveredObject)
-- only continue if an unlocked card, deck or tile was hovered
if hoveredObject == nil
or (hoveredObject.type ~= "Card" and hoveredObject.type ~= "Deck" and hoveredObject.type ~= "Tile")
or hoveredObject.locked then
broadcastToColor("Hover a token/tile or a card/deck and try again.", playerColor, "Yellow")
return
end
-- warning for locations since these are usually not meant to be discarded
if hoveredObject.hasTag("Location") then
broadcastToAll("Watch out: A location was discarded.", "Yellow")
end
-- initialize list of objects to discard
local discardTheseObjects = { hoveredObject }
-- discard tokens / tiles on cards / decks
if hoveredObject.type ~= "Tile" then
for _, v in ipairs(searchOnObj(hoveredObject)) do
if v.hit_object.type == "Tile" then
table.insert(discardTheseObjects, v.hit_object)
end
end
end
local discardForMatColor = getColorToDiscardFor(hoveredObject, playerColor)
playmatApi.discardListOfObjects(discardForMatColor, discardTheseObjects)
end
-- helper function to get the player to trigger the discard function for
function getColorToDiscardFor(hoveredObject, playerColor)
local pos = hoveredObject.getPosition()
local closestMatColor = playmatApi.getMatColorByPosition(pos)
-- check if actually on the closest playmat
local closestMat = guidReferenceApi.getObjectByOwnerAndType(closestMatColor, "Playermat")
local bounds = closestMat.getBounds()
-- define the area "near" the playmat
local bufferAroundPlaymat = 2
local areaNearPlaymat = {}
areaNearPlaymat.minX = bounds.center.x - bounds.size.x / 2 - bufferAroundPlaymat
areaNearPlaymat.maxX = bounds.center.x + bounds.size.x / 2 + bufferAroundPlaymat
areaNearPlaymat.minZ = bounds.center.z - bounds.size.z / 2 - bufferAroundPlaymat
areaNearPlaymat.maxZ = bounds.center.z + bounds.size.z / 2 + bufferAroundPlaymat
-- discard to closest mat if near it, use triggering playmat if not
local discardForMatColor
if inArea(pos, areaNearPlaymat) then
return closestMatColor
else
return playmatApi.getMatColor(playerColor)
end
end
-- moves the hovered card to the victory display
function moveCardToVictoryDisplay(_, hoveredObject)
victoryDisplayApi.placeCard(hoveredObject)
end
-- removes a use from a card (or a token if hovered)
function removeOneUse(playerColor, hoveredObject)
-- only continue if an unlocked card or tile was hovered
if hoveredObject == nil
or (hoveredObject.type ~= "Card" and hoveredObject.type ~= "Tile")
or hoveredObject.locked then
broadcastToColor("Hover a token/tile or a card and try again.", playerColor, "Yellow")
return
end
local targetObject = nil
-- discard hovered token / tile
if hoveredObject.type == "Tile" then
targetObject = hoveredObject
elseif hoveredObject.type == "Card" then
-- grab the first use type from the metadata (or nil)
local notes = JSON.decode(hoveredObject.getGMNotes()) or {}
local usesData = notes.uses or {}
local useInfo = usesData[1] or {}
local searchForType = useInfo.type
if searchForType then searchForType = searchForType:lower() end
for _, v in ipairs(searchOnObj(hoveredObject)) do
local obj = v.hit_object
if obj.type == "Tile" and not obj.locked and obj.memo ~= "resourceCounter" then
-- check for matching object, otherwise use the first hit
if obj.memo == searchForType then
targetObject = obj
break
elseif not targetObject then
targetObject = obj
end
end
end
end
-- error handling
if not targetObject then
broadcastToColor("No tokens found!", playerColor, "Yellow")
return
end
-- handling for stacked tokens
if targetObject.getQuantity() > 1 then
targetObject = targetObject.takeObject()
end
-- feedback message
local tokenName = targetObject.getName()
if tokenName == "" then
if targetObject.memo ~= "" then
-- name handling for clue / doom
if targetObject.memo == "clueDoom" then
if targetObject.is_face_down then
tokenName = "Doom"
else
tokenName = "Clue"
end
else
tokenName = titleCase(targetObject.memo)
end
else
tokenName = "Unknown"
end
end
local playerName = Player[playerColor].steam_name
broadcastToAll(playerName .. " removed a token: " .. tokenName, playerColor)
local discardForMatColor = getColorToDiscardFor(hoveredObject, playerColor)
playmatApi.discardListOfObjects(discardForMatColor, { targetObject })
end
-- takes a clue from a location, player needs to hover the clue directly or the location
function takeClueFromLocation(playerColor, hoveredObject)
local cardName, clue
@ -58,7 +191,7 @@ function takeClueFromLocation(playerColor, hoveredObject)
if hoveredObject == nil then
broadcastToColor("Hover a clue or card with clues and try again.", playerColor, "Yellow")
return
elseif hoveredObject.tag == "Card" then
elseif hoveredObject.type == "Card" then
cardName = hoveredObject.getName()
for _, v in ipairs(searchOnObj(hoveredObject)) do
@ -91,7 +224,7 @@ function takeClueFromLocation(playerColor, hoveredObject)
for _, v in ipairs(search) do
local obj = v.hit_object
if obj.tag == "Card" then
if obj.type == "Card" then
cardName = obj.getName()
break
end
@ -152,3 +285,20 @@ function searchOnObj(obj)
origin = obj.getPosition()
})
end
-- Simple method to check if the given point is in a specified area
---@param point Vector Point to check, only x and z values are relevant
---@param bounds Table Defined area to see if the point is within
function inArea(point, bounds)
return (point.x > bounds.minX
and point.x < bounds.maxX
and point.z > bounds.minZ
and point.z < bounds.maxZ)
end
-- capitalizes the first letter
function titleCase(str)
local first = str:sub(1, 1)
local rest = str:sub(2)
return first:upper() .. rest:lower()
end

View File

@ -39,7 +39,7 @@ local MAT_COLORS = { "White", "Orange", "Green", "Red" }
local hideTitleSplashWaitFunctionId = nil
-- online functionality related variables
local MOD_VERSION = "3.3.0"
local MOD_VERSION = "3.4.0"
local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main'
local library, requestObj, modMeta
local acknowledgedUpgradeVersions = {}
@ -692,8 +692,10 @@ function onClick_select(_, _, identificationKey)
end
-- click function for the download button in the preview window
function onClick_download()
placeholder_download(library[contentToShow][currentListItem])
function onClick_download(player)
local params = library[contentToShow][currentListItem]
params.player = player
placeholder_download(params)
end
-- the download button on the placeholder objects calls this to directly initiate a download
@ -1020,10 +1022,37 @@ function contentDownloadCallback(request, params)
end
end
-- if spawned from menu, ping the position
-- if position is undefined, get empty position
if not spawnTable.position then
spawnTable.rotation = { 0, 270, 0}
local pos = getValidSpawnPosition()
if pos then
spawnTable.position = pos
else
broadcastToAll("Please make space in the area below the tentacle stand in the upper middle of the table and try again.", "Red")
return
end
end
-- if spawned from menu, move the camera and/or ping the table
if params.name then
spawnTable["callback_function"] = function(obj)
Player.getPlayers()[1].pingTable(obj.getPosition())
Wait.time(function()
-- move camera
if params.player then
params.player.lookAt({
position = obj.getPosition(),
pitch = 65,
yaw = 90,
distance = 65
})
end
-- ping object
local pingPlayer = params.player or Player.getPlayers()[1]
pingPlayer.pingTable(obj.getPosition())
end, 0.1)
end
end
@ -1034,6 +1063,41 @@ function contentDownloadCallback(request, params)
end
end
-- gets the first empty position to spawn a custom content object safely
function getValidSpawnPosition()
local potentialSpawnPositionX = { 65, 50, 35 }
local potentialSpawnPositionY = 1.5
local potentialSpawnPositionZ = { 35, 21, 7, -7, -21, -35 }
for i, posX in ipairs(potentialSpawnPositionX) do
for j, posZ in ipairs(potentialSpawnPositionZ) do
local pos = {
x = posX,
y = potentialSpawnPositionY,
z = posZ,
}
if checkPositionForContentSpawn(pos) then
return pos
end
end
end
return nil
end
-- checks whether something is in the specified position
-- returns true if empty
function checkPositionForContentSpawn(checkPos)
local search = Physics.cast({
direction = { 0, 1, 0 },
max_distance = 0.1,
type = 3,
size = { 0.1, 0.1, 0.1 },
origin = checkPos
})
-- first hit is the table surface, additional hits means something is there
return #search == 1
end
-- downloading of the library file
function libraryDownloadCallback(request)
if request.is_error or request.response_code ~= 200 then

View File

@ -145,6 +145,11 @@ function shouldSpawnTokens(card)
or metadata.type == "Enemy"
or metadata.type == "Treachery"
or metadata.weakness
-- hardcoded IDs for "Makeshift Trap" and "Shrine of the Moirai"
-- these cards are events with uses, that attach to encounter cards and thus will enter play in the playarea
-- TODO: probably turn this into a metadata field if we get more cards like that
or metadata.id == "07310"
or metadata.id == "09100"
end
function onCollisionExit(collisionInfo)

View File

@ -1,5 +1,5 @@
local tokenManager = require("core/token/TokenManager")
local playmatApi = require("playermat/PlaymatApi")
local tokenManager = require("core/token/TokenManager")
local clickableResourceCounter = nil
local foundTokens = 0
@ -47,7 +47,7 @@ end
function takeAll(playerColor)
searchSelf()
local matColor = playmatApi.getMatColorByPosition(self.getPosition())
playmatApi.updateCounter(matColor, "ResourceCounter", foundTokens)
playmatApi.updateCounter(matColor, "ResourceCounter", _, foundTokens)
if clickableResourceCounter then
clickableResourceCounter.call("updateVal", 0)

View File

@ -226,26 +226,23 @@ end
-- Discard buttons
---------------------------------------------------------
-- builds a function that discards things in searchPosition
-- stuff on the card/deck will be put into the local trashcan
function makeDiscardHandlerFor(searchPosition)
return function ()
local origin = self.positionToWorld(searchPosition)
for _, obj in ipairs(searchArea(origin, {2, 1, 3.2})) do
if isCardOrDeck(obj) then
if obj.hasTag("PlayerCard") then
placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation())
else
placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0})
end
-- put chaos tokens back into bag (e.g. Unrelenting)
elseif tokenChecker.isChaosToken(obj) then
local chaosBag = chaosBagApi.findChaosBag()
chaosBag.putObject(obj)
-- don't touch the table or this playmat itself
elseif obj.guid ~= "4ee1f2" and obj ~= self then
ownedObjects.Trash.putObject(obj)
-- handles discarding for a list of objects
---@param objList Table List of objects to discard
function discardListOfObjects(objList)
for _, obj in ipairs(objList) do
if isCardOrDeck(obj) then
if obj.hasTag("PlayerCard") then
placeOrMergeIntoDeck(obj, returnGlobalDiscardPosition(), self.getRotation())
else
placeOrMergeIntoDeck(obj, ENCOUNTER_DISCARD_POSITION, {x = 0, y = -90, z = 0})
end
-- put chaos tokens back into bag (e.g. Unrelenting)
elseif tokenChecker.isChaosToken(obj) then
local chaosBag = chaosBagApi.findChaosBag()
chaosBag.putObject(obj)
-- don't touch locked objects (like the table etc.)
elseif not obj.getLock() then
ownedObjects.Trash.putObject(obj)
end
end
end
@ -282,7 +279,7 @@ function placeOrMergeIntoDeck(obj, pos, rot)
function()
obj.use_hands = true
-- this avoids a TTS bug that merges unrelated cards that are not resting
if #searchResult == 1 then
if #searchResult == 1 and searchResult[1] ~= obj then
-- call this with avoiding errors (physics is sometimes too fast so the object doesn't exist for the put)
pcall(function() searchResult[1].putObject(obj) end)
end
@ -294,9 +291,13 @@ end
function makeDiscardButton(xValue, number)
local position = { xValue, 0.1, -0.94}
local searchPosition = {-position[1], position[2], position[3] + 0.32}
local handler = makeDiscardHandlerFor(searchPosition)
local handlerName = 'handler' .. number
self.setVar(handlerName, handler)
self.setVar(handlerName, function()
local cardSizeSearch = {2, 1, 3.2}
local globalSearchPosition = self.positionToWorld(searchPosition)
local searchResult = searchArea(globalSearchPosition, cardSizeSearch)
return discardListOfObjects(searchResult)
end)
self.createButton({
label = "Discard",
click_function = handlerName,
@ -504,7 +505,6 @@ end
-- utility function for Norman Withers to flip the top card to the revealed side
function flipTopCardFromDeck()
log("called")
Wait.time(function()
local deckAreaObjects = getDeckAreaObjects()
if deckAreaObjects.topCard then
@ -892,7 +892,7 @@ function clickableClues(showCounter)
local clueCount = 0
-- move clue counters
local modY = showcounter and -0.525 or 0.525
local modY = showCounter and 0.525 or -0.525
ownedObjects.ClickableClueCounter.setPosition(clickerPos + Vector(0, modY, 0))
if showCounter then

View File

@ -104,6 +104,15 @@ do
end
end
-- Handles discarding for the requested playmat for the provided list of objects
---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All")
---@param objList Table List of objects to discard
PlaymatApi.discardListOfObjects = function(matColor, objList)
for _, mat in pairs(getMatForColor(matColor)) do
mat.call("discardListOfObjects", objList)
end
end
-- Returns the active investigator id
---@param matColor String Color of the playmat - White, Orange, Green or Red (does not support "All")
PlaymatApi.returnInvestigatorId = function(matColor)