diff --git a/objects/TokenSource.124381.json b/objects/TokenSource.124381.json
index 9b468f66..503bb56f 100644
--- a/objects/TokenSource.124381.json
+++ b/objects/TokenSource.124381.json
@@ -18,7 +18,8 @@
"Damage.cd2a02",
"Horror.36be72",
"ClueDoom.a3fb6c",
- "Resource.00d19a"
+ "Resource.00d19a",
+ "ResourceCounter.498ec0"
],
"ContainedObjects_path": "TokenSource.124381",
"Description": "",
diff --git a/objects/TokenSource.124381/ResourceCounter.498ec0.json b/objects/TokenSource.124381/ResourceCounter.498ec0.json
new file mode 100644
index 00000000..c54a1d52
--- /dev/null
+++ b/objects/TokenSource.124381/ResourceCounter.498ec0.json
@@ -0,0 +1,57 @@
+{
+ "AltLookAngle": {
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "Autoraise": true,
+ "ColorDiffuse": {
+ "b": 1,
+ "g": 1,
+ "r": 1
+ },
+ "CustomImage": {
+ "CustomToken": {
+ "MergeDistancePixels": 5,
+ "Stackable": false,
+ "StandUp": false,
+ "Thickness": 0.1
+ },
+ "ImageScalar": 1,
+ "ImageSecondaryURL": "",
+ "ImageURL": "http://cloud-3.steamusercontent.com/ugc/949599153663401115/EAA6D40FC6E15204BBE551BCDED35CC8C75111BF/",
+ "WidthScale": 0
+ },
+ "Description": "0",
+ "DragSelectable": true,
+ "GMNotes": "resourceCounter",
+ "GUID": "498ec0",
+ "Grid": true,
+ "GridProjection": false,
+ "Hands": false,
+ "HideWhenFaceDown": false,
+ "IgnoreFoW": false,
+ "LayoutGroupSortIndex": 0,
+ "Locked": false,
+ "LuaScript": "require(\"core/GenericCounter\")",
+ "LuaScriptState": "0",
+ "MeasureMovement": false,
+ "Name": "Custom_Token",
+ "Nickname": "Resource Counter",
+ "Snap": false,
+ "Sticky": true,
+ "Tooltip": false,
+ "Transform": {
+ "posX": 0,
+ "posY": 3,
+ "posZ": 0,
+ "rotX": 0,
+ "rotY": 270,
+ "rotZ": 0,
+ "scaleX": 0.26,
+ "scaleY": 1,
+ "scaleZ": 0.26
+ },
+ "Value": 0,
+ "XmlUI": ""
+}
\ No newline at end of file
diff --git a/src/core/GenericCounter.ttslua b/src/core/GenericCounter.ttslua
index c3f9cce8..d21ff1c7 100644
--- a/src/core/GenericCounter.ttslua
+++ b/src/core/GenericCounter.ttslua
@@ -1,50 +1,52 @@
-MIN_VALUE = -99
-MAX_VALUE = 999
+MIN_VALUE = 0
+MAX_VALUE = 99
val = 0
function onSave() return JSON.encode(val) end
-function onLoad(saved_data)
- if saved_data ~= nil then
- val = JSON.decode(saved_data)
- end
+function onLoad(savedData)
+ if savedData ~= nil then
+ val = JSON.decode(savedData)
+ end
- local name = self.getName()
- local position = {}
+ local name = self.getName()
+ local position = {}
- if name == "Damage" or name == "Resources" then
- position = { 0, 0.06, 0.1 }
- elseif name == "Horror" then
- position = { -0.025, 0.06, -0.025 }
- else
- position = { 0, 0.06, 0 }
- end
+ if name == "Damage" or name == "Resources" or name == "Resource Counter" then
+ position = { 0, 0.06, 0.1 }
+ elseif name == "Horror" then
+ position = { -0.025, 0.06, -0.025 }
+ else
+ position = { 0, 0.06, 0 }
+ end
- self.createButton({
- label = tostring(val),
- click_function = "addOrSubtract",
- function_owner = self,
- position = position,
- height = 600,
- width = 1000,
- scale = { 1.5, 1.5, 1.5 },
- font_size = 600,
- font_color = { 1, 1, 1, 100 },
- color = { 0, 0, 0, 0 }
- })
+ self.createButton({
+ label = tostring(val),
+ click_function = "addOrSubtract",
+ function_owner = self,
+ position = position,
+ height = 600,
+ width = 1000,
+ scale = { 1.5, 1.5, 1.5 },
+ font_size = 600,
+ font_color = { 1, 1, 1, 100 },
+ color = { 0, 0, 0, 0 }
+ })
+
+ self.addContextMenuItem("Add 5", function() updateVal(val + 5) end)
+ self.addContextMenuItem("Subtract 5", function() updateVal(val - 5) end)
+ self.addContextMenuItem("Add 10", function() updateVal(val + 10) end)
+ self.addContextMenuItem("Subtract 10", function() updateVal(val - 10) end)
end
function updateVal(newVal)
- if tonumber(newVal) then
- val = newVal
- self.editButton({
- index = 0,
- label = tostring(val)
- })
- end
+ if tonumber(newVal) then
+ val = math.min(math.max(newVal, MIN_VALUE), MAX_VALUE)
+ self.editButton({ index = 0, label = tostring(val) })
+ end
end
-function addOrSubtract(_, _, alt_click)
- val = math.min(math.max(val + (alt_click and -1 or 1), MIN_VALUE), MAX_VALUE)
- self.editButton({ index = 0, label = tostring(val) })
+function addOrSubtract(_, _, isRightClick)
+ val = math.min(math.max(val + (isRightClick and -1 or 1), MIN_VALUE), MAX_VALUE)
+ self.editButton({ index = 0, label = tostring(val) })
end
diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua
index 5fde95b3..93079d48 100644
--- a/src/core/Global.ttslua
+++ b/src/core/Global.ttslua
@@ -1,5 +1,3 @@
-local tokenManager = require("core/token/TokenManager")
-
---------------------------------------------------------
-- general setup
---------------------------------------------------------
@@ -36,6 +34,7 @@ local IS_RESHUFFLING = false
local bagSearchers = {}
local hideTitleSplashWaitFunctionId = nil
local playmatAPI = require("playermat/PlaymatApi")
+local tokenManager = require("core/token/TokenManager")
---------------------------------------------------------
-- data for tokens
@@ -819,6 +818,10 @@ function applyOptionPanelChange(id, state)
-- update master clue counter
getObjectFromGUID("4a3aa4").setVar("useClickableCounters", state)
+ -- option: Clickable resource counters
+ elseif id == "useResourceCounters" then
+ optionPanel[id] = state
+
-- option: Show Title on placing scenarios
elseif id == "showTitleSplash" then
optionPanel[id] = state
diff --git a/src/core/token/TokenManager.ttslua b/src/core/token/TokenManager.ttslua
index 7a7916e1..14bd260a 100644
--- a/src/core/token/TokenManager.ttslua
+++ b/src/core/token/TokenManager.ttslua
@@ -149,8 +149,12 @@ do
-- spawned state object rather than spawning multiple tokens
---@param shiftDown An offset for the z-value of this group of tokens
TokenManager.spawnTokenGroup = function(card, tokenType, tokenCount, shiftDown)
+ local optionPanel = Global.getTable("optionPanel")
+
if tokenType == "damage" or tokenType == "horror" then
TokenManager.spawnCounterToken(card, tokenType, tokenCount, shiftDown)
+ elseif tokenType == "resource" and optionPanel["useResourceCounters"] then
+ TokenManager.spawnResourceCounterToken(card, tokenCount)
else
TokenManager.spawnMultipleTokens(card, tokenType, tokenCount, shiftDown)
end
@@ -184,6 +188,14 @@ do
end)
end
+ TokenManager.spawnResourceCounterToken = function(card, tokenCount)
+ local pos = card.positionToWorld(card.positionToLocal(card.getPosition()) + Vector(0, 0.2, -0.5))
+ local rot = card.getRotation()
+ TokenManager.spawnToken(pos, "resourceCounter", rot, function(spawned)
+ spawned.call("updateVal", tokenCount)
+ end)
+ end
+
-- Spawns a number of tokens.
---@param tokenType String type of token to spawn, valid values are resource", "doom", or "clue".
-- Other types should use spawnCounterToken()
diff --git a/src/playermat/Playmat.ttslua b/src/playermat/Playmat.ttslua
index a879d59a..ca748ec7 100644
--- a/src/playermat/Playmat.ttslua
+++ b/src/playermat/Playmat.ttslua
@@ -409,12 +409,18 @@ function replenishTokens(card, count, replenish)
-- get current amount of resource tokens on the card
local search = searchArea(cardPos, { 2.5, 0.5, 3.5 })
+ local clickableResourceCounter = nil
local foundTokens = 0
+
for _, obj in ipairs(search) do
local obj = obj.hit_object
if obj.getCustomObject().image == "http://cloud-3.steamusercontent.com/ugc/1758068501357192910/11DDDC7EF621320962FDCF3AE3211D5EDC3D1573/" then
foundTokens = foundTokens + math.abs(obj.getQuantity())
obj.destruct()
+ elseif obj.getName() == "Resource Counter" then
+ foundTokens = obj.getVar("val")
+ clickableResourceCounter = obj
+ break
end
end
@@ -434,7 +440,12 @@ function replenishTokens(card, count, replenish)
local newCount = foundTokens + replenish
if newCount > count then newCount = count end
- tokenManager.spawnTokenGroup(card, "resource", newCount)
+
+ if clickableResourceCounter then
+ clickableResourceCounter.call("updateVal", newCount)
+ else
+ tokenManager.spawnTokenGroup(card, "resource", newCount)
+ end
end
function syncCustomizableMetadata(card)
diff --git a/xml/OptionPanel.xml b/xml/OptionPanel.xml
index d368c473..db0912e8 100644
--- a/xml/OptionPanel.xml
+++ b/xml/OptionPanel.xml
@@ -142,6 +142,20 @@
+
+
+
+
+
+ This enables spawning of clickable resource tokens for player cards.
+
+ |
+
+
+ |
+
+
|