Merge branch 'main' into scroll-of-secrets
This commit is contained in:
commit
9a2141cb82
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@
|
||||
"Transform": {
|
||||
"posX": -19.5,
|
||||
"posY": 1.697,
|
||||
"posZ": -84,
|
||||
"posZ": -87,
|
||||
"rotX": 90,
|
||||
"rotY": 90,
|
||||
"rotZ": 0,
|
||||
|
@ -30,6 +30,8 @@
|
||||
"AshcanPeteParallelFront.5294c3",
|
||||
"AshcanPeteParallelBack.5294c3",
|
||||
"AshcanPeteParallel.5294c3",
|
||||
"EldritchTongue.e8765a",
|
||||
"FalseSurrender.adf28e",
|
||||
"TheNecronomicon.5b2e10",
|
||||
"Rolands38Special.4edb91",
|
||||
"StubbornDetective.4ea68b",
|
||||
|
10
objects/AllPlayerCards.15bb07/EldritchTongue.e8765a.gmnotes
Normal file
10
objects/AllPlayerCards.15bb07/EldritchTongue.e8765a.gmnotes
Normal 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"
|
||||
}
|
62
objects/AllPlayerCards.15bb07/EldritchTongue.e8765a.json
Normal file
62
objects/AllPlayerCards.15bb07/EldritchTongue.e8765a.json
Normal 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": ""
|
||||
}
|
@ -5,5 +5,12 @@
|
||||
"cost": 0,
|
||||
"level": 3,
|
||||
"traits": "Supply.",
|
||||
"uses": [
|
||||
{
|
||||
"count": 4,
|
||||
"type": "Supply",
|
||||
"token": "resource"
|
||||
}
|
||||
],
|
||||
"cycle": "The Path to Carcosa"
|
||||
}
|
||||
|
11
objects/AllPlayerCards.15bb07/FalseSurrender.adf28e.gmnotes
Normal file
11
objects/AllPlayerCards.15bb07/FalseSurrender.adf28e.gmnotes
Normal 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"
|
||||
}
|
61
objects/AllPlayerCards.15bb07/FalseSurrender.adf28e.json
Normal file
61
objects/AllPlayerCards.15bb07/FalseSurrender.adf28e.json
Normal 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": ""
|
||||
}
|
@ -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,
|
||||
|
@ -7,5 +7,12 @@
|
||||
"class": "Neutral",
|
||||
"traits": "Task.",
|
||||
"weakness": true,
|
||||
"uses": [
|
||||
{
|
||||
"count": 0,
|
||||
"type": "Resource",
|
||||
"token": "resource"
|
||||
}
|
||||
],
|
||||
"cycle": "Core"
|
||||
}
|
||||
|
@ -4,5 +4,12 @@
|
||||
"class": "Neutral",
|
||||
"traits": "Task.",
|
||||
"weakness": true,
|
||||
"uses": [
|
||||
{
|
||||
"count": 0,
|
||||
"type": "Resource",
|
||||
"token": "resource"
|
||||
}
|
||||
],
|
||||
"cycle": "Standalone"
|
||||
}
|
||||
|
@ -3,7 +3,6 @@
|
||||
"type": "Event",
|
||||
"class": "Seeker",
|
||||
"cost": 1,
|
||||
"level": 0,
|
||||
"traits": "Insight. Science.",
|
||||
"cycle": "The Feast of Hemlock Vale"
|
||||
}
|
||||
|
@ -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": ""
|
||||
}
|
92
objects/ArkhamSCE340-1192023-Page1.964222.json
Normal file
92
objects/ArkhamSCE340-1192023-Page1.964222.json
Normal 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": ""
|
||||
}
|
56
objects/BaldursGateIII.695abd.json
Normal file
56
objects/BaldursGateIII.695abd.json
Normal 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": ""
|
||||
}
|
@ -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",
|
||||
|
@ -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": ""
|
||||
}
|
@ -43,4 +43,4 @@
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
||||
}
|
||||
|
@ -43,4 +43,4 @@
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
||||
}
|
||||
|
@ -43,4 +43,4 @@
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
||||
}
|
||||
|
@ -43,4 +43,4 @@
|
||||
},
|
||||
"Value": 0,
|
||||
"XmlUI": ""
|
||||
}
|
||||
}
|
||||
|
62
objects/TokenSpawningReference.f8b3a7.json
Normal file
62
objects/TokenSpawningReference.f8b3a7.json
Normal 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": ""
|
||||
}
|
@ -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": ""
|
||||
|
@ -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": ""
|
||||
|
@ -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": ""
|
||||
|
@ -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": ""
|
||||
|
@ -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": ""
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user