Merge pull request #343 from argonui/tool-promotion
Tool promotion: Chaos Bag Manager and Token Arranger
This commit is contained in:
commit
477db4dc84
@ -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": [
|
||||
|
@ -83,6 +83,10 @@
|
||||
{
|
||||
"displayed": "CameraZoom_ignore",
|
||||
"normalized": "camerazoom_ignore"
|
||||
},
|
||||
{
|
||||
"displayed": "TokenArranger",
|
||||
"normalized": "tokenarranger"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -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,
|
@ -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}}
|
||||
|
@ -14,8 +14,6 @@
|
||||
"r": 0.70588
|
||||
},
|
||||
"ContainedObjects_order": [
|
||||
"ChaosBagManager.023240",
|
||||
"TokenArranger.022907",
|
||||
"CYOACampaignGuides.e87ea2",
|
||||
"AttachmentHelper.7f4976",
|
||||
"SearchAssistant.17aed0",
|
||||
|
@ -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,
|
1
objects/TokenArranger.022907.luascriptstate
Normal file
1
objects/TokenArranger.022907.luascriptstate
Normal file
@ -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]}}
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -252,20 +252,6 @@
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
<!-- Option: show chaos bag manager -->
|
||||
<Row class="option-text">
|
||||
<Cell class="option-text">
|
||||
<VerticalLayout class="text-column">
|
||||
<Text class="option-header">Chaos Bag Manager</Text>
|
||||
<Text class="description">Panel for easy addition or removal of chaos tokens to the bag - very useful for EotE because of Frost tokens!</Text>
|
||||
</VerticalLayout>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Toggle id="showChaosBagManager"
|
||||
onValueChanged="onClick_toggleOption(showChaosBagManager)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
<!-- Option: show clean up helper -->
|
||||
<Row class="option-text">
|
||||
<Cell class="option-text">
|
||||
@ -349,20 +335,6 @@
|
||||
onValueChanged="onClick_toggleOption(showSearchAssistant)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
|
||||
<!-- Option: show token arranger -->
|
||||
<Row class="option-text">
|
||||
<Cell class="option-text">
|
||||
<VerticalLayout class="text-column">
|
||||
<Text class="option-header">Token Arranger</Text>
|
||||
<Text class="description">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.</Text>
|
||||
</VerticalLayout>
|
||||
</Cell>
|
||||
<Cell class="option-button">
|
||||
<Toggle id="showTokenArranger"
|
||||
onValueChanged="onClick_toggleOption(showTokenArranger)"/>
|
||||
</Cell>
|
||||
</Row>
|
||||
</TableLayout>
|
||||
</VerticalScrollView>
|
||||
</Cell>
|
||||
|
Loading…
Reference in New Issue
Block a user