From b40c6e6d9e7a7dd4423e8d5fdeffdd4146938973 Mon Sep 17 00:00:00 2001 From: Chr1Z93 Date: Fri, 27 Jan 2023 19:22:29 +0100 Subject: [PATCH] initial build --- config.json | 4 +- modsettings/Decals.json | 20 ----- objects/VictoryDisplay.6ccd6d.json | 57 +++++++++++++ src/core/VictoryDisplay.ttslua | 131 +++++++++++++++++++++++++++++ 4 files changed, 190 insertions(+), 22 deletions(-) delete mode 100644 modsettings/Decals.json create mode 100644 objects/VictoryDisplay.6ccd6d.json create mode 100644 src/core/VictoryDisplay.ttslua diff --git a/config.json b/config.json index 87ac840e..7b797007 100644 --- a/config.json +++ b/config.json @@ -3,7 +3,6 @@ "ComponentTags_path": "ComponentTags.json", "CustomUIAssets_path": "CustomUIAssets.json", "DecalPallet_path": "DecalPallet.json", - "Decals_path": "Decals.json", "GameComplexity": "", "GameMode": "Arkham Horror LCG - Super Complete Edition", "GameType": "", @@ -190,7 +189,8 @@ "Decoration-Ammo.0a3b03", "Decoration-Ammo.b43845", "Decoration-Ammo.d35ee9", - "ArkhamSCE300-1272023-Page1.f873a8" + "ArkhamSCE300-1272023-Page1.f873a8", + "VictoryDisplay.6ccd6d" ], "PlayArea": 1, "PlayerCounts": [ diff --git a/modsettings/Decals.json b/modsettings/Decals.json deleted file mode 100644 index d0bf6815..00000000 --- a/modsettings/Decals.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "CustomDecal": { - "ImageURL": "https://i.imgur.com/saWedQ0.png", - "Name": "Victory Display", - "Size": 15 - }, - "Transform": { - "posX": -1.76003075, - "posY": 1.491499, - "posZ": 28.6174583, - "rotX": 90, - "rotY": 89.6667938, - "rotZ": 0, - "scaleX": 15, - "scaleY": 15, - "scaleZ": 15 - } - } -] diff --git a/objects/VictoryDisplay.6ccd6d.json b/objects/VictoryDisplay.6ccd6d.json new file mode 100644 index 00000000..38a28c76 --- /dev/null +++ b/objects/VictoryDisplay.6ccd6d.json @@ -0,0 +1,57 @@ +{ + "AltLookAngle": { + "x": 0, + "y": 0, + "z": 0 + }, + "Autoraise": true, + "ColorDiffuse": { + "b": 1, + "g": 1, + "r": 1 + }, + "CustomImage": { + "CustomToken": { + "MergeDistancePixels": 15, + "Stackable": false, + "StandUp": false, + "Thickness": 0.1 + }, + "ImageScalar": 1, + "ImageSecondaryURL": "", + "ImageURL": "http://cloud-3.steamusercontent.com/ugc/5118935530961118802/2A3E0C502886C4C4B98F5A0B03817ABC9DFE3D96/", + "WidthScale": 0 + }, + "Description": "Automatically counts the earned VP from cards in the victory display and locations in the play area without clues on them.", + "DragSelectable": true, + "GMNotes": "", + "GUID": "6ccd6d", + "Grid": true, + "GridProjection": false, + "Hands": false, + "HideWhenFaceDown": false, + "IgnoreFoW": false, + "LayoutGroupSortIndex": 0, + "Locked": true, + "LuaScript": "require(\"core/VictoryDisplay\")", + "LuaScriptState": "", + "MeasureMovement": false, + "Name": "Custom_Token", + "Nickname": "Victory Display", + "Snap": false, + "Sticky": true, + "Tooltip": true, + "Transform": { + "posX": -1.5, + "posY": 1.531, + "posZ": 30, + "rotX": 0, + "rotY": 270, + "rotZ": 0, + "scaleX": 4.5, + "scaleY": 1, + "scaleZ": 4.5 + }, + "Value": 0, + "XmlUI": "" +} \ No newline at end of file diff --git a/src/core/VictoryDisplay.ttslua b/src/core/VictoryDisplay.ttslua new file mode 100644 index 00000000..0a7f3596 --- /dev/null +++ b/src/core/VictoryDisplay.ttslua @@ -0,0 +1,131 @@ +function onLoad() + local buttonParameters = {} + buttonParameters.label = "0 (Display) + 0 (Play Area) = 0 VP" + buttonParameters.click_function = "none" + buttonParameters.function_owner = self + buttonParameters.position = { x = -0.5, y = 0.11, z = -0.8 } + buttonParameters.scale = { 0.15, 0.15, 0.15 } + buttonParameters.width = 0 + buttonParameters.height = 0 + buttonParameters.font_size = 600 + buttonParameters.font_color = { 1, 1, 1 } + + -- index 0: VP calculation + self.createButton(buttonParameters) + + -- index 1: title + buttonParameters.position = { x = 0, y = 0.11, z = -1.15 } + buttonParameters.label = "Victory Display" + buttonParameters.font_size = 1000 + self.createButton(buttonParameters) + + -- index 2: refresh button + buttonParameters.position = { x = 1.65, y = 0.11, z = -0.8 } + buttonParameters.label = "Refresh!" + buttonParameters.click_function = "updateCount" + buttonParameters.width = 2400 + buttonParameters.height = 800 + buttonParameters.font_color = { 0, 0, 0 } + buttonParameters.font_size = 600 + self.createButton(buttonParameters) + + -- update the display label once + Wait.time(updateCount, 1) +end + +-- automatically update when cards are dropped or removed +function onCollisionEnter() updateCount() end +function onCollisionExit() Wait.time(updateCount, 0.1) end + +function updateCount() + local victoryPoints = { + display = 0, + playArea = 0 + } + + -- count cards in victory display + for _, v in ipairs(searchOnObj(self)) do + local obj = v.hit_object + local cardVP = 0 + + -- check metadata for VP + if obj.tag == "Card" then + cardVP = getCardVP(obj.is_face_down, JSON.decode(obj.getGMNotes())) + victoryPoints.display = victoryPoints.display + cardVP + + -- handling for stacked cards + elseif obj.tag == "Deck" then + for _, deepObj in ipairs(obj.getObjects()) do + cardVP = getCardVP(true, JSON.decode(deepObj.gm_notes)) + victoryPoints.display = victoryPoints.display + cardVP + end + end + end + + -- count locations in playArea + local playArea = getObjectFromGUID("721ba2") + for _, v in ipairs(searchOnObj(playArea)) do + local obj = v.hit_object + local cardVP = 0 + + if obj.hasTag("Location") then + cardVP = getCardVP(obj.is_face_down, JSON.decode(obj.getGMNotes())) + if cardVP and not cardHasClues(obj) then + victoryPoints.playArea = victoryPoints.playArea + cardVP + end + end + end + + self.editButton({ + index = 0, + label = victoryPoints.display .. " (Display) + " + .. victoryPoints.playArea .. " (Play Area) = " + .. victoryPoints.display + victoryPoints.playArea .. " VP" + }) +end + +-- checks if a card has clues on it +function cardHasClues(card) + for _, v in ipairs(searchOnObj(card)) do + local obj = v.hit_object + if obj.tag == "Tile" then + local props = obj.getCustomObject() + if obj.is_face_down == false and + props.image == "http://cloud-3.steamusercontent.com/ugc/1758068501357164917/1D06F1DC4D6888B6F57124BD2AFE20D0B0DA15A8/" and + props.image_bottom == "https://i.imgur.com/EoL7yaZ.png" then + return true + end + end + end + return false +end + +-- gets the VP count from the notes +function getCardVP(faceDown, notes) + local cardVP + if notes ~= nil then + -- enemy, treachery etc. + cardVP = tonumber(notes.victory) + + -- location + if not cardVP then + if not faceDown then + cardVP = tonumber(notes.locationFront.victory) + else + cardVP = tonumber(notes.locationBack.victory) + end + end + end + return cardVP or 0 +end + +function searchOnObj(obj) + return Physics.cast({ + direction = { 0, 1, 0 }, + max_distance = 0.5, + type = 3, + size = obj.getBounds().size, + origin = obj.getPosition() + }) +end +