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 @@ + + + + + Use clickable resource counters + This enables spawning of clickable resource tokens for player cards. + + + + + + +