diff --git a/config.json b/config.json index d53587e0..7ace3af2 100644 --- a/config.json +++ b/config.json @@ -3,7 +3,6 @@ "ComponentTags_path": "ComponentTags.json", "CustomUIAssets_path": "CustomUIAssets.json", "DecalPallet_path": "DecalPallet.json", - "Decals": [], "GameComplexity": "", "GameMode": "Arkham Horror LCG - Super Complete Edition", "GameType": "", @@ -201,7 +200,9 @@ "NavigationOverlayHandler.797ede", "CampaignImporterExporter.334ee3", "Bloodborne-CityoftheUnseen.1e7a0b", - "TheColorOutofOz.806d9a" + "TheColorOutofOz.806d9a", + "TokenArranger.022907", + "ChaosBagManager.023240" ], "PlayArea": 1, "PlayerCounts": [ diff --git a/modsettings/ComponentTags.json b/modsettings/ComponentTags.json index 83a638b1..8d28dfae 100644 --- a/modsettings/ComponentTags.json +++ b/modsettings/ComponentTags.json @@ -83,6 +83,10 @@ { "displayed": "CameraZoom_ignore", "normalized": "camerazoom_ignore" + }, + { + "displayed": "TokenArranger", + "normalized": "tokenarranger" } ] } diff --git a/objects/OptionPanelSource.830bd0/ChaosBagManager.023240.json b/objects/ChaosBagManager.023240.json similarity index 94% rename from objects/OptionPanelSource.830bd0/ChaosBagManager.023240.json rename to objects/ChaosBagManager.023240.json index bc4802ed..364994bd 100644 --- a/objects/OptionPanelSource.830bd0/ChaosBagManager.023240.json +++ b/objects/ChaosBagManager.023240.json @@ -32,7 +32,7 @@ "HideWhenFaceDown": false, "IgnoreFoW": false, "LayoutGroupSortIndex": 0, - "Locked": false, + "Locked": true, "LuaScript": "require(\"accessories/ChaosBagManager\")", "LuaScriptState": "", "MeasureMovement": false, @@ -45,9 +45,9 @@ ], "Tooltip": true, "Transform": { - "posX": 22.215, - "posY": 5.651, - "posZ": -34.811, + "posX": -66, + "posY": 1.531, + "posZ": -49.5, "rotX": 0, "rotY": 270, "rotZ": 0, diff --git a/objects/LuaScriptState.luascriptstate b/objects/LuaScriptState.luascriptstate index 3404240e..599af236 100644 --- a/objects/LuaScriptState.luascriptstate +++ b/objects/LuaScriptState.luascriptstate @@ -1 +1 @@ -{"acknowledgedUpgradeVersions":[],"optionPanel":{"cardLanguage":"en","playAreaSnapTags":true,"showAttachmentHelper":false,"showChaosBagManager":false,"showCleanUpHelper":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showSearchAssistant":[],"showTitleSplash":true,"showTokenArranger":false,"useClueClickers":false,"useSnapTags":true}} +{"acknowledgedUpgradeVersions":[],"optionPanel":{"cardLanguage":"en","playAreaSnapTags":true,"showAttachmentHelper":false,"showCleanUpHelper":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showSearchAssistant":[],"showTitleSplash":true,"useClueClickers":false,"useSnapTags":true}} diff --git a/objects/OptionPanelSource.830bd0.json b/objects/OptionPanelSource.830bd0.json index 623fc02b..98907beb 100644 --- a/objects/OptionPanelSource.830bd0.json +++ b/objects/OptionPanelSource.830bd0.json @@ -14,8 +14,6 @@ "r": 0.70588 }, "ContainedObjects_order": [ - "ChaosBagManager.023240", - "TokenArranger.022907", "CYOACampaignGuides.e87ea2", "AttachmentHelper.7f4976", "SearchAssistant.17aed0", diff --git a/objects/OptionPanelSource.830bd0/TokenArranger.022907.json b/objects/TokenArranger.022907.json similarity index 92% rename from objects/OptionPanelSource.830bd0/TokenArranger.022907.json rename to objects/TokenArranger.022907.json index 6c12cf42..ec5c2a4a 100644 --- a/objects/OptionPanelSource.830bd0/TokenArranger.022907.json +++ b/objects/TokenArranger.022907.json @@ -32,9 +32,9 @@ "HideWhenFaceDown": false, "IgnoreFoW": false, "LayoutGroupSortIndex": 0, - "Locked": false, + "Locked": true, "LuaScript": "require(\"accessories/TokenArranger\")", - "LuaScriptState": "", + "LuaScriptState_path": "TokenArranger.022907.luascriptstate", "MeasureMovement": false, "Name": "Custom_Token", "Nickname": "Token Arranger", @@ -46,7 +46,7 @@ "Tooltip": true, "Transform": { "posX": -42.3, - "posY": 1.53, + "posY": 1.531, "posZ": -46.5, "rotX": 0, "rotY": 270, diff --git a/objects/TokenArranger.022907.luascriptstate b/objects/TokenArranger.022907.luascriptstate new file mode 100644 index 00000000..638cf57f --- /dev/null +++ b/objects/TokenArranger.022907.luascriptstate @@ -0,0 +1 @@ +{"percentage":false,"tokenPrecedence":{"":[0,11],"Auto-fail":[-100,7],"Bless":[101,8],"Cultist":[-2,4],"Curse":[-101,9],"Elder Sign":[100,2],"Elder Thing":[-4,6],"Frost":[-99,10],"Skull":[-1,3],"Tablet":[-3,5]}} diff --git a/src/accessories/TokenArranger.ttslua b/src/accessories/TokenArranger.ttslua index ab40d7a2..86a57721 100644 --- a/src/accessories/TokenArranger.ttslua +++ b/src/accessories/TokenArranger.ttslua @@ -59,7 +59,6 @@ function onLoad(saveState) end createButtonsAndInputs(true) - layout() -- context menu items self.addContextMenuItem("Load default values", function() @@ -73,8 +72,7 @@ function onLoad(saveState) percentage = false else percentage = "basic" - broadcastToAll("Percentages are unreliable when using tokens that draw other tokens (bless or curse for example).", - "Yellow") + broadcastToAll("Percentages are unreliable when using tokens that draw other tokens (bless or curse for example).", "Yellow") end layout() end) @@ -85,8 +83,7 @@ function onLoad(saveState) else percentage = "cumulative" end - broadcastToAll("Percentages are unreliable when using tokens that draw other tokens (bless or curse for example).", - "Yellow") + broadcastToAll("Percentages are unreliable when using tokens that draw other tokens (bless or curse for example).", "Yellow") layout() end) end @@ -228,51 +225,54 @@ function deleteCopiedTokens() createButtonsAndInputs() end --- creates percentage representation buttons -function createPercentageButton(basePercentage, valueCount, tokenName, cumulativePercentage) - local buttonScale, offset, textColor, labelString +-- creates buttons as labels as display for percentage values +function createPercentageButton(tokenCount, valueCount, tokenName) + -- parameters for button creation + local percentageLabel = {} + percentageLabel.click_function = "none" + percentageLabel.width = 0 + percentageLabel.height = 0 + local startPos = Vector(2.3, -0.05, 0.875 * valueCount) if percentage == "cumulative" then - buttonScale = {1.5, 1.5, 1.5} - offset = -2.85 + percentageLabel.scale = {1.5, 1.5, 1.5} + percentageLabel.position = startPos - Vector(0, 0, 2.85) else - buttonScale = {2, 2, 2} - offset = -2.675 + percentageLabel.scale = {2, 2, 2} + percentageLabel.position = startPos - Vector(0, 0, 2.675) end - -- if this is a cumulative button (bottom one of the two created buttons) - if cumulativePercentage then - offset = -2.45 - textColor = {1, 1, 1} + -- determine font_color + if tokenName == "Elder Sign" then + percentageLabel.font_color = {0.35, 0.71, 0.85} + elseif tokenName == "Auto-fail" then + percentageLabel.font_color = {0.86, 0.1, 0.1} + -- check if the tokenName contains letters (e.g. symbol token) + elseif string.match(tokenName, "%a") ~= nil then + percentageLabel.font_color = {0.68, 0.53, 0.86} + else + percentageLabel.font_color = {0.85, 0.67, 0.33} + end + + -- create label for base percentage + local basePercentage = math.floor((tokenCount.row / tokenCount.total) * 10000) / 100 + percentageLabel.label = string.format("%s", string.format("%05.2f", basePercentage) .. "%") + self.createButton(percentageLabel) + + -- optionally create label for cumulative percentage + if percentage == "cumulative" then + percentageLabel.position = startPos - Vector(0, 0, 2.45) + percentageLabel.font_color = {1, 1, 1} -- only display one digit for 100% - if cumulativePercentage == 100 then - labelString = string.format("%s", string.format("%05.1f", cumulativePercentage) .. "%") + if tokenCount.sum == tokenCount.total then + percentageLabel.label = "100.0%" else - labelString = string.format("%s", string.format("%05.2f", cumulativePercentage) .. "%") - end - else - labelString = string.format("%s", string.format("%05.2f", basePercentage) .. "%") - if tokenName == "Elder Sign" then - textColor = {0.35, 0.71, 0.85} - elseif tokenName == "Auto-fail" then - textColor = {0.86, 0.1, 0.1} - elseif tokenName then - textColor = {0.68, 0.53, 0.86} - else - textColor = {0.85, 0.67, 0.33} + local cumulativePercentage = math.floor((tokenCount.sum / tokenCount.total) * 10000) / 100 + percentageLabel.label = string.format("%s", string.format("%05.2f", cumulativePercentage) .. "%") end + self.createButton(percentageLabel) end - - self.createButton({ - label = labelString, - click_function = "none", - width = 0, - height = 0, - scale = buttonScale, - font_color = textColor, - position = Vector(2.3, -0.05, offset + 0.875 * valueCount) - }) end -- main function (delete old tokens, clone chaos bag content, sort it and position it) @@ -293,14 +293,13 @@ function layout(_, _, isRightClick) -- clone tokens from chaos bag (default position above trash can) for i, obj in ipairs(chaosBag.getData().ContainedObjects) do obj["Tags"] = { "tempToken" } + local value = tonumber(obj.Nickname) + local precedence = tokenPrecedence[obj.Nickname] local spawnedObj = spawnObjectData({ data = obj, position = { 0.49, 3, 0 } }) - local value = tonumber(obj.Nickname) - local precedence = tokenPrecedence[obj.Nickname] - data[i] = { token = spawnedObj, value = value or precedence[1] @@ -323,50 +322,37 @@ function layout(_, _, isRightClick) local location = { x = pos.x, y = pos.y, z = pos.z } local currentValue = data[1].value - local tokenCount = 0 + local tokenCount = { row = 0, sum = 0, total = #data } local valueCount = 1 - local cumulativePercentage = 0 local tokenName = false - for _, item in ipairs(data) do + for i, item in ipairs(data) do + -- this is true for the first token in a new row if item.value ~= currentValue then if percentage then - local basePercentage = math.floor((tokenCount / #data) * 10000) / 100 - createPercentageButton(basePercentage, valueCount, tokenName) - if percentage == "cumulative" then - cumulativePercentage = cumulativePercentage + basePercentage - createPercentageButton(basePercentage, valueCount, tokenName, cumulativePercentage) - end + tokenCount.sum = tokenCount.sum + tokenCount.row + createPercentageButton(tokenCount, valueCount, tokenName) end - location.x = location.x - 1.75 - location.z = pos.z - currentValue = item.value - valueCount = valueCount + 1 - tokenCount = 0 + location.x = location.x - 1.75 + location.z = pos.z + currentValue = item.value + valueCount = valueCount + 1 + tokenCount.row = 0 end item.token.setPosition(location) item.token.setRotation(self.getRotation()) + item.token.setLock(true) location.z = location.z - 1.75 - tokenCount = tokenCount + 1 tokenName = item.token.getName() - - -- set tokenName to false if it does not contain letters - -- tokenName is used by `createPercentageButton()` to determine the textcolor for percentages - if string.match(tokenName, "%a") == nil then - tokenName = false - end + tokenCount.row = tokenCount.row + 1 end -- this is repeated to create the button for the last token if percentage then - local basePercentage = math.floor((tokenCount / #data) * 10000) / 100 - createPercentageButton(basePercentage, valueCount, tokenName) - if percentage == "cumulative" then - cumulativePercentage = cumulativePercentage + basePercentage - createPercentageButton(basePercentage, valueCount, tokenName, cumulativePercentage) - end + tokenCount.sum = tokenCount.sum + tokenCount.row + createPercentageButton(tokenCount, valueCount, tokenName) end -- introducing a small delay to limit update calls diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index 5246ed61..18bea7c0 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -951,10 +951,6 @@ function applyOptionPanelChange(id, state) elseif id == "showTitleSplash" then optionPanel[id] = state - -- option: Show token arranger - elseif id == "showTokenArranger" then - optionPanel[id] = spawnOrRemoveHelper(state, "Token Arranger", {-42.3, 1.6, -46.5}) - -- option: Show clean up helper elseif id == "showCleanUpHelper" then optionPanel[id] = spawnOrRemoveHelper(state, "Clean Up Helper", {-66, 1.6, 46}) @@ -975,10 +971,6 @@ function applyOptionPanelChange(id, state) optionPanel[id][i] = spawnOrRemoveHelper(state, "Search Assistant", pos, rot) end - -- option: Show chaos bag manager - elseif id == "showChaosBagManager" then - optionPanel[id] = spawnOrRemoveHelper(state, "Chaos Bag Manager", {-66, 1.6, -49.5}) - -- option: Show attachment helper elseif id == "showAttachmentHelper" then optionPanel[id] = spawnOrRemoveHelper(state, "Attachment Helper", {-62, 1.4, 0}) @@ -1049,11 +1041,9 @@ end function removeHelperObject(name) -- links objects name to the respective option name (to grab the GUID for removal) local referenceTable = { - ["Token Arranger"] = "showTokenArranger", ["Clean Up Helper"] = "showCleanUpHelper", ["Hand Helper"] = "showHandHelper", ["Search Assistant"] = "showSearchAssistant", - ["Chaos Bag Manager"] = "showChaosBagManager", ["Displacement Tool"] = "showDisplacementTool", ["Custom Playmat Images"] = "showCustomPlaymatImages", ["Attachment Helper"] = "showAttachmentHelper", @@ -1101,7 +1091,6 @@ function onClick_defaultSettings() playAreaSnapTags = true, showAttachmentHelper = false, showCleanUpHelper = false, - showChaosBagManager = false, showCustomPlaymatImages = false, showCYOA = false, showDisplacementTool = false, @@ -1109,7 +1098,6 @@ function onClick_defaultSettings() showHandHelper = {}, showSearchAssistant = {}, showTitleSplash = true, - showTokenArranger = false, useClueClickers = false, useSnapTags = true } diff --git a/xml/OptionPanel.xml b/xml/OptionPanel.xml index b1d3cdce..5c0da12f 100644 --- a/xml/OptionPanel.xml +++ b/xml/OptionPanel.xml @@ -252,20 +252,6 @@ - - - - - Chaos Bag Manager - Panel for easy addition or removal of chaos tokens to the bag - very useful for EotE because of Frost tokens! - - - - - - - @@ -349,20 +335,6 @@ onValueChanged="onClick_toggleOption(showSearchAssistant)"/> - - - - - - Token Arranger - See the contents of the chaos bag at a glance! This tool displays a sorted table of the tokens to allow easier guessing of your odds. - - - - - -