diff --git a/config.json b/config.json
index b263d2e7..a6919260 100644
--- a/config.json
+++ b/config.json
@@ -67,6 +67,10 @@
"ScriptingTrigger.67ce9a",
"Detailedphasereference.68fe54",
"RulesIndex.91c83e",
+ "Clues.3f22e5",
+ "Clues.db85d6",
+ "Clues.891403",
+ "Clues.4111de",
"Resources.4406f0",
"Damage.eb08d6",
"Horror.468e88",
@@ -129,11 +133,10 @@
"LeakedItems.42cd6e",
"ChaosTokenReserve.106418",
"3DText.134348",
- "Custom_Model.032300",
- "Custom_Model.1769ed",
- "Custom_Model.37be78",
- "Custom_Model.d86b7c",
- "ClueCounterSwapper.d919d6",
+ "ClueCounter.37be78",
+ "ClueCounter.1769ed",
+ "ClueCounter.032300",
+ "ClueCounter.d86b7c",
"MasterClueCounter.4a3aa4",
"LegacyAssets.7165a9",
"Weaknessdecks.750fdd",
diff --git a/objects/Custom_Model.032300.json b/objects/ClueCounter.032300.json
similarity index 90%
rename from objects/Custom_Model.032300.json
rename to objects/ClueCounter.032300.json
index edcc06c5..506ba145 100644
--- a/objects/Custom_Model.032300.json
+++ b/objects/ClueCounter.032300.json
@@ -46,16 +46,16 @@
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
- "Nickname": "",
+ "Nickname": "Clue Counter",
"Snap": true,
"Sticky": true,
- "Tooltip": true,
+ "Tooltip": false,
"Transform": {
- "posX": -31.911,
- "posY": 1.57,
- "posZ": 30.97,
+ "posX": -32.193,
+ "posY": 1.52,
+ "posZ": 30.977,
"rotX": 0,
- "rotY": 0,
+ "rotY": 10,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 0.33,
@@ -63,4 +63,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/Custom_Model.1769ed.json b/objects/ClueCounter.1769ed.json
similarity index 90%
rename from objects/Custom_Model.1769ed.json
rename to objects/ClueCounter.1769ed.json
index 823113a1..7f9d652d 100644
--- a/objects/Custom_Model.1769ed.json
+++ b/objects/ClueCounter.1769ed.json
@@ -46,16 +46,16 @@
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
- "Nickname": "",
+ "Nickname": "Clue Counter",
"Snap": true,
"Sticky": true,
- "Tooltip": true,
+ "Tooltip": false,
"Transform": {
- "posX": -59.449,
- "posY": 1.57,
- "posZ": -22.628,
+ "posX": -59.426,
+ "posY": 1.52,
+ "posZ": -22.721,
"rotX": 0,
- "rotY": 270,
+ "rotY": 280,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 0.33,
@@ -63,4 +63,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/Custom_Model.37be78.json b/objects/ClueCounter.37be78.json
similarity index 90%
rename from objects/Custom_Model.37be78.json
rename to objects/ClueCounter.37be78.json
index ff90db73..a7c05ad3 100644
--- a/objects/Custom_Model.37be78.json
+++ b/objects/ClueCounter.37be78.json
@@ -46,16 +46,16 @@
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
- "Nickname": "",
+ "Nickname": "Clue Counter",
"Snap": true,
"Sticky": true,
- "Tooltip": true,
+ "Tooltip": false,
"Transform": {
- "posX": -18.983,
- "posY": 1.57,
- "posZ": -31.01,
+ "posX": -18.87,
+ "posY": 1.52,
+ "posZ": -30.977,
"rotX": 0,
- "rotY": 180,
+ "rotY": 190,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 0.33,
@@ -63,4 +63,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/Custom_Model.d86b7c.json b/objects/ClueCounter.d86b7c.json
similarity index 90%
rename from objects/Custom_Model.d86b7c.json
rename to objects/ClueCounter.d86b7c.json
index fceedaac..3a6858e3 100644
--- a/objects/Custom_Model.d86b7c.json
+++ b/objects/ClueCounter.d86b7c.json
@@ -46,16 +46,16 @@
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Model",
- "Nickname": "",
+ "Nickname": "Clue Counter",
"Snap": true,
"Sticky": true,
- "Tooltip": true,
+ "Tooltip": false,
"Transform": {
- "posX": -59.499,
- "posY": 1.57,
- "posZ": 9.561,
+ "posX": -59.426,
+ "posY": 1.52,
+ "posZ": 9.395,
"rotX": 0,
- "rotY": 270,
+ "rotY": 280,
"rotZ": 0,
"scaleX": 0.33,
"scaleY": 0.33,
@@ -63,4 +63,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/ClueCounterSwapper.d919d6.json b/objects/ClueCounterSwapper.d919d6.json
deleted file mode 100644
index 72d1aa6e..00000000
--- a/objects/ClueCounterSwapper.d919d6.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "AltLookAngle": {
- "x": 0,
- "y": 0,
- "z": 0
- },
- "Autoraise": true,
- "Bag": {
- "Order": 0
- },
- "ColorDiffuse": {
- "b": 1,
- "g": 0.99217,
- "r": 1
- },
- "ContainedObjects_order": [
- "Clues.3f22e5",
- "Clues.4111de",
- "Clues.891403",
- "Clues.db85d6"
- ],
- "ContainedObjects_path": "ClueCounterSwapper.d919d6",
- "CustomMesh": {
- "CastShadows": true,
- "ColliderURL": "",
- "Convex": true,
- "CustomShader": {
- "FresnelStrength": 0,
- "SpecularColor": {
- "b": 1,
- "g": 1,
- "r": 1
- },
- "SpecularIntensity": 0,
- "SpecularSharpness": 2
- },
- "DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/1179328606460871995/F2AFA106E788BB456C6F9134CE7A7B14D510F973/",
- "MaterialIndex": 3,
- "MeshURL": "http://pastebin.com/raw.php?i=uWAmuNZ2",
- "NormalURL": "",
- "TypeIndex": 6
- },
- "Description": "Counter mode courtesy of tadgh's clue counter mod: https://steamcommunity.com/sharedfiles/filedetails/?id=2115363630",
- "DragSelectable": true,
- "GMNotes": "",
- "GUID": "d919d6",
- "Grid": true,
- "GridProjection": false,
- "Hands": false,
- "HideWhenFaceDown": false,
- "IgnoreFoW": false,
- "LayoutGroupSortIndex": 0,
- "Locked": true,
- "LuaScript": "require(\"util/ClueCounterSwapper\")",
- "LuaScriptState_path": "ClueCounterSwapper.d919d6.luascriptstate",
- "MaterialIndex": -1,
- "MeasureMovement": false,
- "MeshIndex": -1,
- "Name": "Custom_Model_Bag",
- "Nickname": "Clue Counter Swapper",
- "Snap": true,
- "Sticky": true,
- "Tooltip": false,
- "Transform": {
- "posX": -50.9,
- "posY": 1.51,
- "posZ": 0,
- "rotX": 0,
- "rotY": 270,
- "rotZ": 0,
- "scaleX": 0.4,
- "scaleY": 0.01,
- "scaleZ": 0.4
- },
- "Value": 0,
- "XmlUI": ""
-}
diff --git a/objects/ClueCounterSwapper.d919d6.luascriptstate b/objects/ClueCounterSwapper.d919d6.luascriptstate
deleted file mode 100644
index e650f033..00000000
--- a/objects/ClueCounterSwapper.d919d6.luascriptstate
+++ /dev/null
@@ -1 +0,0 @@
-{"ml":{"3f22e5":{"lock":true,"pos":{"x":-59.50,"y":1.54,"z":9.56},"rot":{"x":0,"y":280,"z":0}},"4111de":{"lock":true,"pos":{"x":-59.45,"y":1.54,"z":-22.63},"rot":{"x":0,"y":280,"z":0}},"891403":{"lock":true,"pos":{"x":-31.91,"y":1.54,"z":30.97},"rot":{"x":0,"y":10,"z":0}},"db85d6":{"lock":true,"pos":{"x":-18.98,"y":1.54,"z":-31.01},"rot":{"x":0,"y":190,"z":0}}}}
diff --git a/objects/ClueCounterSwapper.d919d6/Clues.3f22e5.json b/objects/Clues.3f22e5.json
similarity index 90%
rename from objects/ClueCounterSwapper.d919d6/Clues.3f22e5.json
rename to objects/Clues.3f22e5.json
index 4c3eced1..b394e586 100644
--- a/objects/ClueCounterSwapper.d919d6/Clues.3f22e5.json
+++ b/objects/Clues.3f22e5.json
@@ -40,13 +40,16 @@
"Nickname": "Clues",
"Snap": true,
"Sticky": true,
+ "Tags": [
+ "CleanUpHelper_ignore"
+ ],
"Tooltip": false,
"Transform": {
- "posX": -59.318,
- "posY": 1.64,
- "posZ": -17.674,
+ "posX": -59.426,
+ "posY": 1.3,
+ "posZ": -22.721,
"rotX": 0,
- "rotY": 270,
+ "rotY": 280,
"rotZ": 0,
"scaleX": 0.26,
"scaleY": 1,
@@ -54,4 +57,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/ClueCounterSwapper.d919d6/Clues.4111de.json b/objects/Clues.4111de.json
similarity index 90%
rename from objects/ClueCounterSwapper.d919d6/Clues.4111de.json
rename to objects/Clues.4111de.json
index 4d272e1a..4b8bec86 100644
--- a/objects/ClueCounterSwapper.d919d6/Clues.4111de.json
+++ b/objects/Clues.4111de.json
@@ -40,13 +40,16 @@
"Nickname": "Clues",
"Snap": true,
"Sticky": true,
+ "Tags": [
+ "CleanUpHelper_ignore"
+ ],
"Tooltip": false,
"Transform": {
- "posX": -23.81,
- "posY": 1.589,
- "posZ": -30.927,
+ "posX": -18.87,
+ "posY": 1.3,
+ "posZ": -30.977,
"rotX": 0,
- "rotY": 180,
+ "rotY": 190,
"rotZ": 0,
"scaleX": 0.26,
"scaleY": 1,
@@ -54,4 +57,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/ClueCounterSwapper.d919d6/Clues.891403.json b/objects/Clues.891403.json
similarity index 90%
rename from objects/ClueCounterSwapper.d919d6/Clues.891403.json
rename to objects/Clues.891403.json
index 4d4b6157..01cecada 100644
--- a/objects/ClueCounterSwapper.d919d6/Clues.891403.json
+++ b/objects/Clues.891403.json
@@ -40,13 +40,16 @@
"Nickname": "Clues",
"Snap": true,
"Sticky": true,
+ "Tags": [
+ "CleanUpHelper_ignore"
+ ],
"Tooltip": false,
"Transform": {
- "posX": -31.911,
- "posY": 1.564,
- "posZ": 30.92,
+ "posX": -32.193,
+ "posY": 1.3,
+ "posZ": 30.977,
"rotX": 0,
- "rotY": 0,
+ "rotY": 10,
"rotZ": 0,
"scaleX": 0.26,
"scaleY": 1,
@@ -54,4 +57,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/ClueCounterSwapper.d919d6/Clues.db85d6.json b/objects/Clues.db85d6.json
similarity index 90%
rename from objects/ClueCounterSwapper.d919d6/Clues.db85d6.json
rename to objects/Clues.db85d6.json
index 12a35cd0..4ee7f3ae 100644
--- a/objects/ClueCounterSwapper.d919d6/Clues.db85d6.json
+++ b/objects/Clues.db85d6.json
@@ -40,13 +40,16 @@
"Nickname": "Clues",
"Snap": true,
"Sticky": true,
+ "Tags": [
+ "CleanUpHelper_ignore"
+ ],
"Tooltip": false,
"Transform": {
- "posX": -59.439,
- "posY": 1.637,
- "posZ": 9.472,
+ "posX": -59.426,
+ "posY": 1.3,
+ "posZ": 9.395,
"rotX": 0,
- "rotY": 270,
+ "rotY": 280,
"rotZ": 0,
"scaleX": 0.26,
"scaleY": 1,
@@ -54,4 +57,4 @@
},
"Value": 0,
"XmlUI": ""
-}
+}
\ No newline at end of file
diff --git a/objects/Fan-MadeAccessories.aa8b38/CleanUpHelper.26cf4b.ttslua b/objects/Fan-MadeAccessories.aa8b38/CleanUpHelper.26cf4b.ttslua
index ab7d3542..8097141f 100644
--- a/objects/Fan-MadeAccessories.aa8b38/CleanUpHelper.26cf4b.ttslua
+++ b/objects/Fan-MadeAccessories.aa8b38/CleanUpHelper.26cf4b.ttslua
@@ -6,7 +6,6 @@
-- - use the IGNORE_TAG to exclude objects from tidying (default: "CleanUpHelper_Ignore")
local playAreaApi = require("core/PlayAreaApi")
-
-- enable this for debugging
local SHOW_RAYS = false
@@ -209,10 +208,10 @@ function resetCounters()
end
-- reset doom on agenda
- -- local doomcounter = getObjectFromGUID("85c4c6")
- -- if doomcounter ~= nil then
- -- doomcounter.call("setToZero")
- -- end
+ local doomcounter = getObjectFromGUID("85c4c6")
+ if doomcounter ~= nil then
+ doomcounter.call("updateVal", 0)
+ end
for i, guid in ipairs(TRACKER_GUIDS) do
local obj = getObjectFromGUID(guid)
diff --git a/objects/MasterClueCounter.4a3aa4.json b/objects/MasterClueCounter.4a3aa4.json
index aee7dbe2..bb3237cf 100644
--- a/objects/MasterClueCounter.4a3aa4.json
+++ b/objects/MasterClueCounter.4a3aa4.json
@@ -34,7 +34,7 @@
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "require(\"core/MasterClueCounter\")",
- "LuaScriptState": "",
+ "LuaScriptState": "false",
"MeasureMovement": false,
"Name": "Custom_Token",
"Nickname": "Master Clue Counter\n",
diff --git a/objects/Playermat1White.8b081b.ttslua b/objects/Playermat1White.8b081b.ttslua
index 0cfef19b..f134d968 100644
--- a/objects/Playermat1White.8b081b.ttslua
+++ b/objects/Playermat1White.8b081b.ttslua
@@ -11,5 +11,7 @@ DISCARD_PILE_POSITION = { x = -58.9, y = 4, z = 4.29 }
TRASHCAN_GUID = "147e80"
STAT_TRACKER_GUID = "e598c2"
RESOURCE_COUNTER_GUID = "4406f0"
+CLUE_COUNTER_GUID = "d86b7c"
+CLUE_CLICKER_GUID = "db85d6"
require("playermat/Playmat")
diff --git a/objects/Playermat2Orange.bd0ff4.ttslua b/objects/Playermat2Orange.bd0ff4.ttslua
index f964b530..ae82c4a5 100644
--- a/objects/Playermat2Orange.bd0ff4.ttslua
+++ b/objects/Playermat2Orange.bd0ff4.ttslua
@@ -11,5 +11,7 @@ DISCARD_PILE_POSITION = { x = -58.96, y = 4, z = -27.82 }
TRASHCAN_GUID = "f7b6c8"
STAT_TRACKER_GUID = "b4a5f7"
RESOURCE_COUNTER_GUID = "816d84"
+CLUE_COUNTER_GUID = "1769ed"
+CLUE_CLICKER_GUID = "3f22e5"
require("playermat/Playmat")
diff --git a/objects/Playermat3Green.383d8b.ttslua b/objects/Playermat3Green.383d8b.ttslua
index 09e4e56b..4d1e6bb5 100644
--- a/objects/Playermat3Green.383d8b.ttslua
+++ b/objects/Playermat3Green.383d8b.ttslua
@@ -11,5 +11,7 @@ DISCARD_PILE_POSITION = { x = -37.26, y = 4, z = 30.50 }
TRASHCAN_GUID = "5f896a"
STAT_TRACKER_GUID = "af7ed7"
RESOURCE_COUNTER_GUID = "cd15ac"
+CLUE_COUNTER_GUID = "032300"
+CLUE_CLICKER_GUID = "891403"
require("playermat/Playmat")
diff --git a/objects/Playermat4Red.0840d5.ttslua b/objects/Playermat4Red.0840d5.ttslua
index eca5aa77..8e182e8b 100644
--- a/objects/Playermat4Red.0840d5.ttslua
+++ b/objects/Playermat4Red.0840d5.ttslua
@@ -11,5 +11,7 @@ DISCARD_PILE_POSITION = { x = -13.78, y = 4, z = -30.48 }
TRASHCAN_GUID = "4b8594"
STAT_TRACKER_GUID = "e74881"
RESOURCE_COUNTER_GUID = "a4b60d"
+CLUE_COUNTER_GUID = "37be78"
+CLUE_CLICKER_GUID = "4111de"
require("playermat/Playmat")
diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua
index 21363e7d..e415346f 100644
--- a/src/core/Global.ttslua
+++ b/src/core/Global.ttslua
@@ -675,6 +675,8 @@ function applyOptionPanelChange(id, state)
elseif id == 3 then
playmatAPI.clickableClues(state, "All")
+ -- update master clue counter
+ getObjectFromGUID("4a3aa4").setVar("useClickableCounters", state)
end
end
diff --git a/src/core/MasterClueCounter.ttslua b/src/core/MasterClueCounter.ttslua
index ae88b0ee..574362b3 100644
--- a/src/core/MasterClueCounter.ttslua
+++ b/src/core/MasterClueCounter.ttslua
@@ -1,16 +1,17 @@
-local clueCounters = {}
-local clueCounterGUIDS = {
- "37be78",
- "1769ed",
- "032300",
- "d86b7c"
-}
+count = 0
+useClickableCounters = false
-function onLoad()
+local playmatAPI = require("playermat/PlaymatApi")
+function onSave() return JSON.encode(useClickableCounters) end
+
+function onLoad(savedData)
+ if savedData ~= nil then
+ useClickableCounters = JSON.decode(savedData)
+ end
self.createButton({
label = "0",
click_function = "removeAllPlayerClues",
- tooltip = "Click here to remove all Clues from playermats",
+ tooltip = "Click here to remove all collected clues",
function_owner = self,
position = { 0, 0.06, 0 },
height = 900,
@@ -21,26 +22,18 @@ function onLoad()
color = { 0, 0, 0, 0 }
})
- -- loading object references to the counting bowls via GUID
- for i = 1, 4 do
- clueCounters[i] = getObjectFromGUID(clueCounterGUIDS[i])
- end
-
loopID = Wait.time(sumClues, 2, -1)
end
--- removes all player clues by calling the respective function from the counting bowls
+-- removes all player clues by calling the respective function from the counting bowls / clickers
function removeAllPlayerClues()
- for i = 1, 4 do
- clueCounters[i].call("removeAllClues")
- end
+ printToAll(count .. " clue(s) from playermats removed.", "White")
+ playmatAPI.removeClues("All")
+ self.editButton({ index = 0, label = "0" })
end
--- gets the counted values from the counting bowls and sums them up
+-- gets the counted values from the counting bowls / clickers and sums them up
function sumClues()
- local count = 0
- for i = 1, 4 do
- count = count + tonumber(clueCounters[i].getVar("exposedValue"))
- end
+ count = playmatAPI.getClueCount(useClickableCounters, "All")
self.editButton({ index = 0, label = tostring(count) })
end
diff --git a/src/playermat/ClueCounter.ttslua b/src/playermat/ClueCounter.ttslua
index d2bf81cd..ede426e9 100644
--- a/src/playermat/ClueCounter.ttslua
+++ b/src/playermat/ClueCounter.ttslua
@@ -15,6 +15,7 @@ function onLoad()
label = "",
click_function = "removeAllClues",
function_owner = self,
+ position = { 0, 0.1, 0 },
height = 0,
width = 0,
font_color = { 0, 0, 0 },
diff --git a/src/playermat/Playmat.ttslua b/src/playermat/Playmat.ttslua
index 9d861bf1..c5902e71 100644
--- a/src/playermat/Playmat.ttslua
+++ b/src/playermat/Playmat.ttslua
@@ -688,10 +688,66 @@ function showDrawButton(visible)
end
end
--- Shows or hides the clickable clue counter for this playmat
----@param showCounters Boolean. Whether the clickable clue counter should be present
-function clickableClues(showCounters)
- print("dummy function for clue counters")
+-- Spawns / destroys a clickable clue counter for this playmat with the correct amount of clues
+---@param showCounter Boolean Whether the clickable clue counter should be present
+function clickableClues(showCounter)
+ local CLUE_COUNTER = getObjectFromGUID(CLUE_COUNTER_GUID)
+ local CLUE_CLICKER = getObjectFromGUID(CLUE_CLICKER_GUID)
+ local clickerPos = CLUE_CLICKER.getPosition()
+ local clueCount = 0
+
+ if showCounter then
+ -- current clue count
+ clueCount = CLUE_COUNTER.getVar("exposedValue")
+
+ -- remove clues
+ CLUE_COUNTER.call("removeAllClues")
+
+ -- set value for clue clickers
+ CLUE_CLICKER.call("updateVal", clueCount)
+
+ -- move clue counters up
+ clickerPos.y = 1.52
+ CLUE_CLICKER.setPosition(clickerPos)
+ else
+ -- current clue count
+ clueCount = CLUE_CLICKER.getVar("val")
+
+ -- move clue counters down
+ clickerPos.y = 1.3
+ CLUE_CLICKER.setPosition(clickerPos)
+
+ -- spawn clues
+ local pos = self.positionToWorld({x = -1.12, y = 0.05, z = 0.7})
+ for i = 1, clueCount do
+ pos.y = pos.y + 0.045 * i
+ spawnToken(pos, "clue")
+ end
+ end
+end
+
+-- removes all clues (moving tokens to the trash and setting counters to 0)
+function removeClues()
+ local CLUE_COUNTER = getObjectFromGUID(CLUE_COUNTER_GUID)
+ local CLUE_CLICKER = getObjectFromGUID(CLUE_CLICKER_GUID)
+
+ CLUE_COUNTER.call("removeAllClues")
+ CLUE_CLICKER.call("updateVal", 0)
+end
+
+-- reports the clue count
+---@param useClickableCounters Boolean Controls which type of counter is getting checked
+function getClueCount(useClickableCounters)
+ local count = 0
+
+ if useClickableCounters then
+ local CLUE_CLICKER = getObjectFromGUID(CLUE_CLICKER_GUID)
+ count = tonumber(CLUE_CLICKER.getVar("val"))
+ else
+ local CLUE_COUNTER = getObjectFromGUID(CLUE_COUNTER_GUID)
+ count = tonumber(CLUE_COUNTER.getVar("exposedValue"))
+ end
+ return count
end
-- Sets this playermat's snap points to limit snapping to matching card types or not. If matchTypes
diff --git a/src/playermat/PlaymatApi.ttslua b/src/playermat/PlaymatApi.ttslua
index 68498fa3..ba6f1687 100644
--- a/src/playermat/PlaymatApi.ttslua
+++ b/src/playermat/PlaymatApi.ttslua
@@ -6,7 +6,21 @@ do
White = "8b081b",
Orange = "bd0ff4",
Green = "383d8b",
- Red = "0840d5",
+ Red = "0840d5"
+ }
+
+ local CLUE_COUNTER_GUIDS = {
+ White = "37be78",
+ Orange = "1769ed",
+ Green = "032300",
+ Red = "d86b7c"
+ }
+
+ local CLUE_CLICKER_GUIDS = {
+ White = "db85d6",
+ Orange = "3f22e5",
+ Green = "891403",
+ Red = "4111de"
}
-- Sets the requested playermat's snap points to limit snapping to matching card types or not. If
@@ -43,6 +57,25 @@ do
end
end
+ -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playermat
+ ---@param matColor String for one of the active player colors - White, Orange, Green, Red. Also
+ -- accepts "All" as a special value which will apply the setting to all four mats.
+ PlaymatApi.removeClues = function(matColor)
+ for _, mat in ipairs(internal.getMatForColor(matColor)) do
+ mat.call("removeClues")
+ end
+ end
+
+ -- Reports the clue count for the requested playermat
+ ---@param useClickableCounters Boolean Controls which type of counter is getting checked
+ PlaymatApi.getClueCount = function(useClickableCounters, matColor)
+ local count = 0
+ for _, mat in ipairs(internal.getMatForColor(matColor)) do
+ count = count + tonumber(mat.call("getClueCount", useClickableCounters))
+ end
+ return count
+ end
+
-- Convenience function to look up a mat's object by color, or get all mats.
---@param matColor String for one of the active player colors - White, Orange, Green, Red. Also
-- accepts "All" as a special value which will return all four mats.
diff --git a/src/util/ClueCounterSwapper.ttslua b/src/util/ClueCounterSwapper.ttslua
deleted file mode 100644
index c513e03a..00000000
--- a/src/util/ClueCounterSwapper.ttslua
+++ /dev/null
@@ -1,294 +0,0 @@
-function updateSave()
- local data_to_save = { ["ml"] = memoryList }
- saved_data = JSON.encode(data_to_save)
- self.script_state = saved_data
-end
-
-function onload(saved_data)
- if saved_data ~= "" then
- local loaded_data = JSON.decode(saved_data)
- --Set up information off of loaded_data
- memoryList = loaded_data.ml
- else
- --Set up information for if there is no saved saved data
- memoryList = {}
- end
-
- if next(memoryList) == nil then
- createSetupButton()
- else
- createMemoryActionButtons()
- end
-end
-
---Beginning Setup
---Make setup button
-function createSetupButton()
- self.createButton({
- label = "Setup",
- click_function = "buttonClick_setup",
- function_owner = self,
- position = { 0, 5, -2 },
- rotation = { 0, 0, 0 },
- height = 250,
- width = 600,
- font_size = 150,
- color = { 0, 0, 0 },
- font_color = { 1, 1, 1 }
- })
-end
-
---Triggered by setup button,
-function buttonClick_setup()
- memoryListBackup = duplicateTable(memoryList)
- memoryList = {}
- self.clearButtons()
- createButtonsOnAllObjects()
- createSetupActionButtons()
-end
-
---Creates selection buttons on objects
-function createButtonsOnAllObjects()
- local howManyButtons = 0
- for _, obj in ipairs(getAllObjects()) do
- if obj ~= self then
- local dummyIndex = howManyButtons
- --On a normal bag, the button positions aren't the same size as the bag.
- globalScaleFactor = 1.25 * 1 / self.getScale().x
- --Super sweet math to set button positions
- local selfPos = self.getPosition()
- local objPos = obj.getPosition()
- local deltaPos = findOffsetDistance(selfPos, objPos, obj)
- local objPos = rotateLocalCoordinates(deltaPos, self)
- objPos.x = -objPos.x * globalScaleFactor
- objPos.y = objPos.y * globalScaleFactor
- objPos.z = objPos.z * 4
- --Offset rotation of bag
- local rot = self.getRotation()
- rot.y = -rot.y + 180
- --Create function
- local funcName = "selectButton_" .. howManyButtons
- local func = function() buttonClick_selection(dummyIndex, obj) end
- self.setVar(funcName, func)
- self.createButton({
- click_function = funcName, function_owner = self,
- position = objPos, rotation = rot, height = 1000, width = 1000,
- color = { 0.75, 0.25, 0.25, 0.6 },
- })
- howManyButtons = howManyButtons + 1
- end
- end
-end
-
---Creates submit and cancel buttons
-function createSetupActionButtons()
- self.createButton({
- label = "Cancel", click_function = "buttonClick_cancel", function_owner = self,
- position = { 1.5, 5, 2 }, rotation = { 0, 0, 0 }, height = 350, width = 1100,
- font_size = 250, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
- self.createButton({
- label = "Submit", click_function = "buttonClick_submit", function_owner = self,
- position = { -1.2, 5, 2 }, rotation = { 0, 0, 0 }, height = 350, width = 1100,
- font_size = 250, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
- self.createButton({
- label = "Reset", click_function = "buttonClick_reset", function_owner = self,
- position = { -3.5, 5, 2 }, rotation = { 0, 0, 0 }, height = 350, width = 800,
- font_size = 250, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
-end
-
---During Setup
---Checks or unchecks buttons
-function buttonClick_selection(index, obj)
- local color = { 0, 1, 0, 0.6 }
- if memoryList[obj.getGUID()] == nil then
- self.editButton({ index = index, color = color })
- --Adding pos/rot to memory table
- local pos, rot = obj.getPosition(), obj.getRotation()
- --I need to add it like this or it won't save due to indexing issue
- memoryList[obj.getGUID()] = {
- pos = { x = round(pos.x, 4), y = round(pos.y, 4), z = round(pos.z, 4) },
- rot = { x = round(rot.x, 4), y = round(rot.y, 4), z = round(rot.z, 4) },
- lock = obj.getLock()
- }
- obj.highlightOn({ 0, 1, 0 })
- else
- color = { 0.75, 0.25, 0.25, 0.6 }
- self.editButton({ index = index, color = color })
- memoryList[obj.getGUID()] = nil
- obj.highlightOff()
- end
-end
-
---Cancels selection process
-function buttonClick_cancel()
- memoryList = memoryListBackup
- self.clearButtons()
- if next(memoryList) == nil then
- createSetupButton()
- else
- createMemoryActionButtons()
- end
- removeAllHighlights()
- broadcastToAll("Selection Canceled", { 1, 1, 1 })
-end
-
---Saves selections
-function buttonClick_submit()
- if next(memoryList) == nil then
- broadcastToAll("You cannot submit without any selections.", { 0.75, 0.25, 0.25 })
- else
- self.clearButtons()
- createMemoryActionButtons()
- local count = 0
- for guid in pairs(memoryList) do
- count = count + 1
- local obj = getObjectFromGUID(guid)
- if obj ~= nil then obj.highlightOff() end
- end
- broadcastToAll(count .. " Objects Saved", { 1, 1, 1 })
- updateSave()
- end
-end
-
---Resets bag to starting status
-function buttonClick_reset()
- memoryList = {}
- self.clearButtons()
- createSetupButton()
- removeAllHighlights()
- broadcastToAll("Tool Reset", { 1, 1, 1 })
- updateSave()
-end
-
---After Setup
---Creates recall and place buttons
-function createMemoryActionButtons()
- self.createButton({
- label = "Clicker", click_function = "buttonClick_place", function_owner = self,
- position = { 4.2, 1, 0 }, rotation = { 0, 0, 0 }, height = 500, width = 1100,
- font_size = 350, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
- self.createButton({
- label = "Counter", click_function = "buttonClick_recall", function_owner = self,
- position = { -4.2, 1, -0.1 }, rotation = { 0, 0, 0 }, height = 500, width = 1300,
- font_size = 350, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
- self.createButton({
- label = "Add Draw 1 Buttons", click_function = "addDraw1Buttons", function_owner = self,
- position = { 0, 1, -2.5 }, rotation = { 0, 0, 0 }, height = 500, width = 2600,
- font_size = 250, color = { 0, 0, 0 }, font_color = { 1, 1, 1 }
- })
- --[[
- self.createButton({
- label="Setup", click_function="buttonClick_setup", function_owner=self,
- position={-6,1,0}, rotation={0,90,0}, height=500, width=1200,
- font_size=350, color={0,0,0}, font_color={1,1,1}
- })
- --]]
-end
-
-function addDraw1Buttons()
- if ADD_BUTTONS_DISABLED then return end
-
- local mats = { "8b081b", "bd0ff4", "383d8b", "0840d5" }
- for i, guid in ipairs(mats) do
- local mat = getObjectFromGUID(guid)
- mat.createButton({
- label = "Draw 1",
- click_function = "doDrawOne",
- function_owner = mat,
- position = { 1.84, 0.1, -0.36 },
- scale = { 0.12, 0.12, 0.12 },
- width = 800,
- height = 280,
- font_size = 180
- })
- end
- ADD_BUTTONS_DISABLED = true
-end
-
---Sends objects from bag/table to their saved position/rotation
-function buttonClick_place()
- local bagObjList = self.getObjects()
- for guid, entry in pairs(memoryList) do
- local obj = getObjectFromGUID(guid)
- --If obj is out on the table, move it to the saved pos/rot
- if obj ~= nil then
- obj.setPositionSmooth(entry.pos)
- obj.setRotationSmooth(entry.rot)
- obj.setLock(entry.lock)
- else
- --If obj is inside of the bag
- for _, bagObj in ipairs(bagObjList) do
- if bagObj.guid == guid then
- local item = self.takeObject({
- guid = guid, position = entry.pos, rotation = entry.rot,
- })
- item.setLock(entry.lock)
- break
- end
- end
- end
- end
- broadcastToAll("Objects Placed", { 1, 1, 1 })
-end
-
---Recalls objects to bag from table
-function buttonClick_recall()
- for guid, entry in pairs(memoryList) do
- local obj = getObjectFromGUID(guid)
- if obj ~= nil then self.putObject(obj) end
- end
- broadcastToAll("Objects Recalled", { 1, 1, 1 })
-end
-
---Utility functions
---Find delta (difference) between 2 x/y/z coordinates
-function findOffsetDistance(p1, p2, obj)
- local deltaPos = {}
- local bounds = obj.getBounds()
- deltaPos.x = (p2.x - p1.x)
- deltaPos.y = (p2.y - p1.y) + (bounds.size.y - bounds.offset.y)
- deltaPos.z = (p2.z - p1.z)
- return deltaPos
-end
-
---Used to rotate a set of coordinates by an angle
-function rotateLocalCoordinates(desiredPos, obj)
- local objPos, objRot = obj.getPosition(), obj.getRotation()
- local angle = math.rad(objRot.y)
- local x = desiredPos.x * math.cos(angle) - desiredPos.z * math.sin(angle)
- local z = desiredPos.x * math.sin(angle) + desiredPos.z * math.cos(angle)
- return { x = x, y = desiredPos.y, z = z }
-end
-
---Coroutine delay, in seconds
-function wait(time)
- local start = os.time()
- repeat coroutine.yield(0) until os.time() > start + time
-end
-
---Duplicates a table (needed to prevent it making reference to the same objects)
-function duplicateTable(oldTable)
- local newTable = {}
- for k, v in pairs(oldTable) do
- newTable[k] = v
- end
- return newTable
-end
-
---Moves scripted highlight from all objects
-function removeAllHighlights()
- for _, obj in ipairs(getAllObjects()) do
- obj.highlightOff()
- end
-end
-
---Round number (num) to the Nth decimal (dec)
-function round(num, dec)
- local mult = 10 ^ (dec or 0)
- return math.floor(num * mult + 0.5) / mult
-end
diff --git a/xml/Global.xml b/xml/Global.xml
index ebb4622f..69935cd5 100644
--- a/xml/Global.xml
+++ b/xml/Global.xml
@@ -17,7 +17,7 @@
-
+