diff --git a/src/chaosbag/BlessCurseManagerApi.ttslua b/src/chaosbag/BlessCurseManagerApi.ttslua index d6c8a9f0..639fe7d8 100644 --- a/src/chaosbag/BlessCurseManagerApi.ttslua +++ b/src/chaosbag/BlessCurseManagerApi.ttslua @@ -1,9 +1,14 @@ do local BlessCurseManagerApi = {} + local internal = {} + + internal.getManager = function() + return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) + end -- removes all taken tokens and resets the counts BlessCurseManagerApi.removeTakenTokensAndReset = function() - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) + local BlessCurseManager = internal.getManager() Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Bless") end, 0.05) Wait.time(function() BlessCurseManager.call("removeTakenTokens", "Curse") end, 0.10) Wait.time(function() BlessCurseManager.call("doReset", "White") end, 0.15) @@ -11,35 +16,30 @@ do -- updates the internal count (called by cards that seal bless/curse tokens) BlessCurseManagerApi.sealedToken = function(type, guid) - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) - BlessCurseManager.call("sealedToken", { type = type, guid = guid }) + internal.getManager().call("sealedToken", { type = type, guid = guid }) end -- updates the internal count (called by cards that seal bless/curse tokens) BlessCurseManagerApi.releasedToken = function(type, guid) - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) - BlessCurseManager.call("releasedToken", { type = type, guid = guid }) + internal.getManager().call("releasedToken", { type = type, guid = guid }) end -- broadcasts the current status for bless/curse tokens ---@param playerColor String Color of the player to show the broadcast to BlessCurseManagerApi.broadcastStatus = function(playerColor) - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) - BlessCurseManager.call("broadcastStatus", playerColor) + internal.getManager().call("broadcastStatus", playerColor) end -- removes all bless / curse tokens from the chaos bag and play ---@param playerColor String Color of the player to show the broadcast to BlessCurseManagerApi.removeAll = function(playerColor) - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) - BlessCurseManager.call("doRemove", playerColor) + internal.getManager().call("doRemove", playerColor) end -- adds Wendy's menu to the hovered card (allows sealing of tokens) ---@param color String Color of the player to show the broadcast to BlessCurseManagerApi.addWendysMenu = function(playerColor, hoveredObject) - local BlessCurseManager = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "BlessCurseManager"}) - BlessCurseManager.call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) + internal.getManager().call("addMenuOptions", { playerColor = playerColor, hoveredObject = hoveredObject }) end return BlessCurseManagerApi diff --git a/src/core/DoomInPlayCounter.ttslua b/src/core/DoomInPlayCounter.ttslua index d0509a9a..8ba806f7 100644 --- a/src/core/DoomInPlayCounter.ttslua +++ b/src/core/DoomInPlayCounter.ttslua @@ -1,20 +1,9 @@ --- common parameters -local castParameters = {} -castParameters.direction = { 0, 1, 0 } -castParameters.type = 3 -castParameters.max_distance = 0 +local playmatApi = require("playermat/PlaymatApi") -local zone +local ZONE, TRASH local doomURL = "https://i.imgur.com/EoL7yaZ.png" local IGNORE_TAG = "DoomCounter_ignore" - --- playermats 1 to 4 -local originAndSize = { - { origin = { -55, 1.6, 16.5 }, size = { 12, 1, 25 } }, - { origin = { -55, 1.6, -16.5 }, size = { 12, 1, 25 } }, - { origin = { -25, 1.6, 27 }, size = { 25, 1, 12 } }, - { origin = { -25, 1.6, -27 }, size = { 25, 1, 12 } } -} +local COLORS = { "White", "Orange", "Green", "Red" } -- create button, context menu and start loop function onLoad() @@ -31,33 +20,32 @@ function onLoad() color = { 0, 0, 0, 0 } }) - zone = getObjectFromGUID("a2f932") + trash = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "Trash"}) + ZONE = Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayAreaZone"}) loopID = Wait.time(countDoom, 2, -1) end -- main function function countDoom() local doom = 0 - for i = 1, 5 do doom = doom + search(i) end + for i = 1, 5 do + if i = 5 then + objList = ZONE.getObjects() + else + objList = playmatApi.searchAroundPlaymat(COLORS[i]) + end + + doom = doom + countDoomFromList(objList) + end self.editButton({ index = 0, label = tostring(doom) }) end --- searches playermats (num = 1-4) or the scripting zone (num = 5) -function search(num) - local val = 0 - if num == 5 then - for _, obj in ipairs(zone.getObjects()) do - val = val + isDoom(obj) - end - else - castParameters.origin = originAndSize[num].origin - castParameters.size = originAndSize[num].size - - for _, obj in ipairs(Physics.cast(castParameters)) do - val = val + isDoom(obj.hit_object) - end +function countDoomFromList(objList) + local count = 0 + for _, obj in ipairs(objList) do + count = count + isDoom(obj) end - return val + return count end -- checks an object for the doom image and gets quantity (for stacks) @@ -73,34 +61,30 @@ end -- removes doom from playermats / playarea function removeDoom(options) - local trashCan = getObjectFromGUID("70b9f6") local count = 0 + if options.Playermats then for i = 1, 4 do - castParameters.origin = originAndSize[i].origin - castParameters.size = originAndSize[i].size - - for _, obj in ipairs(Physics.cast(castParameters)) do - local obj = obj.hit_object - local amount = isDoom(obj) - if amount > 0 then - trashCan.putObject(obj) - count = count + amount - end - end + count = removeDoomFromList(playmatApi.searchAroundPlaymat(COLORS[i])) end broadcastToAll(count .. " doom removed from Playermats.", "White") end - local count = 0 if options.Playarea then - for _, obj in ipairs(zone.getObjects()) do - local amount = isDoom(obj) - if amount > 0 then - trashCan.putObject(obj) - count = count + amount - end - end - broadcastToAll(count .. " doom removed from Playarea.", "White") + count = removeDoomFromList(ZONE.getObjects()) + broadcastToAll(count .. " doom removed from Playerarea.", "White") end end + +-- removes doom from provided object list and returns the removed amount +function removeDoomFromList(objList) + local count = 0 + for _, obj in ipairs(objList) do + local amount = isDoom(obj) + if amount > 0 then + TRASH.putObject(obj) + count = count + amount + end + end + return count +end diff --git a/src/core/PlayAreaApi.ttslua b/src/core/PlayAreaApi.ttslua index 829b6f6f..7be3c6a4 100644 --- a/src/core/PlayAreaApi.ttslua +++ b/src/core/PlayAreaApi.ttslua @@ -1,5 +1,10 @@ do - local PlayAreaApi = { } + local PlayAreaApi = {} + local internal = {} + + internal.getPlayArea = function() + return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}) + end -- Returns the current value of the investigator counter from the playmat ---@return Integer. Number of investigators currently set on the counter @@ -14,90 +19,87 @@ do end -- Move all contents on the play area (cards, tokens, etc) one slot in the given direction. Certain - -- fixed objects will be ignored, as will anything the player has tagged with - -- 'displacement_excluded' - ---@param playerColor Color of the player requesting the shift. Used solely to send an error - --- message in the unlikely case that the scripting zone has been deleted + -- fixed objects will be ignored, as will anything the player has tagged with 'displacement_excluded' + ---@param playerColor Color Color of the player requesting the shift for messages PlayAreaApi.shiftContentsUp = function(playerColor) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("shiftContentsUp", playerColor) + return internal.getPlayArea().call("shiftContentsUp", playerColor) end PlayAreaApi.shiftContentsDown = function(playerColor) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("shiftContentsDown", playerColor) + return internal.getPlayArea().call("shiftContentsDown", playerColor) end PlayAreaApi.shiftContentsLeft = function(playerColor) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("shiftContentsLeft", playerColor) + return internal.getPlayArea().call("shiftContentsLeft", playerColor) end PlayAreaApi.shiftContentsRight = function(playerColor) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("shiftContentsRight", playerColor) + return internal.getPlayArea().call("shiftContentsRight", playerColor) end -- Reset the play area's tracking of which cards have had tokens spawned. PlayAreaApi.resetSpawnedCards = function() - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("resetSpawnedCards") + return internal.getPlayArea().call("resetSpawnedCards") end -- Event to be called when the current scenario has changed. ---@param scenarioName Name of the new scenario PlayAreaApi.onScenarioChanged = function(scenarioName) - Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("onScenarioChanged", scenarioName) + internal.getPlayArea().call("onScenarioChanged", scenarioName) end -- Sets this playmat's snap points to limit snapping to locations or not. -- If matchTypes is false, snap points will be reset to snap all cards. ---@param matchTypes Boolean Whether snap points should only snap for the matching card types. PlayAreaApi.setLimitSnapsByType = function(matchCardTypes) - Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("setLimitSnapsByType", matchCardTypes) + internal.getPlayArea().call("setLimitSnapsByType", matchCardTypes) end -- Receiver for the Global tryObjectEnterContainer event. Used to clear vector lines from dragged -- cards before they're destroyed by entering the container PlayAreaApi.tryObjectEnterContainer = function(container, object) - Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("tryObjectEnterContainer", - { container = container, object = object }) + internal.getPlayArea().call("tryObjectEnterContainer", { container = container, object = object }) end -- counts the VP on locations in the play area PlayAreaApi.countVP = function() - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("countVP") + return internal.getPlayArea().call("countVP") end -- highlights all locations in the play area without metadata ---@param state Boolean True if highlighting should be enabled PlayAreaApi.highlightMissingData = function(state) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("highlightMissingData", state) + return internal.getPlayArea().call("highlightMissingData", state) end -- highlights all locations in the play area with VP ---@param state Boolean True if highlighting should be enabled PlayAreaApi.highlightCountedVP = function(state) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("highlightCountedVP", state) + return internal.getPlayArea().call("highlightCountedVP", state) end -- Checks if an object is in the play area (returns true or false) PlayAreaApi.isInPlayArea = function(object) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("isInPlayArea", object) + return internal.getPlayArea().call("isInPlayArea", object) end PlayAreaApi.getSurface = function() - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).getCustomObject().image + return internal.getPlayArea().getCustomObject().image end PlayAreaApi.updateSurface = function(url) - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("updateSurface", url) + return internal.getPlayArea().call("updateSurface", url) end -- Called by Custom Data Helpers to push their location data into the Data Helper. This adds the -- data to the local token manager instance. ---@param args Table Single-value array holding the GUID of the Custom Data Helper making the call PlayAreaApi.updateLocations = function(args) - Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).call("updateLocations", args) + internal.getPlayArea().call("updateLocations", args) end PlayAreaApi.getCustomDataHelper = function() - return Global.call("getObjectFromMemo", {matColor = "Mythos", type = "PlayArea"}).getVar("customDataHelper") + return internal.getPlayArea().getVar("customDataHelper") end return PlayAreaApi