Merge pull request #72 from argonui/cleanuphelper-update

Clean Up Helper: exclude "chaos bag" from cleanup
This commit is contained in:
Chr1Z 2022-11-24 23:49:11 +01:00 committed by GitHub
commit 6c5c535171
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,8 +5,8 @@
-- - puts everything on playmats and hands into respective trashcans -- - puts everything on playmats and hands into respective trashcans
-- - use the IGNORE_TAG to exclude objects from tidying (default: "CleanUpHelper_Ignore") -- - use the IGNORE_TAG to exclude objects from tidying (default: "CleanUpHelper_Ignore")
information = { information = {
version = "2.3", version = "2.4",
last_updated = "19.11.2022" last_updated = "24.11.2022"
} }
-- enable this for debugging -- enable this for debugging
@ -14,36 +14,36 @@ local SHOW_RAYS = false
-- these objects will be ignored -- these objects will be ignored
local IGNORE_GUIDS = { local IGNORE_GUIDS = {
-- big playmat, change image panel and investigator counter -- big playmat, change image panel and investigator counter
"b7b45b"; "f182ee"; "721ba2"; "b7b45b"; "f182ee"; "721ba2";
-- bless/curse manager -- bless/curse manager
"afa06b"; "bd0253"; "5933fb"; "afa06b"; "bd0253"; "5933fb";
-- stuff on agenda/act playmat -- stuff on agenda/act playmat
"85c4c6"; "4a3aa4"; "fea079"; "b015d8"; "11e0cf"; "9f334f"; "70b9f6"; "0a5a29"; "85c4c6"; "4a3aa4"; "fea079"; "b015d8"; "11e0cf"; "9f334f"; "70b9f6"; "0a5a29";
-- doom/location token bag -- doom/location token bag
"47ffc3"; "170f10"; "47ffc3"; "170f10";
-- table -- table
"4ee1f2" "4ee1f2"
} }
-- objects with this tag will be ignored -- objects with this tag will be ignored
IGNORE_TAG = "CleanUpHelper_ignore" local IGNORE_TAG = "CleanUpHelper_ignore"
-- colors and order for following tables -- colors and order for following tables
local COLORS = { "White"; "Orange"; "Green"; "Red"; "Agenda" } local COLORS = { "White"; "Orange"; "Green"; "Red"; "Agenda" }
-- counter GUIDS (4x damage, 4x sanity and 4x resource) -- counter GUIDS (4x damage, 4x sanity and 4x resource)
local TOKEN_GUIDS = { local TOKEN_GUIDS = {
"eb08d6"; "e64eec"; "1f5a0a"; "591a45"; "eb08d6"; "e64eec"; "1f5a0a"; "591a45";
"468e88"; "0257d9"; "7b5729"; "beb964"; "468e88"; "0257d9"; "7b5729"; "beb964";
"4406f0"; "816d84"; "cd15ac"; "a4b60d" "4406f0"; "816d84"; "cd15ac"; "a4b60d"
} }
-- default values (4x damage, 4x horror, 4x resources) -- default values (4x damage, 4x horror, 4x resources)
DEFAULT_VALUES = { local DEFAULT_VALUES = {
0; 0; 0; 0; 0; 0; 0; 0;
0; 0; 0; 0; 0; 0; 0; 0;
5; 5; 5; 5 5; 5; 5; 5
} }
local PLAYERMAT_GUIDS = { "8b081b"; "bd0ff4"; "383d8b"; "0840d5" } local PLAYERMAT_GUIDS = { "8b081b"; "bd0ff4"; "383d8b"; "0840d5" }
@ -53,23 +53,23 @@ local TRASHCAN_GUIDS = { "147e80"; "f7b6c8"; "5f896a"; "4b8594"; "70b9f6" }
-- values for physics.cast (4 entries for player zones, 5th entry for agenda/act deck, 6th for campaign log) -- values for physics.cast (4 entries for player zones, 5th entry for agenda/act deck, 6th for campaign log)
local PHYSICS_POSITION = { local PHYSICS_POSITION = {
{ -54.5, 2, 21 }; { -54.5, 2, 21 };
{ -54.5, 2, -21 }; { -54.5, 2, -21 };
{ -25.0, 2, 26 }; { -25.0, 2, 26 };
{ -25.0, 2, -26 }; { -25.0, 2, -26 };
{ -02.0, 2, 10 }; { -02.0, 2, 10 };
{ -00.0, 2, -27 } { -00.0, 2, -27 }
} }
local PHYSICS_ROTATION = { 270, 270, 0, 180, 270, 0 } local PHYSICS_ROTATION = { 270, 270, 0, 180, 270, 0 }
local PHYSICS_SCALE = { local PHYSICS_SCALE = {
{ 36.6, 1, 14.5 }; { 36.6, 1, 14.5 };
{ 36.6, 1, 14.5 }; { 36.6, 1, 14.5 };
{ 28.0, 1, 14.5 }; { 28.0, 1, 14.5 };
{ 28.0, 1, 14.5 }; { 28.0, 1, 14.5 };
{ 55.0, 1, 13.5 }; { 55.0, 1, 13.5 };
{ 05.0, 1, 05.0 } { 05.0, 1, 05.0 }
} }
local tidyPlayermats = true local tidyPlayermats = true
@ -86,67 +86,67 @@ buttonParameters.function_owner = self
function onSave() return JSON.encode({ tidyPlayermats, importTrauma, resetResources }) end function onSave() return JSON.encode({ tidyPlayermats, importTrauma, resetResources }) end
function onLoad(saved_data) function onLoad(saved_data)
local loaded_data = JSON.decode(saved_data) local loaded_data = JSON.decode(saved_data)
if loaded_data ~= nil then if loaded_data ~= nil then
tidyPlayermats = loaded_data[1] tidyPlayermats = loaded_data[1]
importTrauma = loaded_data[2] importTrauma = loaded_data[2]
resetResources = loaded_data[3] resetResources = loaded_data[3]
end end
-- context menu and buttons -- context menu and buttons
self.addContextMenuItem("More Information", function() self.addContextMenuItem("More Information", function()
printToAll("------------------------------", "White") printToAll("------------------------------", "White")
printToAll("Clean Up Helper v" .. information["version"] .. " by Chr1Z", "Orange") printToAll("Clean Up Helper v" .. information["version"] .. " by Chr1Z", "Orange")
printToAll("last updated: " .. information["last_updated"], "White") printToAll("last updated: " .. information["last_updated"], "White")
printToAll("ignore tag: " .. IGNORE_TAG, "White") printToAll("ignore tag: " .. IGNORE_TAG, "White")
printToAll("Player order in the campaign log for trauma import:\nWhite, Orange, Green, Red", "White") printToAll("Player order in the campaign log for trauma import:\nWhite, Orange, Green, Red", "White")
end) end)
-- index 0: button as label -- index 0: button as label
buttonParameters.label = "Clean Up Helper v" .. information["version"] buttonParameters.label = "Clean Up Helper v" .. information["version"]
buttonParameters.click_function = "none" buttonParameters.click_function = "none"
buttonParameters.position = { x = 0, y = 0.1, z = -1.525 } buttonParameters.position = { x = 0, y = 0.1, z = -1.525 }
buttonParameters.height = 0 buttonParameters.height = 0
buttonParameters.width = 0 buttonParameters.width = 0
buttonParameters.font_size = 165 buttonParameters.font_size = 165
buttonParameters.font_color = "Black" buttonParameters.font_color = "Black"
self.createButton(buttonParameters) self.createButton(buttonParameters)
-- index 1: option button for playermats -- index 1: option button for playermats
buttonParameters.label = "Tidy playermats: " .. (tidyPlayermats and "✓" or "✗") buttonParameters.label = "Tidy playermats: " .. (tidyPlayermats and "✓" or "✗")
buttonParameters.color = { 0, 0, 0, 0.95 } buttonParameters.color = { 0, 0, 0, 0.95 }
buttonParameters.click_function = "toggle_tidyPlayermats" buttonParameters.click_function = "toggle_tidyPlayermats"
buttonParameters.position.z = buttonParameters.position.z + 0.7 buttonParameters.position.z = buttonParameters.position.z + 0.7
buttonParameters.height = 275 buttonParameters.height = 275
buttonParameters.width = 1550 buttonParameters.width = 1550
buttonParameters.font_size = 165 buttonParameters.font_size = 165
buttonParameters.font_color = "White" buttonParameters.font_color = "White"
self.createButton(buttonParameters) self.createButton(buttonParameters)
-- index 2: option button for trauma import -- index 2: option button for trauma import
buttonParameters.label = "Import trauma: " .. (importTrauma and "✓" or "✗") buttonParameters.label = "Import trauma: " .. (importTrauma and "✓" or "✗")
buttonParameters.click_function = "toggle_importTrauma" buttonParameters.click_function = "toggle_importTrauma"
buttonParameters.position.z = buttonParameters.position.z + 0.7 buttonParameters.position.z = buttonParameters.position.z + 0.7
self.createButton(buttonParameters) self.createButton(buttonParameters)
-- index 3: option button for resources -- index 3: option button for resources
buttonParameters.label = "Reset resources: " .. (resetResources and "✓" or "✗") buttonParameters.label = "Reset resources: " .. (resetResources and "✓" or "✗")
buttonParameters.click_function = "toggle_resetResources" buttonParameters.click_function = "toggle_resetResources"
buttonParameters.position.z = buttonParameters.position.z + 0.7 buttonParameters.position.z = buttonParameters.position.z + 0.7
self.createButton(buttonParameters) self.createButton(buttonParameters)
-- index 4: start button -- index 4: start button
buttonParameters.label = "Start!" buttonParameters.label = "Start!"
buttonParameters.click_function = "cleanUp" buttonParameters.click_function = "cleanUp"
buttonParameters.position.z = buttonParameters.position.z + 0.7 buttonParameters.position.z = buttonParameters.position.z + 0.7
buttonParameters.width = 775 buttonParameters.width = 775
self.createButton(buttonParameters) self.createButton(buttonParameters)
-- create single table for ignoring -- create single table for ignoring
for _, v in ipairs(CLUE_GUIDS) do table.insert(IGNORE_GUIDS, v) end for _, v in ipairs(CLUE_GUIDS) do table.insert(IGNORE_GUIDS, v) end
for _, v in ipairs(TRASHCAN_GUIDS) do table.insert(IGNORE_GUIDS, v) end for _, v in ipairs(TRASHCAN_GUIDS) do table.insert(IGNORE_GUIDS, v) end
for _, v in ipairs(PLAYERMAT_GUIDS) do table.insert(IGNORE_GUIDS, v) end for _, v in ipairs(PLAYERMAT_GUIDS) do table.insert(IGNORE_GUIDS, v) end
for _, v in ipairs(TOKEN_GUIDS) do table.insert(IGNORE_GUIDS, v) end for _, v in ipairs(TOKEN_GUIDS) do table.insert(IGNORE_GUIDS, v) end
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -154,18 +154,18 @@ end
--------------------------------------------------------- ---------------------------------------------------------
function toggle_tidyPlayermats() function toggle_tidyPlayermats()
tidyPlayermats = not tidyPlayermats tidyPlayermats = not tidyPlayermats
self.editButton({ index = 1, label = "Tidy playermats: " .. (tidyPlayermats and "✓" or "✗") }) self.editButton({ index = 1, label = "Tidy playermats: " .. (tidyPlayermats and "✓" or "✗") })
end end
function toggle_importTrauma() function toggle_importTrauma()
importTrauma = not importTrauma importTrauma = not importTrauma
self.editButton({ index = 2, label = "Import trauma: " .. (importTrauma and "✓" or "✗") }) self.editButton({ index = 2, label = "Import trauma: " .. (importTrauma and "✓" or "✗") })
end end
function toggle_resetResources() function toggle_resetResources()
resetResources = not resetResources resetResources = not resetResources
self.editButton({ index = 3, label = "Reset resources: " .. (resetResources and "✓" or "✗") }) self.editButton({ index = 3, label = "Reset resources: " .. (resetResources and "✓" or "✗") })
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -173,19 +173,19 @@ end
--------------------------------------------------------- ---------------------------------------------------------
function cleanUp() function cleanUp()
printToAll("------------------------------", "White") printToAll("------------------------------", "White")
printToAll("Clean up started!", "Orange") printToAll("Clean up started!", "Orange")
printToAll("Resetting counters...", "White") printToAll("Resetting counters...", "White")
getTrauma() getTrauma()
resetCounters() resetCounters()
removeBlessCurse() removeBlessCurse()
printToAll("Discarding player hands...", "White") printToAll("Discarding player hands...", "White")
discardHands() discardHands()
printToAll("Tidying big playmat...", "White") printToAll("Tidying big playmat...", "White")
startLuaCoroutine(self, "tidyPlaymatCoroutine") startLuaCoroutine(self, "tidyPlaymatCoroutine")
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -194,166 +194,165 @@ end
-- set counters to reset values -- set counters to reset values
function resetCounters() function resetCounters()
for i, guid in ipairs(TOKEN_GUIDS) do for i, guid in ipairs(TOKEN_GUIDS) do
-- skip this step for resource tokens when option disabled (token number 9-12) -- skip this step for resource tokens when option disabled (token number 9-12)
if resetResources or (i < 9 or i > 12) then if resetResources or (i < 9 or i > 12) then
local TOKEN = getObjectFromGUID(guid) local TOKEN = getObjectFromGUID(guid)
if TOKEN ~= nil then if TOKEN ~= nil then
TOKEN.call("updateVal", RESET_VALUES[i]) TOKEN.call("updateVal", RESET_VALUES[i])
else else
printToAll("Token number " .. i .. " could not be found and was skipped.", "Yellow") printToAll("Token number " .. i .. " could not be found and was skipped.", "Yellow")
end end
end
end end
end
-- reset doom on agenda -- reset doom on agenda
local doomcounter = getObjectFromGUID("85c4c6") local doomcounter = getObjectFromGUID("85c4c6")
if doomcounter ~= nil then if doomcounter ~= nil then
doomcounter.call("setToZero") doomcounter.call("setToZero")
end end
for i, guid in ipairs(TRACKER_GUIDS) do for i, guid in ipairs(TRACKER_GUIDS) do
local obj = getObjectFromGUID(guid) local obj = getObjectFromGUID(guid)
if obj ~= nil then if obj ~= nil then
obj.call("updateStats", { 1, 1, 1, 1 }) obj.call("updateStats", { 1, 1, 1, 1 })
else else
printToAll("Stat tracker number " .. i .. " could not be found and was skipped.", "Yellow") printToAll("Stat tracker number " .. i .. " could not be found and was skipped.", "Yellow")
end
end end
end
end end
-- read values for trauma from campaign log if enabled -- read values for trauma from campaign log if enabled
function getTrauma() function getTrauma()
-- load default values -- load default values
RESET_VALUES = {} RESET_VALUES = {}
for k, v in pairs(DEFAULT_VALUES) do for k, v in pairs(DEFAULT_VALUES) do
RESET_VALUES[k] = v RESET_VALUES[k] = v
end end
-- stop here if trauma import is disabled -- stop here if trauma import is disabled
if not importTrauma then if not importTrauma then
printToAll("Default values for health and sanity loaded.", "Yellow") printToAll("Default values for health and sanity loaded.", "Yellow")
return return
end end
-- get campaign log -- get campaign log
local campaignLog = findObjects(6)[1] local campaignLog = findObjects(6)[1]
if campaignLog == nil then if campaignLog == nil then
printToAll("Campaign log not found in standard position!", "Yellow") printToAll("Campaign log not found in standard position!", "Yellow")
printToAll("Default values for health and sanity loaded.", "Yellow") printToAll("Default values for health and sanity loaded.", "Yellow")
return return
end end
-- get data from campaign log if possible -- get data from campaign log if possible
local counterData = campaignLog.hit_object.getVar("ref_buttonData") local counterData = campaignLog.hit_object.getVar("ref_buttonData")
if counterData ~= nil then if counterData ~= nil then
printToAll("Trauma values found in campaign log!", "Green") printToAll("Trauma values found in campaign log!", "Green")
for i = 1, 10, 3 do for i = 1, 10, 3 do
RESET_VALUES[1 + (i - 1) / 3] = counterData.counter[i].value RESET_VALUES[1 + (i - 1) / 3] = counterData.counter[i].value
RESET_VALUES[5 + (i - 1) / 3] = counterData.counter[i + 1].value RESET_VALUES[5 + (i - 1) / 3] = counterData.counter[i + 1].value
end
else
printToAll("Trauma values could not be found in campaign log!", "Yellow")
printToAll("Default values for health and sanity loaded.", "Yellow")
end end
else
printToAll("Trauma values could not be found in campaign log!", "Yellow")
printToAll("Default values for health and sanity loaded.", "Yellow")
end
end end
-- get rid of bless/curse tokens via bless / curse manager -- get rid of bless/curse tokens via bless / curse manager
function removeBlessCurse() function removeBlessCurse()
local BlessCurseManager = getObjectFromGUID("5933fb") local BlessCurseManager = getObjectFromGUID("5933fb")
if BlessCurseManager ~= nil then if BlessCurseManager ~= nil then
BlessCurseManager.call("doRemove", "White") BlessCurseManager.call("doRemove", "White")
end end
end end
-- discard all hand objects -- discard all hand objects
function discardHands() function discardHands()
for i = 1, 4 do for i = 1, 4 do
local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[i]) local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[i])
local hand = Player[COLORS[i]].getHandObjects() local hand = Player[COLORS[i]].getHandObjects()
if trashcan == nil then return end if trashcan == nil then return end
for j = #hand, 1, -1 do trashcan.putObject(hand[j]) end for j = #hand, 1, -1 do trashcan.putObject(hand[j]) end
end end
end end
-- clean up for big playmat -- clean up for big playmat
function tidyPlaymatCoroutine() function tidyPlaymatCoroutine()
local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[5]) local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[5])
local PLAYMATZONE = getObjectFromGUID("a2f932") local PLAYMATZONE = getObjectFromGUID("a2f932")
if PLAYMATZONE == nil then if PLAYMATZONE == nil then
printToAll("Scripting zone for big playmat could not be found!", "Red") printToAll("Scripting zone for big playmat could not be found!", "Red")
elseif trashcan == nil then elseif trashcan == nil then
printToAll("Trashcan for big playmat could not be found!", "Red") printToAll("Trashcan for big playmat could not be found!", "Red")
else else
for _, obj in ipairs(PLAYMATZONE.getObjects()) do for _, obj in ipairs(PLAYMATZONE.getObjects()) do
-- ignore these elements -- ignore these elements
if indexOf(IGNORE_GUIDS, obj.getGUID()) == nil and obj.hasTag(IGNORE_TAG) == false then if indexOf(IGNORE_GUIDS, obj.getGUID()) == nil and obj.hasTag(IGNORE_TAG) == false then
coroutine.yield(0) coroutine.yield(0)
trashcan.putObject(obj) trashcan.putObject(obj)
end end
end
end end
end
local PLAYMAT = getObjectFromGUID('721ba2') local PLAYMAT = getObjectFromGUID('721ba2')
if PLAYMAT then if PLAYMAT then
PLAYMAT.setTable("SPAWNED_LOCATION_GUIDS", {}) PLAYMAT.setTable("SPAWNED_LOCATION_GUIDS", {})
end end
printToAll("Tidying playermats and agenda mat...", "White") printToAll("Tidying playermats and agenda mat...", "White")
startLuaCoroutine(self, "tidyPlayerMatCoroutine") startLuaCoroutine(self, "tidyPlayerMatCoroutine")
return 1 return 1
end end
-- clean up for the four playermats and the agenda/act playmat -- clean up for the four playermats and the agenda/act playmat
function tidyPlayerMatCoroutine() function tidyPlayerMatCoroutine()
for i = 1, 5 do for i = 1, 5 do
-- skip playermat (1-4) if option disabled -- skip playermat (1-4) if option disabled
if tidyPlayermats or i == 5 then if tidyPlayermats or i == 5 then
-- delay for animation purpose -- delay for animation purpose
for k = 1, 30 do coroutine.yield(0) end for k = 1, 30 do coroutine.yield(0) end
-- get respective trashcan -- get respective trashcan
local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[i]) local trashcan = getObjectFromGUID(TRASHCAN_GUIDS[i])
if trashcan == nil then if trashcan == nil then
printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found!", "Red") printToAll("Trashcan for " .. COLORS[i] .. " playmat could not be found!", "Red")
return return
end end
for _, entry in ipairs(findObjects(i)) do for _, entry in ipairs(findObjects(i)) do
local obj = entry.hit_object local obj = entry.hit_object
local desc_low = string.lower(obj.getDescription()) local desc_low = string.lower(obj.getDescription())
-- ignore these elements -- ignore these elements
if indexOf(IGNORE_GUIDS, obj.getGUID()) == nil and if indexOf(IGNORE_GUIDS, obj.getGUID()) == nil and obj.hasTag(IGNORE_TAG) == false and
obj.hasTag(IGNORE_TAG) == false and desc_low ~= "chaos bag" and desc_low ~= "action token" then
desc_low ~= "action token" then coroutine.yield(0)
coroutine.yield(0) trashcan.putObject(obj)
trashcan.putObject(obj)
-- flip action tokens back to ready -- flip action tokens back to ready
elseif desc_low == "action token" and obj.is_face_down then elseif desc_low == "action token" and obj.is_face_down then
obj.flip() obj.flip()
end
end
-- reset "activeInvestigatorId"
if i < 5 then
local playermat = getObjectFromGUID(PLAYERMAT_GUIDS[i])
if playermat then
playermat.setVar("activeInvestigatorId", "00000")
end
end
end end
end end
local datahelper = getObjectFromGUID("708279") -- reset "activeInvestigatorId"
if datahelper then if i < 5 then
datahelper.setTable("SPAWNED_PLAYER_CARD_GUIDS", {}) local playermat = getObjectFromGUID(PLAYERMAT_GUIDS[i])
if playermat then
playermat.setVar("activeInvestigatorId", "00000")
end
end
end end
end
printToAll("Clean up completed!", "Green") local datahelper = getObjectFromGUID("708279")
return 1 if datahelper then
datahelper.setTable("SPAWNED_PLAYER_CARD_GUIDS", {})
end
printToAll("Clean up completed!", "Green")
return 1
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -362,22 +361,22 @@ end
-- find objects depending on index (1 to 4 for playermats, 5 for agenda/act playmat, 6 for campaign log) -- find objects depending on index (1 to 4 for playermats, 5 for agenda/act playmat, 6 for campaign log)
function findObjects(num) function findObjects(num)
return Physics.cast({ return Physics.cast({
direction = { 0, 1, 0 }, direction = { 0, 1, 0 },
max_distance = 1, max_distance = 1,
type = 3, type = 3,
size = PHYSICS_SCALE[num], size = PHYSICS_SCALE[num],
origin = PHYSICS_POSITION[num], origin = PHYSICS_POSITION[num],
orientation = { 0, PHYSICS_ROTATION[num], 0 }, orientation = { 0, PHYSICS_ROTATION[num], 0 },
debug = SHOW_RAYS debug = SHOW_RAYS
}) })
end end
-- helper to search array -- helper to search array
function indexOf(array, value) function indexOf(array, value)
for i, v in ipairs(array) do for i, v in ipairs(array) do
if v == value then if v == value then
return i return i
end
end end
end
end end