BLESS_COLOR = { r = 0.3, g = 0.25, b = 0.09 } CURSE_COLOR = { r = 0.2, g = 0.08, b = 0.24 } MIN_VALUE = 1 MAX_VALUE = 10 IMAGE_URL = { Bless = "http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/", Curse = "http://cloud-3.steamusercontent.com/ugc/1655601092778636039/2A25BD38E8C44701D80DD96BF0121DA21843672E/" } function onload() self.createButton({ label = "Add", click_function = "addBlessToken", function_owner = self, position = { -2.3, 0.1, -0.5 }, height = 150, width = 300, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = BLESS_COLOR }) self.createButton({ label = "Remove", click_function = "removeBlessToken", function_owner = self, position = { -0.9, 0.1, -0.5 }, height = 150, width = 450, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = BLESS_COLOR }) self.createButton({ label = "Take", click_function = "takeBlessToken", function_owner = self, position = { 0.7, 0.1, -0.5 }, height = 150, width = 350, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = BLESS_COLOR }) self.createButton({ label = "Return", click_function = "returnBlessToken", function_owner = self, position = { 2.1, 0.1, -0.5 }, height = 150, width = 400, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = BLESS_COLOR }) self.createButton({ label = "Add", click_function = "addCurseToken", function_owner = self, position = { -2.3, 0.1, 0.5 }, height = 150, width = 300, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = CURSE_COLOR }) self.createButton({ label = "Remove", click_function = "removeCurseToken", function_owner = self, position = { -0.9, 0.1, 0.5 }, height = 150, width = 450, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = CURSE_COLOR }) self.createButton({ label = "Take", click_function = "takeCurseToken", function_owner = self, position = { 0.7, 0.1, 0.5 }, height = 150, width = 350, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = CURSE_COLOR }) self.createButton({ label = "Return", click_function = "returnCurseToken", function_owner = self, position = { 2.1, 0.1, 0.5 }, height = 150, width = 400, scale = { x = 1.75, y = 1.75, z = 1.75 }, font_size = 100, font_color = { r = 1, g = 1, b = 1 }, color = CURSE_COLOR }) self.createButton({ label = "Reset", click_function = "doReset", function_owner = self, position = { 0, 0, 1.8 }, rotation = { 0, 0, 0 }, height = 350, width = 800, font_size = 250, color = { 0, 0, 0 }, font_color = { 1, 1, 1 } }) numInPlay = { Bless = 0, Curse = 0 } tokensTaken = { Bless = {}, Curse = {} } sealedTokens = {} Wait.time(initializeState, 1) addHotkey("Bless Curse Status", printStatus, false) addHotkey("Wendy's Menu", addMenuOptions, false) end function initializeState() playerColor = "White" -- count tokens in the bag local chaosbag = getChaosBag() if chaosbag == nil then return end local tokens = {} for i, v in ipairs(chaosbag.getObjects()) do if v.name == "Bless" then numInPlay.Bless = numInPlay.Bless + 1 elseif v.name == "Curse" then numInPlay.Curse = numInPlay.Curse + 1 end end -- find tokens in the play area local objs = getObjects() for i, obj in ipairs(objs) do local pos = obj.getPosition() if (pos.x > -110 and pos.x < 44 and pos.z > -77 and pos.z < 77) then if obj.getName() == "Bless" then table.insert(tokensTaken.Bless, obj.getGUID()) numInPlay.Bless = numInPlay.Bless + 1 elseif obj.getName() == "Curse" then table.insert(tokensTaken.Curse, obj.getGUID()) numInPlay.Curse = numInPlay.Curse + 1 end end end mode = "Bless" print("Bless Tokens " .. getTokenCount()) mode = "Curse" print("Curse Tokens " .. getTokenCount()) end function printStatus(player_color, hovered_object, world_position, key_down_up) mode = "Curse" broadcastToColor("Curse Tokens " .. getTokenCount(), player_color) mode = "Bless" broadcastToColor("Bless Tokens " .. getTokenCount(), player_color) end function doReset(_obj, _color, alt_click) playerColor = _color numInPlay = { Bless = 0, Curse = 0 } tokensTaken = { Bless = {}, Curse = {} } initializeState() end function addBlessToken(_obj, _color, alt_click) addToken("Bless", _color) end function addCurseToken(_obj, _color, alt_click) addToken("Curse", _color) end function addToken(type, _color) if numInPlay[type] == MAX_VALUE then printToColor(MAX_VALUE .. " tokens already in play, not adding any", _color) else mode = type spawnToken() end end function spawnToken() local pos = getChaosBagPosition() if pos == nil then return end local url = IMAGE_URL[mode] local obj = spawnObject({ type = 'Custom_Tile', position = { pos.x, pos.y + 3, pos.z }, rotation = { x = 0, y = 260, z = 0 }, callback_function = spawn_callback }) obj.setCustomObject({ type = 2, image = url, thickness = 0.10, }) obj.scale { 0.81, 1, 0.81 } return obj end function spawn_callback(obj) obj.setName(mode) local guid = obj.getGUID() numInPlay[mode] = numInPlay[mode] + 1 printToAll("Adding " .. mode .. " token " .. getTokenCount()) end function removeBlessToken(_obj, _color, alt_click) takeToken("Bless", _color, true) end function removeCurseToken(_obj, _color, alt_click) takeToken("Curse", _color, true) end function takeBlessToken(_obj, _color, alt_click) takeToken("Bless", _color, false) end function takeCurseToken(_obj, _color, alt_click) takeToken("Curse", _color, false) end function takeToken(type, _color, remove) playerColor = _color local chaosbag = getChaosBag() if chaosbag == nil then return end if not remove and not SEAL_CARD_MESSAGE then broadcastToColor("Are you trying to seal a token on a card? Return " .. "this one, then try right-clicking on the card for seal options.", _color) SEAL_CARD_MESSAGE = true end local tokens = {} for i, v in ipairs(chaosbag.getObjects()) do if v.name == type then table.insert(tokens, v.guid) end end if #tokens == 0 then printToColor("No " .. type .. " tokens in the chaos bag", _color) return end local pos = self.getPosition() local callback = take_callback if remove then callback = remove_callback num = removeNum end local guid = table.remove(tokens) mode = type local position = Vector({ pos.x - 2, pos.y, pos.z + 2.5 }) if type == "Curse" then position = position + Vector({ 0, 0, -5 }) end chaosbag.takeObject({ guid = guid, position = position, smooth = false, callback_function = callback }) end function remove_callback(obj) take_callback(obj, true) end function take_callback(obj, remove) local guid = obj.getGUID() if remove then numInPlay[mode] = numInPlay[mode] - 1 printToAll("Removing " .. mode .. " token " .. getTokenCount()) obj.destruct() else table.insert(tokensTaken[mode], guid) printToAll("Taking " .. mode .. " token " .. getTokenCount()) end end function returnBlessToken(_obj, _color, alt_click) returnToken("Bless", _color) end function returnCurseToken(_obj, _color, alt_click) returnToken("Curse", _color) end function returnToken(type, _color) mode = type local guid = table.remove(tokensTaken[type]) if guid == nil then printToColor("No " .. mode .. " tokens to return", _color) return end local token = getObjectFromGUID(guid) if token == nil then printToColor("Couldn't find token " .. guid .. ", not returning to bag", _color) return end playerColor = _color local chaosbag = getChaosBag() if chaosbag == nil then return end chaosbag.putObject(token) printToAll("Returning " .. type .. " token " .. getTokenCount()) end function getChaosBag() local items = getObjectFromGUID("83ef06").getObjects() local chaosbag = nil for i, v in ipairs(items) do if v.getDescription() == "Chaos Bag" then chaosbag = getObjectFromGUID(v.getGUID()) break end end if chaosbag == nil then printToColor("No chaos bag found", playerColor) end return chaosbag end function getChaosBagPosition() local chaosbag = getChaosBag() if chaosbag == nil then return nil end return chaosbag.getPosition() end function getTokenCount() return "(" .. (numInPlay[mode] - #tokensTaken[mode]) .. "/" .. #tokensTaken[mode] .. ")" end function addMenuOptions(playerColor, hoveredObject, pointerPosition, isKeyUp) local manager = self if hoveredObject == nil or hoveredObject.getVar("MENU_ADDED") == true then return end if hoveredObject.tag ~= "Card" then broadcastToColor("Right-click seal options can only be added to cards", playerColor) return end hoveredObject.addContextMenuItem("Seal Bless", function(color) manager.call("sealToken", { type = "Bless", playerColor = color, enemy = hoveredObject }) end, true) hoveredObject.addContextMenuItem("Release Bless", function(color) manager.call("releaseToken", { type = "Bless", playerColor = color, enemy = hoveredObject }) end, true) hoveredObject.addContextMenuItem("Seal Curse", function(color) manager.call("sealToken", { type = "Curse", playerColor = color, enemy = hoveredObject }) end, true) hoveredObject.addContextMenuItem("Release Curse", function(color) manager.call("releaseToken", { type = "Curse", playerColor = color, enemy = hoveredObject }) end, true) broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor) hoveredObject.setVar("MENU_ADDED", true) sealedTokens[hoveredObject.getGUID()] = {} end function sealToken(params) playerColor = params.playerColor local chaosbag = getChaosBag() if chaosbag == nil then return end local pos = params.enemy.getPosition() local manager = self for i, token in ipairs(chaosbag.getObjects()) do if token.name == params.type then chaosbag.takeObject({ position = { pos.x, pos.y + 1, pos.z }, index = i - 1, smooth = false, callback_function = function(obj) Wait.frames(function() local mSealedTokens = manager.getVar("sealedTokens") local tokens = mSealedTokens[params.enemy.getGUID()] table.insert(tokens, obj) manager.setVar("sealedTokens", mSealedTokens) local guid = obj.getGUID() local tokensTaken = manager.getVar("tokensTaken") table.insert(tokensTaken[params.type], guid) manager.setVar("tokensTaken", tokensTaken) manager.setVar("mode", params.type) printToColor("Sealing " .. params.type .. " token " .. manager.call("getTokenCount"), params.playerColor) end , 1) end }) return end end printToColor(params.type .. " token not found in bag", playerColor) end function releaseToken(params) playerColor = params.playerColor local chaosbag = getChaosBag() if chaosbag == nil then return end local tokens = sealedTokens[params.enemy.getGUID()] if tokens == nil or #tokens == 0 then return end mode = params.type for i, token in ipairs(tokens) do if token ~= nil and token.getName() == params.type then local guid = token.getGUID() chaosbag.putObject(token) for j, v in ipairs(tokensTaken[mode]) do if v == guid then table.remove(tokensTaken[mode], j) table.remove(tokens, i) printToColor("Releasing " .. mode .. " token" .. getTokenCount(), params.playerColor) return end end end end printToColor(params.type .. " token not sealed on " .. params.enemy.getName(), params.playerColor) end