2022-10-19 19:07:47 -04:00
|
|
|
BLESS_COLOR = { r = 0.3, g = 0.25, b = 0.09 }
|
|
|
|
CURSE_COLOR = { r = 0.2, g = 0.08, b = 0.24 }
|
2020-11-28 11:46:13 -05:00
|
|
|
MIN_VALUE = 1
|
|
|
|
MAX_VALUE = 10
|
|
|
|
IMAGE_URL = {
|
2021-01-02 22:28:57 -05:00
|
|
|
Bless = "http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/",
|
|
|
|
Curse = "http://cloud-3.steamusercontent.com/ugc/1655601092778636039/2A25BD38E8C44701D80DD96BF0121DA21843672E/"
|
2020-11-28 11:46:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
function onload()
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
})
|
|
|
|
|
2021-02-13 12:12:29 -05:00
|
|
|
self.createButton({
|
2022-10-19 19:07:47 -04:00
|
|
|
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 }
|
2021-02-13 12:12:29 -05:00
|
|
|
})
|
|
|
|
|
2022-10-19 19:07:47 -04:00
|
|
|
numInPlay = { Bless = 0, Curse = 0 }
|
|
|
|
tokensTaken = { Bless = {}, Curse = {} }
|
2022-03-27 10:12:31 -04:00
|
|
|
sealedTokens = {}
|
2020-11-28 11:46:13 -05:00
|
|
|
Wait.time(initializeState, 1)
|
2021-02-13 12:12:29 -05:00
|
|
|
|
|
|
|
addHotkey("Bless Curse Status", printStatus, false)
|
2022-03-27 10:12:31 -04:00
|
|
|
addHotkey("Wendy's Menu", addMenuOptions, false)
|
2020-11-28 11:46:13 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
function initializeState()
|
|
|
|
playerColor = "White"
|
|
|
|
-- count tokens in the bag
|
|
|
|
local chaosbag = getChaosBag()
|
|
|
|
if chaosbag == nil then return end
|
|
|
|
local tokens = {}
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, v in ipairs(chaosbag.getObjects()) do
|
2020-11-28 11:46:13 -05:00
|
|
|
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
|
2022-03-27 10:12:31 -04:00
|
|
|
local objs = getObjects()
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, obj in ipairs(objs) do
|
2022-03-27 10:12:31 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
mode = "Bless"
|
|
|
|
print("Bless Tokens " .. getTokenCount())
|
|
|
|
mode = "Curse"
|
|
|
|
print("Curse Tokens " .. getTokenCount())
|
|
|
|
end
|
2021-02-13 12:12:29 -05:00
|
|
|
|
|
|
|
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
|
2022-10-19 19:07:47 -04:00
|
|
|
numInPlay = { Bless = 0, Curse = 0 }
|
|
|
|
tokensTaken = { Bless = {}, Curse = {} }
|
2021-02-13 12:12:29 -05:00
|
|
|
initializeState()
|
|
|
|
end
|
2020-11-28 11:46:13 -05:00
|
|
|
|
|
|
|
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',
|
2022-10-19 19:07:47 -04:00
|
|
|
position = { pos.x, pos.y + 3, pos.z },
|
|
|
|
rotation = { x = 0, y = 260, z = 0 },
|
2020-11-28 11:46:13 -05:00
|
|
|
callback_function = spawn_callback
|
|
|
|
})
|
|
|
|
obj.setCustomObject({
|
|
|
|
type = 2,
|
|
|
|
image = url,
|
|
|
|
thickness = 0.10,
|
|
|
|
})
|
2022-10-19 19:07:47 -04:00
|
|
|
obj.scale { 0.81, 1, 0.81 }
|
2020-11-28 11:46:13 -05:00
|
|
|
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
|
2022-03-27 10:12:31 -04:00
|
|
|
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
|
2020-11-28 11:46:13 -05:00
|
|
|
local tokens = {}
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, v in ipairs(chaosbag.getObjects()) do
|
2020-11-28 11:46:13 -05:00
|
|
|
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
|
2022-10-19 19:07:47 -04:00
|
|
|
local position = Vector({ pos.x - 2, pos.y, pos.z + 2.5 })
|
2022-03-27 10:12:31 -04:00
|
|
|
if type == "Curse" then
|
2022-10-19 19:07:47 -04:00
|
|
|
position = position + Vector({ 0, 0, -5 })
|
2022-03-27 10:12:31 -04:00
|
|
|
end
|
2020-11-28 11:46:13 -05:00
|
|
|
chaosbag.takeObject({
|
|
|
|
guid = guid,
|
2022-03-27 10:12:31 -04:00
|
|
|
position = position,
|
2020-11-28 11:46:13 -05:00
|
|
|
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
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, v in ipairs(items) do
|
2020-11-28 11:46:13 -05:00
|
|
|
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] .. ")"
|
2022-03-27 10:12:31 -04:00
|
|
|
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
|
|
|
|
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, token in ipairs(chaosbag.getObjects()) do
|
2022-03-27 10:12:31 -04:00
|
|
|
if token.name == params.type then
|
|
|
|
chaosbag.takeObject({
|
2022-10-19 19:07:47 -04:00
|
|
|
position = { pos.x, pos.y + 1, pos.z },
|
|
|
|
index = i - 1,
|
|
|
|
smooth = false,
|
|
|
|
callback_function = function(obj)
|
|
|
|
Wait.frames(function()
|
2022-03-27 10:12:31 -04:00
|
|
|
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)
|
2022-10-19 19:07:47 -04:00
|
|
|
printToColor("Sealing " .. params.type .. " token " .. manager.call("getTokenCount"),
|
|
|
|
params.playerColor)
|
2022-03-27 10:12:31 -04:00
|
|
|
end
|
2022-10-19 19:07:47 -04:00
|
|
|
, 1)
|
2022-03-27 10:12:31 -04:00
|
|
|
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
|
|
|
|
|
2022-10-19 19:07:47 -04:00
|
|
|
for i, token in ipairs(tokens) do
|
2022-03-27 10:12:31 -04:00
|
|
|
if token ~= nil and token.getName() == params.type then
|
|
|
|
local guid = token.getGUID()
|
|
|
|
chaosbag.putObject(token)
|
2022-10-19 19:07:47 -04:00
|
|
|
for j, v in ipairs(tokensTaken[mode]) do
|
2022-03-27 10:12:31 -04:00
|
|
|
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)
|
2022-10-19 19:07:47 -04:00
|
|
|
end
|