commit
c1f3746ae6
@ -234,6 +234,11 @@
|
|||||||
"Type": 0,
|
"Type": 0,
|
||||||
"URL": "http://cloud-3.steamusercontent.com/ugc/2510267932886739653/CB7AA2D73777EF5938A6E6CD664B2ABA52B6E20A/"
|
"URL": "http://cloud-3.steamusercontent.com/ugc/2510267932886739653/CB7AA2D73777EF5938A6E6CD664B2ABA52B6E20A/"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Name": "token-eldersign",
|
||||||
|
"Type": 0,
|
||||||
|
"URL": "http://cloud-3.steamusercontent.com/ugc/2540675016035917168/C0D6F531A85FD94C2F54825DFC50781B5B499A1D/"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Name": "token-custom-token",
|
"Name": "token-custom-token",
|
||||||
"Type": 0,
|
"Type": 0,
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
"IgnoreFoW": false,
|
"IgnoreFoW": false,
|
||||||
"LayoutGroupSortIndex": 0,
|
"LayoutGroupSortIndex": 0,
|
||||||
"Locked": false,
|
"Locked": false,
|
||||||
"LuaScript": "",
|
"LuaScript": "require(\"playercards/cards/KohakuNarukami\")",
|
||||||
"LuaScriptState": "",
|
"LuaScriptState": "",
|
||||||
"MeasureMovement": false,
|
"MeasureMovement": false,
|
||||||
"Name": "Card",
|
"Name": "Card",
|
||||||
@ -58,5 +58,5 @@
|
|||||||
"scaleZ": 1.15
|
"scaleZ": 1.15
|
||||||
},
|
},
|
||||||
"Value": 0,
|
"Value": 0,
|
||||||
"XmlUI": ""
|
"XmlUI": "\u003cInclude src=\"playercards/KohakuNarukami.xml\"/\u003e"
|
||||||
}
|
}
|
||||||
|
@ -266,6 +266,19 @@ function updateDisplayAndBroadcast(type)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function getBlessCurseInBag()
|
||||||
|
local numInBag = { Bless = 0, Curse = 0 }
|
||||||
|
local chaosBag = chaosBagApi.findChaosBag()
|
||||||
|
|
||||||
|
for _, v in ipairs(chaosBag.getObjects()) do
|
||||||
|
if v.name == "Bless" or v.name == "Curse" then
|
||||||
|
numInBag[v.name] = numInBag[v.name] + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return numInBag
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
-- main functions: add and remove
|
-- main functions: add and remove
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
@ -67,5 +67,9 @@ do
|
|||||||
getManager().call("removeToken", type)
|
getManager().call("removeToken", type)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
BlessCurseManagerApi.getBlessCurseInBag = function()
|
||||||
|
return getManager().call("getBlessCurseInBag", {})
|
||||||
|
end
|
||||||
|
|
||||||
return BlessCurseManagerApi
|
return BlessCurseManagerApi
|
||||||
end
|
end
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
require("playercards/CardsWithHelper")
|
require("playercards/CardsWithHelper")
|
||||||
|
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
|
||||||
local chaosBagApi = require("chaosbag/ChaosBagApi")
|
local chaosBagApi = require("chaosbag/ChaosBagApi")
|
||||||
local guidReferenceApi = require("core/GUIDReferenceApi")
|
local guidReferenceApi = require("core/GUIDReferenceApi")
|
||||||
local playermatApi = require("playermat/PlayermatApi")
|
local playermatApi = require("playermat/PlayermatApi")
|
||||||
|
|
||||||
local isHelperEnabled = false
|
local isHelperEnabled = false
|
||||||
|
local updated
|
||||||
|
|
||||||
function updateSave()
|
function updateSave()
|
||||||
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
|
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
|
||||||
@ -34,6 +36,7 @@ function initialize()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function resolveToken(player, _, tokenType)
|
function resolveToken(player, _, tokenType)
|
||||||
|
if not updated then return end
|
||||||
local matColor
|
local matColor
|
||||||
if player.color == "Black" then
|
if player.color == "Black" then
|
||||||
matColor = playermatApi.getMatColorByPosition(self.getPosition())
|
matColor = playermatApi.getMatColorByPosition(self.getPosition())
|
||||||
@ -43,11 +46,13 @@ function resolveToken(player, _, tokenType)
|
|||||||
|
|
||||||
local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat")
|
local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat")
|
||||||
chaosBagApi.drawChaosToken(mat, true, tokenType)
|
chaosBagApi.drawChaosToken(mat, true, tokenType)
|
||||||
|
updated = false
|
||||||
|
Wait.frames(maybeUpdateButtonState, 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- count tokens in the bag and show appropriate buttons
|
-- count tokens in the bag and show appropriate buttons
|
||||||
function maybeUpdateButtonState()
|
function maybeUpdateButtonState()
|
||||||
local numInBag = getBlessCurseInBag()
|
local numInBag = blessCurseManagerApi.getBlessCurseInBag()
|
||||||
local state = { Bless = false, Curse = false }
|
local state = { Bless = false, Curse = false }
|
||||||
|
|
||||||
if numInBag.Bless >= numInBag.Curse and numInBag.Bless > 0 then
|
if numInBag.Bless >= numInBag.Curse and numInBag.Bless > 0 then
|
||||||
@ -59,19 +64,7 @@ function maybeUpdateButtonState()
|
|||||||
end
|
end
|
||||||
|
|
||||||
setUiState(state)
|
setUiState(state)
|
||||||
end
|
updated = true
|
||||||
|
|
||||||
function getBlessCurseInBag()
|
|
||||||
local numInBag = { Bless = 0, Curse = 0 }
|
|
||||||
local chaosBag = chaosBagApi.findChaosBag()
|
|
||||||
|
|
||||||
for _, v in ipairs(chaosBag.getObjects()) do
|
|
||||||
if v.name == "Bless" or v.name == "Curse" then
|
|
||||||
numInBag[v.name] = numInBag[v.name] + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return numInBag
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function setUiState(params)
|
function setUiState(params)
|
||||||
@ -87,7 +80,7 @@ function setUiState(params)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function errorMessage()
|
function errorMessage()
|
||||||
local numInBag = getBlessCurseInBag()
|
local numInBag = blessCurseManagerApi.getBlessCurseInBag()
|
||||||
|
|
||||||
if numInBag.Bless == 0 and numInBag.Curse == 0 then
|
if numInBag.Bless == 0 and numInBag.Curse == 0 then
|
||||||
broadcastToAll("There are no Bless or Curse tokens in the chaos bag.", "Red")
|
broadcastToAll("There are no Bless or Curse tokens in the chaos bag.", "Red")
|
||||||
|
139
src/playercards/cards/KohakuNarukami.ttslua
Normal file
139
src/playercards/cards/KohakuNarukami.ttslua
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
require("playercards/CardsWithHelper")
|
||||||
|
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
|
||||||
|
local guidReferenceApi = require("core/GUIDReferenceApi")
|
||||||
|
local playermatApi = require("playermat/PlayermatApi")
|
||||||
|
local searchLib = require("util/SearchLib")
|
||||||
|
local tokenManager = require("core/token/TokenManager")
|
||||||
|
|
||||||
|
local isHelperEnabled = false
|
||||||
|
local updated
|
||||||
|
|
||||||
|
function updateSave()
|
||||||
|
self.script_state = JSON.encode({ isHelperEnabled = isHelperEnabled })
|
||||||
|
end
|
||||||
|
|
||||||
|
function onLoad(savedData)
|
||||||
|
self.addTag("CardWithHelper")
|
||||||
|
if savedData and savedData ~= "" then
|
||||||
|
local loadedData = JSON.decode(savedData)
|
||||||
|
isHelperEnabled = loadedData.isHelperEnabled
|
||||||
|
end
|
||||||
|
checkOptionPanel()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- hide buttons and stop monitoring
|
||||||
|
function shutOff()
|
||||||
|
self.UI.hide("Helper")
|
||||||
|
Wait.stopAll()
|
||||||
|
updateSave()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- show buttons and begin monitoring chaos bag for curse and bless tokens
|
||||||
|
function initialize()
|
||||||
|
self.UI.show("Helper")
|
||||||
|
maybeUpdateButtonState()
|
||||||
|
Wait.time(maybeUpdateButtonState, 1, -1)
|
||||||
|
updateSave()
|
||||||
|
end
|
||||||
|
|
||||||
|
function addTokenToBag(_, _, tokenType)
|
||||||
|
if not updated then return end
|
||||||
|
blessCurseManagerApi.addToken(tokenType)
|
||||||
|
updated = false
|
||||||
|
Wait.frames(maybeUpdateButtonState, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
function removeAndExtraAction()
|
||||||
|
if not updated then return end
|
||||||
|
blessCurseManagerApi.removeToken("Bless")
|
||||||
|
blessCurseManagerApi.removeToken("Bless")
|
||||||
|
blessCurseManagerApi.removeToken("Curse")
|
||||||
|
blessCurseManagerApi.removeToken("Curse")
|
||||||
|
updated = false
|
||||||
|
Wait.frames(maybeUpdateButtonState, 2)
|
||||||
|
|
||||||
|
local position = self.getPosition()
|
||||||
|
local matColor = playermatApi.getMatColorByPosition(position)
|
||||||
|
local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat")
|
||||||
|
local rotation = mat.getRotation()
|
||||||
|
|
||||||
|
-- find empty action token slots
|
||||||
|
-- check snap point states
|
||||||
|
local snaps = mat.getSnapPoints()
|
||||||
|
|
||||||
|
-- get first empty slot
|
||||||
|
local fullSlots = {}
|
||||||
|
local positions = {}
|
||||||
|
for _, snap in ipairs(snaps) do
|
||||||
|
if snap.tags[1] == "UniversalToken" then
|
||||||
|
table.insert(positions, mat.positionToWorld(snap.position))
|
||||||
|
local searchResult = searchLib.atPosition(positions[#positions], "isUniversalToken")
|
||||||
|
table.insert(fullSlots, #searchResult > 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 2, 6 do -- look at all 5 slots above investigator card
|
||||||
|
if fullSlots[i] ~= true then
|
||||||
|
callback = function(spawned) spawned.call("updateClassAndSymbol", { class = "Mystic", symbol = "Mystic" }) spawned.addTag("Temporary") end
|
||||||
|
tokenManager.spawnToken(positions[i] + Vector(0, 0.7, 0), "universalActionAbility", rotation, callback)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- if all slots are full
|
||||||
|
callback = function(spawned) spawned.call("updateClassAndSymbol", { class = "Mystic", symbol = "Mystic" }) spawned.addTag("Temporary") end
|
||||||
|
tokenManager.spawnToken(position + Vector(0, 0.7, 0), "universalActionAbility", rotation, callback)
|
||||||
|
end
|
||||||
|
|
||||||
|
function elderSignAbility()
|
||||||
|
blessCurseManagerApi.addToken("Bless")
|
||||||
|
blessCurseManagerApi.addToken("Curse")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- count tokens in the bag and show appropriate buttons
|
||||||
|
function maybeUpdateButtonState()
|
||||||
|
local numInBag = blessCurseManagerApi.getBlessCurseInBag()
|
||||||
|
local state = { Bless = false, Curse = false, Action = false, ElderSign = false }
|
||||||
|
|
||||||
|
if numInBag.Bless <= numInBag.Curse and numInBag.Bless < 10 then
|
||||||
|
state.Bless = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if numInBag.Curse <= numInBag.Bless and numInBag.Curse < 10 then
|
||||||
|
state.Curse = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if numInBag.Curse >= 2 and numInBag.Bless >= 2 then
|
||||||
|
state.Action = true
|
||||||
|
end
|
||||||
|
|
||||||
|
state.ElderSign = true
|
||||||
|
|
||||||
|
setUiState(state)
|
||||||
|
updated = true
|
||||||
|
end
|
||||||
|
|
||||||
|
function setUiState(params)
|
||||||
|
for _, tokenName in ipairs({ "Bless", "Curse", "Action", "ElderSign" }) do
|
||||||
|
if params[tokenName] then
|
||||||
|
self.UI.show(tokenName)
|
||||||
|
self.UI.hide("inactive" .. tokenName)
|
||||||
|
else
|
||||||
|
self.UI.show("inactive" .. tokenName)
|
||||||
|
self.UI.hide(tokenName)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function errorMessage(_, _, triggeringButton)
|
||||||
|
local numInBag = blessCurseManagerApi.getBlessCurseInBag()
|
||||||
|
if triggeringButton == "inactiveAction" then
|
||||||
|
broadcastToAll("There are not enough Blesses and/or Curses in the chaos bag.", "Red")
|
||||||
|
elseif numInBag.Bless == 10 and numInBag.Curse == 10 then
|
||||||
|
broadcastToAll("No more tokens can be added to the chaos bag.", "Red")
|
||||||
|
elseif numInBag.Bless < numInBag.Curse then
|
||||||
|
broadcastToAll("There are more Bless tokens than Curse tokens in the chaos bag.", "Red")
|
||||||
|
else
|
||||||
|
broadcastToAll("There are more Curse tokens than Bless tokens in the chaos bag.", "Red")
|
||||||
|
end
|
||||||
|
end
|
@ -313,7 +313,9 @@ function doUpkeep(_, clickedByColor, isRightClick)
|
|||||||
local forcedLearning = false
|
local forcedLearning = false
|
||||||
local rot = self.getRotation()
|
local rot = self.getRotation()
|
||||||
for _, obj in ipairs(searchAroundSelf()) do
|
for _, obj in ipairs(searchAroundSelf()) do
|
||||||
if obj.hasTag("UniversalToken") == true and obj.is_face_down then
|
if obj.hasTag("Temporary") == true then
|
||||||
|
discardListOfObjects({obj})
|
||||||
|
elseif obj.hasTag("UniversalToken") == true and obj.is_face_down then
|
||||||
obj.flip()
|
obj.flip()
|
||||||
elseif obj.type == "Card" and not inArea(self.positionToLocal(obj.getPosition()), INVESTIGATOR_AREA) then
|
elseif obj.type == "Card" and not inArea(self.positionToLocal(obj.getPosition()), INVESTIGATOR_AREA) then
|
||||||
local cardMetadata = JSON.decode(obj.getGMNotes()) or {}
|
local cardMetadata = JSON.decode(obj.getGMNotes()) or {}
|
||||||
|
94
xml/playercards/KohakuNarukami.xml
Normal file
94
xml/playercards/KohakuNarukami.xml
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<Defaults>
|
||||||
|
<Button padding="50 50 50 50"
|
||||||
|
font="font_teutonic-arkham"
|
||||||
|
fontSize="200"
|
||||||
|
iconWidth="300"
|
||||||
|
iconAlignment="Right"/>
|
||||||
|
<Button class="inactive"
|
||||||
|
onClick="errorMessage"
|
||||||
|
color="#353535E6"
|
||||||
|
textColor="#A0A0A0"/>
|
||||||
|
<Button class="active"
|
||||||
|
onClick="addTokenToBag"
|
||||||
|
textColor="white"
|
||||||
|
active="false"/>
|
||||||
|
<TableLayout position="0 188 -22"
|
||||||
|
rotation="0 0 90"
|
||||||
|
height="1800"
|
||||||
|
width="700"
|
||||||
|
scale="0.1 0.1 1"
|
||||||
|
cellSpacing="80"
|
||||||
|
cellBackgroundColor="rgba(1,1,1,0)"/>
|
||||||
|
</Defaults>
|
||||||
|
|
||||||
|
<Panel id="Helper"
|
||||||
|
active="false">
|
||||||
|
<TableLayout>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="Bless"
|
||||||
|
icon="token-bless"
|
||||||
|
color="#9D702CE6"
|
||||||
|
class="active"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="Curse"
|
||||||
|
icon="token-curse"
|
||||||
|
color="#633A84E6"
|
||||||
|
class="active"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="Action"
|
||||||
|
text="Remove tokens"
|
||||||
|
color="#6D202CE6"
|
||||||
|
class="active"
|
||||||
|
onClick="removeAndExtraAction"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="ElderSign"
|
||||||
|
icon="token-eldersign"
|
||||||
|
color="#50A8CEE6"
|
||||||
|
class="active"
|
||||||
|
onClick="elderSignAbility"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
</TableLayout>
|
||||||
|
<TableLayout>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="inactiveBless"
|
||||||
|
icon="token-bless"
|
||||||
|
class="inactive"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="inactiveCurse"
|
||||||
|
icon="token-curse"
|
||||||
|
class="inactive"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="inactiveAction"
|
||||||
|
text="Remove tokens"
|
||||||
|
class="inactive"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Cell>
|
||||||
|
<Button id="inactiveElderSign"
|
||||||
|
text="Elder Sign"
|
||||||
|
icon="token-eldersign"
|
||||||
|
class="inactive"
|
||||||
|
onClick="elderSignAbility"/>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
</TableLayout>
|
||||||
|
</Panel>
|
Loading…
Reference in New Issue
Block a user