refactor and option added

This commit is contained in:
Chr1Z93 2023-01-06 02:02:24 +01:00
parent 5a90702526
commit 9bf8f00399
5 changed files with 170 additions and 220 deletions

View File

@ -22,7 +22,7 @@
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1838053776205435595/ECFB88938ADBD1EF7AEF713111A11330FD9FAA5A/", "ImageURL": "http://cloud-3.steamusercontent.com/ugc/1838053776205435595/ECFB88938ADBD1EF7AEF713111A11330FD9FAA5A/",
"WidthScale": 0 "WidthScale": 0
}, },
"Description": "Searches your top X cards by setting your hand aside and putting the cards into your hand.\n\nPut the target of your search on your set aside hand.\n\nSelect \"Shuffle\" or \"No Shuffle\" to put the cards back in your deck.\n\nCheck context menu for additional information.", "Description": "Searches the top X cards of the nearest playmat by setting your hand aside and putting the cards into your hand.\n\nPut the target of your search on your set aside hand.",
"DragSelectable": true, "DragSelectable": true,
"GMNotes": "", "GMNotes": "",
"GUID": "17aed0", "GUID": "17aed0",
@ -34,7 +34,7 @@
"LayoutGroupSortIndex": 0, "LayoutGroupSortIndex": 0,
"Locked": false, "Locked": false,
"LuaScript": "require(\"accessories/SearchAssistant\")", "LuaScript": "require(\"accessories/SearchAssistant\")",
"LuaScriptState": "\"White\"", "LuaScriptState": "",
"MeasureMovement": false, "MeasureMovement": false,
"Name": "Custom_Tile", "Name": "Custom_Tile",
"Nickname": "Search Assistant", "Nickname": "Search Assistant",

View File

@ -1 +1 @@
{"optionPanel":{"playAreaSnapTags":true,"showAttachmentHelper":false,"showChaosBagManager":false,"showCleanUpHelper":false,"useClueClickers":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showNavigationOverlay":false,"useSnapTags":true,"showTitleSplash":true,"showTokenArranger":false}} {"optionPanel":{"playAreaSnapTags":true,"showAttachmentHelper":false,"showChaosBagManager":false,"showCleanUpHelper":false,"useClueClickers":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showNavigationOverlay":false,"showSearchAssistant":[],"useSnapTags":true,"showTitleSplash":true,"showTokenArranger":false}}

View File

@ -1,13 +1,17 @@
-- Search Assistant local playmatAPI = require("playermat/PlaymatApi")
-- made by: Chr1Z
-- original by: Tikatoy
-- description: search the top X cards of your deck
information = {
version = "1.4",
last_updated = "12.11.2022"
}
MAT_GUIDS = { "8b081b", "bd0ff4", "383d8b", "0840d5" } -- forward declaration of variables that are used across functions
local matColor
local setAsidePosition
local setAsideRotation
local drawDeckPosition
local quickParameters = {}
quickParameters.function_owner = self
quickParameters.font_size = 150
quickParameters.width = 275
quickParameters.height = 275
quickParameters.color = "White"
-- common parameters -- common parameters
local buttonParameters = {} local buttonParameters = {}
@ -15,11 +19,12 @@ buttonParameters.function_owner = self
buttonParameters.font_size = 125 buttonParameters.font_size = 125
buttonParameters.width = 650 buttonParameters.width = 650
buttonParameters.height = 225 buttonParameters.height = 225
buttonParameters.color = "White"
local inputParameters = {} local inputParameters = {}
inputParameters.function_owner = self inputParameters.function_owner = self
inputParameters.input_function = "updateSearchNumber" inputParameters.input_function = "updateSearchNumber"
inputParameters.tooltip = "number of cards to search" inputParameters.tooltip = "custom search amount"
inputParameters.label = "#" inputParameters.label = "#"
inputParameters.font_size = 175 inputParameters.font_size = 175
inputParameters.width = 400 inputParameters.width = 400
@ -28,35 +33,40 @@ inputParameters.position = { 0, 0.11, 0 }
inputParameters.alignment = 3 inputParameters.alignment = 3
inputParameters.validation = 2 inputParameters.validation = 2
function onSave() return JSON.encode(playerColor) end function onLoad()
function onLoad(save_state)
if save_state ~= nil then
playerColor = JSON.decode(save_state)
end
if playerColor == nil then
playerColor = Player.getAvailableColors()[1]
end
normalView() normalView()
self.addContextMenuItem("More Information", function()
printToAll("------------------------------", "White")
printToAll("Search Assistant v" .. information["version"] .. " by Chr1Z", "Orange")
printToAll("last updated: " .. information["last_updated"], "White")
printToAll("original concept by Tikatoy", "White")
end)
end end
-- regular view with search box and color switcher -- regular view with search box
function normalView() function normalView()
self.clearButtons() self.clearButtons()
self.clearInputs() self.clearInputs()
createSearchButton()
changeColor("initialize")
self.createInput(inputParameters) self.createInput(inputParameters)
-- create custom search button
buttonParameters.click_function = "searchCustom"
buttonParameters.tooltip = "Search the entered number of cards"
buttonParameters.position = { 0, 0.11, 0.65 }
buttonParameters.label = "Search"
self.createButton(buttonParameters)
-- create buttons to search 3, 6 or 9 cards
for i = 3, 9, 3 do
_G["search" .. i] = function(_, playerColor)
_G["startSearch"](playerColor, i)
end
self.createButton({
function_owner = self,
click_function = "search" .. i,
label = i,
font_size = 165,
width = 275,
height = 275,
color = "White",
position = { (i - 6) / 4.5, 0.11, -0.65 }
})
end
end end
-- view during a search with "done" buttons -- view during a search with "done" buttons
@ -64,165 +74,86 @@ function searchView()
self.clearButtons() self.clearButtons()
self.clearInputs() self.clearInputs()
createDoneButton(true) -- create the "End Search" button
createDoneButton(false) buttonParameters.click_function = "endSearch"
end buttonParameters.tooltip = "Left-click: Return cards and shuffle\nRight-click: Return cards without shuffling"
buttonParameters.position = { 0, 0.11, 0 }
-- change color (or initialize button) buttonParameters.label = "End Search"
function changeColor(arg, _, isRightClick)
if arg ~= "initialize" then
-- update table with colors
COLORS = Player.getAvailableColors()
local pos = indexOf(COLORS, playerColor)
if isRightClick then
if pos == nil or pos == 1 then pos = #COLORS
else pos = pos - 1 end
else
if pos == nil or pos == #COLORS then pos = 1
else pos = pos + 1 end
end
-- update playerColor
playerColor = COLORS[pos]
-- remove button and recreate it afterwards
self.removeButton(1)
end
buttonParameters.click_function = "changeColor"
buttonParameters.tooltip = "change color"
buttonParameters.position = { 0, 0.11, -0.65 }
buttonParameters.label = playerColor
buttonParameters.color = Color.fromString(playerColor)
buttonParameters.hover_color = buttonParameters.color
self.createButton(buttonParameters) self.createButton(buttonParameters)
end end
-- create the search button
function createSearchButton()
buttonParameters.click_function = "startSearch"
buttonParameters.tooltip = "start the search"
buttonParameters.position = { 0, 0.11, 0.65 }
buttonParameters.label = "Search"
buttonParameters.color = Color.fromString("White")
buttonParameters.hover_color = nil
self.createButton(buttonParameters)
end
-- create the done buttons (with and without shuffle)
function createDoneButton(arg)
if arg then
buttonParameters.click_function = "endSearch1"
buttonParameters.tooltip = "Done (Shuffle)"
buttonParameters.position = { 0, 0.11, -0.65 }
buttonParameters.label = "Shuffle"
else
buttonParameters.click_function = "endSearch2"
buttonParameters.tooltip = "Done (No Shuffle)"
buttonParameters.position = { 0, 0.11, 0.65 }
buttonParameters.label = "No Shuffle"
end
buttonParameters.color = Color.fromString("White")
buttonParameters.hover_color = nil
self.createButton(buttonParameters)
end
-- get the draw deck from the player mat
function getDrawDeck()
mat.call("getDrawDiscardDecks")
return mat.getVar("drawDeck")
end
-- input_function to get number of cards to search -- input_function to get number of cards to search
function updateSearchNumber(_, _, input) function updateSearchNumber(_, _, input)
inputParameters.value = tonumber(input) inputParameters.value = tonumber(input)
end end
-- start the search (change UI, set hand aside, draw cards) -- starts the search with the number from the input field
function startSearch(_, color) function searchCustom(_, messageColor)
if inputParameters.value == nil then local number = inputParameters.value
printToColor("Enter the number of cards to search in the textbox.", color, "Orange") if number ~= nil then
return startSearch(messageColor, number)
end
local hand_data = Player[playerColor].getHandTransform()
-- make distinction between players based on hand position
if hand_data.position.x < -30 then
if hand_data.position.z > 0 then
playerNumber = 1
else else
playerNumber = 2 printToColor("Enter the number of cards to search in the textbox.", messageColor, "Orange")
end
else
if hand_data.position.z > 0 then
playerNumber = 3
else
playerNumber = 4
end
end end
end
mat = getObjectFromGUID(MAT_GUIDS[playerNumber]) -- start the search (change UI, set handCards aside, draw cards)
local zoneID = mat.getVar("zoneID") function startSearch(messageColor, number)
matColor = playmatAPI.getMatColorByPosition(self.getPosition())
drawDeck = getDrawDeck() -- get draw deck
local drawDeck = playmatAPI.getDrawDeck(matColor)
if drawDeck == nil then if drawDeck == nil then
printToColor("Draw pile could not be found!", color, "Red") printToColor(matColor .. " draw deck could not be found!", messageColor, "Red")
return return
end end
drawDeckPos = drawDeck.getPosition() drawDeckPosition = drawDeck.getPosition()
printToColor("Place target(s) of search on set aside hand.", color, "Green") printToColor("Place target(s) of search on set aside hand.", messageColor, "Green")
-- get position for set aside cards -- get playmat orientation
local hand = Player[playerColor].getHandObjects() local offset = -15
deck_rotation = { hand_data.rotation.x, hand_data.rotation.y + 180, 180 } if matColor == "Orange" or matColor == "Red" then
offset = 15
-- for left players (p1 and p3) move to the left, for right players (p2 and p4) to the right
if playerNumber == 1 or playerNumber == 3 then
set_aside_pos = hand_data.position - 15 * hand_data.right
else
set_aside_pos = hand_data.position + 15 * hand_data.right
end end
for i = #hand, 1, -1 do -- get position and rotation for set aside cards
hand[i].setPosition(set_aside_pos - Vector(0, i * 0.3, 0)) local handData = Player[matColor].getHandTransform()
hand[i].setRotation(deck_rotation) local handCards = Player[matColor].getHandObjects()
end setAsidePosition = handData.position + offset * handData.right
setAsideRotation = { handData.rotation.x, handData.rotation.y + 180, 180 }
searchView() for i = #handCards, 1, -1 do
handCards[i].setPosition(setAsidePosition - Vector(0, i * 0.3, 0))
handCards[i].setRotation(setAsideRotation)
end
-- handling for Norman Withers -- handling for Norman Withers
for _, object in ipairs(getObjectFromGUID(zoneID).getObjects()) do for _, v in ipairs(searchArea(drawDeckPosition)) do
local pos = self.positionToLocal(object.getPosition()) local object = v.hit_object
if pos.z < -0.5 and object.tag == "Card" and not object.is_face_down then if object.tag == "Card" and not object.is_face_down then
object.flip() object.flip()
Wait.time(function() drawDeck = getDrawDeck() end, 1) Wait.time(function() drawDeck = playmatAPI.getDrawDeck(matColor) end, 1)
break break
end end
end end
Wait.time(function() drawDeck.deal(inputParameters.value, playerColor) end, 1) Wait.time(function() drawDeck.deal(number, matColor) end, 1)
searchView()
end end
-- place hand back into deck and optionally shuffle -- place handCards back into deck and optionally shuffle
function endSearch1() endSearch(true) end function endSearch(_, _, isRightClick)
local handCards = Player[matColor].getHandObjects()
function endSearch2() endSearch(false) end for i = #handCards, 1, -1 do
handCards[i].setPosition(drawDeckPosition + Vector(0, 6 - i * 0.3, 0))
function endSearch(shuffle) handCards[i].setRotation(setAsideRotation)
local hand = Player[playerColor].getHandObjects()
for i = #hand, 1, -1 do
hand[i].setPosition(drawDeckPos + Vector(0, 6 - i * 0.3, 0))
hand[i].setRotation(deck_rotation)
end end
if shuffle then if not isRightClick then
Wait.time(function() Wait.time(function()
local deck = getDrawDeck() local deck = playmatAPI.getDrawDeck(matColor)
if deck ~= nil then if deck ~= nil then
deck.shuffle() deck.shuffle()
end end
@ -230,23 +161,15 @@ function endSearch(shuffle)
end end
-- draw set aside cards (from the ground!) -- draw set aside cards (from the ground!)
local objs = Physics.cast({ for _, v in ipairs(searchArea(setAsidePosition - Vector(0, 5, 0))) do
origin = set_aside_pos - Vector(0, 5, 0),
direction = { 0, 1, 0 },
type = 3,
size = { 2, 2, 2 },
max_distance = 0
})
for _, v in ipairs(objs) do
local obj = v.hit_object local obj = v.hit_object
if obj.tag == "Deck" then if obj.tag == "Deck" then
Wait.time(function() Wait.time(function()
obj.deal(#obj.getObjects(), playerColor) obj.deal(#obj.getObjects(), matColor)
end, 1) end, 1)
break break
elseif obj.tag == "Card" then elseif obj.tag == "Card" then
obj.setPosition(Player[playerColor].getHandTransform().position) obj.setPosition(Player[matColor].getHandTransform().position)
obj.flip() obj.flip()
break break
end end
@ -255,9 +178,13 @@ function endSearch(shuffle)
normalView() normalView()
end end
-- helper to search array -- utility function
function indexOf(array, value) function searchArea(position)
for i, v in ipairs(array) do return Physics.cast({
if v == value then return i end origin = position,
end direction = { 0, 1, 0 },
type = 3,
size = { 2, 2, 2 },
max_distance = 0
})
end end

View File

@ -850,6 +850,13 @@ function applyOptionPanelChange(id, state)
optionPanel[id][3] = spawnOrRemoveHelper(state, "Hand Helper", {-39.27, 1.6, 22.44}, {0, 000, 0}, "Green") optionPanel[id][3] = spawnOrRemoveHelper(state, "Hand Helper", {-39.27, 1.6, 22.44}, {0, 000, 0}, "Green")
optionPanel[id][4] = spawnOrRemoveHelper(state, "Hand Helper", {-21.51, 1.6, -22.44}, {0, 180, 0}, "Red") optionPanel[id][4] = spawnOrRemoveHelper(state, "Hand Helper", {-21.51, 1.6, -22.44}, {0, 180, 0}, "Red")
-- option: Show search assistant for each player
elseif id == "showSearchAssistant" then
optionPanel[id][1] = spawnOrRemoveHelper(state, "Search Assistant", {-50.84, 1.6, 10.16}, {0, 270, 0})
optionPanel[id][2] = spawnOrRemoveHelper(state, "Search Assistant", {-50.90, 1.6, -21.96}, {0, 270, 0})
optionPanel[id][3] = spawnOrRemoveHelper(state, "Search Assistant", {-36.21, 1.6, 22.44}, {0, 000, 0})
optionPanel[id][4] = spawnOrRemoveHelper(state, "Search Assistant", {-24.46, 1.6, -22.44}, {0, 180, 0})
-- option: Show chaos bag manager -- option: Show chaos bag manager
elseif id == "showChaosBagManager" then elseif id == "showChaosBagManager" then
optionPanel[id] = spawnOrRemoveHelper(state, "Chaos Bag Manager", {-67.8, 1.6, -49.5}) optionPanel[id] = spawnOrRemoveHelper(state, "Chaos Bag Manager", {-67.8, 1.6, -49.5})
@ -936,6 +943,7 @@ function removeHelperObject(name)
["Token Arranger"] = "showTokenArranger", ["Token Arranger"] = "showTokenArranger",
["Clean Up Helper"] = "showCleanUpHelper", ["Clean Up Helper"] = "showCleanUpHelper",
["Hand Helper"] = "showHandHelper", ["Hand Helper"] = "showHandHelper",
["Search Assistant"] = "showSearchAssistant",
["Chaos Bag Manager"] = "showChaosBagManager", ["Chaos Bag Manager"] = "showChaosBagManager",
["jaqenZann's Navigation Overlay"] = "showNavigationOverlay", ["jaqenZann's Navigation Overlay"] = "showNavigationOverlay",
["Displacement Tool"] = "showDisplacementTool", ["Displacement Tool"] = "showDisplacementTool",
@ -983,6 +991,7 @@ function onClick_defaultSettings()
showDrawButton = false, showDrawButton = false,
showHandHelper = {}, showHandHelper = {},
showNavigationOverlay = false, showNavigationOverlay = false,
showSearchAssistant = {},
showTitleSplash = true, showTitleSplash = true,
showTokenArranger = false, showTokenArranger = false,
useClueClickers = false, useClueClickers = false,

View File

@ -236,6 +236,20 @@
</Cell> </Cell>
</Row> </Row>
<!-- Option: show search assistant -->
<Row class="option-text">
<Cell class="option-text">
<VerticalLayout class="text-column">
<Text class="option-header">Search Assistant</Text>
<Text class="description">Quickly search 3, 6, 9 or the top X cards of your deck!</Text>
</VerticalLayout>
</Cell>
<Cell class="option-button">
<Toggle id="showSearchAssistant"
onValueChanged="onClick_toggleOption(showSearchAssistant)"/>
</Cell>
</Row>
<!-- Option: show chaos bag manager --> <!-- Option: show chaos bag manager -->
<Row class="option-text"> <Row class="option-text">
<Cell class="option-text"> <Cell class="option-text">