Merge pull request #235 from argonui/spawn-position-update
Playermat: spawning accessories relative to mat
This commit is contained in:
commit
102d26c94f
@ -29,8 +29,9 @@ local chaosTokens = {}
|
|||||||
local chaosTokensLastMat = nil
|
local chaosTokensLastMat = nil
|
||||||
local IS_RESHUFFLING = false
|
local IS_RESHUFFLING = false
|
||||||
local bagSearchers = {}
|
local bagSearchers = {}
|
||||||
|
local MAT_COLORS = {"White", "Orange", "Green", "Red"}
|
||||||
local hideTitleSplashWaitFunctionId = nil
|
local hideTitleSplashWaitFunctionId = nil
|
||||||
local playmatAPI = require("playermat/PlaymatApi")
|
local playmatApi = require("playermat/PlaymatApi")
|
||||||
local tokenManager = require("core/token/TokenManager")
|
local tokenManager = require("core/token/TokenManager")
|
||||||
local playAreaAPI = require("core/PlayAreaApi")
|
local playAreaAPI = require("core/PlayAreaApi")
|
||||||
|
|
||||||
@ -811,17 +812,17 @@ end
|
|||||||
function applyOptionPanelChange(id, state)
|
function applyOptionPanelChange(id, state)
|
||||||
-- option: Snap tags
|
-- option: Snap tags
|
||||||
if id == "useSnapTags" then
|
if id == "useSnapTags" then
|
||||||
playmatAPI.setLimitSnapsByType(state, "All")
|
playmatApi.setLimitSnapsByType(state, "All")
|
||||||
optionPanel[id] = state
|
optionPanel[id] = state
|
||||||
|
|
||||||
-- option: Draw 1 button
|
-- option: Draw 1 button
|
||||||
elseif id == "showDrawButton" then
|
elseif id == "showDrawButton" then
|
||||||
playmatAPI.showDrawButton(state, "All")
|
playmatApi.showDrawButton(state, "All")
|
||||||
optionPanel[id] = state
|
optionPanel[id] = state
|
||||||
|
|
||||||
-- option: Clickable clue counters
|
-- option: Clickable clue counters
|
||||||
elseif id == "useClueClickers" then
|
elseif id == "useClueClickers" then
|
||||||
playmatAPI.clickableClues(state, "All")
|
playmatApi.clickableClues(state, "All")
|
||||||
optionPanel[id] = state
|
optionPanel[id] = state
|
||||||
|
|
||||||
-- update master clue counter
|
-- update master clue counter
|
||||||
@ -850,17 +851,19 @@ function applyOptionPanelChange(id, state)
|
|||||||
|
|
||||||
-- option: Show hand helper for each player
|
-- option: Show hand helper for each player
|
||||||
elseif id == "showHandHelper" then
|
elseif id == "showHandHelper" then
|
||||||
optionPanel[id][1] = spawnOrRemoveHelper(state, "Hand Helper", {-50.85, 1.6, 7.32}, {0, 270, 0})
|
for i, color in ipairs(MAT_COLORS) do
|
||||||
optionPanel[id][2] = spawnOrRemoveHelper(state, "Hand Helper", {-50.85, 1.6, -24.88}, {0, 270, 0})
|
local pos = playmatApi.transformLocalPosition({0.05, 0, -1.182}, color)
|
||||||
optionPanel[id][3] = spawnOrRemoveHelper(state, "Hand Helper", {-39.13, 1.6, 22.45}, {0, 000, 0})
|
local rot = playmatApi.returnRotation(color)
|
||||||
optionPanel[id][4] = spawnOrRemoveHelper(state, "Hand Helper", {-21.57, 1.6, -22.45}, {0, 180, 0})
|
optionPanel[id][i] = spawnOrRemoveHelper(state, "Hand Helper", pos, rot)
|
||||||
|
end
|
||||||
|
|
||||||
-- option: Show search assistant for each player
|
-- option: Show search assistant for each player
|
||||||
elseif id == "showSearchAssistant" then
|
elseif id == "showSearchAssistant" then
|
||||||
optionPanel[id][1] = spawnOrRemoveHelper(state, "Search Assistant", {-50.85, 1.6, 10.25}, {0, 270, 0})
|
for i, color in ipairs(MAT_COLORS) do
|
||||||
optionPanel[id][2] = spawnOrRemoveHelper(state, "Search Assistant", {-50.85, 1.6, -21.95}, {0, 270, 0})
|
local pos = playmatApi.transformLocalPosition({-0.3, 0, -1.182}, color)
|
||||||
optionPanel[id][3] = spawnOrRemoveHelper(state, "Search Assistant", {-36.20, 1.6, 22.45}, {0, 000, 0})
|
local rot = playmatApi.returnRotation(color)
|
||||||
optionPanel[id][4] = spawnOrRemoveHelper(state, "Search Assistant", {-24.50, 1.6, -22.45}, {0, 180, 0})
|
optionPanel[id][i] = spawnOrRemoveHelper(state, "Search Assistant", pos, rot)
|
||||||
|
end
|
||||||
|
|
||||||
-- option: Show chaos bag manager
|
-- option: Show chaos bag manager
|
||||||
elseif id == "showChaosBagManager" then
|
elseif id == "showChaosBagManager" then
|
||||||
@ -907,7 +910,6 @@ end
|
|||||||
---@param name String Name of the object that should be copied
|
---@param name String Name of the object that should be copied
|
||||||
---@param position Table Desired position of the object
|
---@param position Table Desired position of the object
|
||||||
function spawnHelperObject(name, position, rotation)
|
function spawnHelperObject(name, position, rotation)
|
||||||
|
|
||||||
local sourceBag = getObjectFromGUID("830bd0")
|
local sourceBag = getObjectFromGUID("830bd0")
|
||||||
|
|
||||||
-- error handling for missing sourceBag
|
-- error handling for missing sourceBag
|
||||||
|
@ -52,7 +52,6 @@ local THREAT_AREA = {
|
|||||||
|
|
||||||
local DRAW_DECK_POSITION = { x = -1.82, y = 1, z = 0 }
|
local DRAW_DECK_POSITION = { x = -1.82, y = 1, z = 0 }
|
||||||
local DISCARD_PILE_POSITION = { x = -1.82, y = 1.5, z = 0.61 }
|
local DISCARD_PILE_POSITION = { x = -1.82, y = 1.5, z = 0.61 }
|
||||||
local PLAY_ZONE_ROTATION = self.getRotation()
|
|
||||||
|
|
||||||
local TRASHCAN
|
local TRASHCAN
|
||||||
local STAT_TRACKER
|
local STAT_TRACKER
|
||||||
@ -158,7 +157,7 @@ function searchArea(origin, size)
|
|||||||
return Physics.cast({
|
return Physics.cast({
|
||||||
origin = origin,
|
origin = origin,
|
||||||
direction = {0, 1, 0},
|
direction = {0, 1, 0},
|
||||||
orientation = PLAY_ZONE_ROTATION,
|
orientation = self.getRotation(),
|
||||||
type = 3,
|
type = 3,
|
||||||
size = size,
|
size = size,
|
||||||
max_distance = 1,
|
max_distance = 1,
|
||||||
@ -181,7 +180,7 @@ function makeDiscardHandlerFor(searchPosition, discardPosition)
|
|||||||
if obj.tag == "Deck" or obj.tag == "Card" then
|
if obj.tag == "Deck" or obj.tag == "Card" then
|
||||||
if obj.hasTag("PlayerCard") then
|
if obj.hasTag("PlayerCard") then
|
||||||
obj.setPositionSmooth(self.positionToWorld(DISCARD_PILE_POSITION), false, true)
|
obj.setPositionSmooth(self.positionToWorld(DISCARD_PILE_POSITION), false, true)
|
||||||
obj.setRotation(PLAY_ZONE_ROTATION)
|
obj.setRotation(self.getRotation())
|
||||||
else
|
else
|
||||||
obj.setPositionSmooth(discardPosition, false, true)
|
obj.setPositionSmooth(discardPosition, false, true)
|
||||||
obj.setRotation({0, -90, 0})
|
obj.setRotation({0, -90, 0})
|
||||||
@ -220,7 +219,7 @@ function findObjectsAtPosition(localPos)
|
|||||||
return Physics.cast({
|
return Physics.cast({
|
||||||
origin = self.positionToWorld(localPos),
|
origin = self.positionToWorld(localPos),
|
||||||
direction = {0, 1, 0},
|
direction = {0, 1, 0},
|
||||||
orientation = {0, PLAY_ZONE_ROTATION.y + 90, 0},
|
orientation = {0, self.getRotation().y + 90, 0},
|
||||||
type = 3,
|
type = 3,
|
||||||
size = {3.2, 1, 2},
|
size = {3.2, 1, 2},
|
||||||
max_distance = 0,
|
max_distance = 0,
|
||||||
@ -252,7 +251,7 @@ function doUpkeep(_, color, alt_click)
|
|||||||
elseif obj.tag == "Card" and not obj.is_face_down and not inArea(self.positionToLocal(obj.getPosition()), INVESTIGATOR_AREA) then
|
elseif obj.tag == "Card" and not obj.is_face_down and not inArea(self.positionToLocal(obj.getPosition()), INVESTIGATOR_AREA) then
|
||||||
local cardMetadata = JSON.decode(obj.getGMNotes()) or {}
|
local cardMetadata = JSON.decode(obj.getGMNotes()) or {}
|
||||||
if not doNotReady(obj) then
|
if not doNotReady(obj) then
|
||||||
obj.setRotation(PLAY_ZONE_ROTATION)
|
obj.setRotation(self.getRotation())
|
||||||
end
|
end
|
||||||
if cardMetadata.id == "08031" then
|
if cardMetadata.id == "08031" then
|
||||||
forcedLearning = true
|
forcedLearning = true
|
||||||
@ -762,7 +761,7 @@ function clickableClues(showCounter)
|
|||||||
local pos = self.positionToWorld({x = -1.12, y = 0.05, z = 0.7})
|
local pos = self.positionToWorld({x = -1.12, y = 0.05, z = 0.7})
|
||||||
for i = 1, clueCount do
|
for i = 1, clueCount do
|
||||||
pos.y = pos.y + 0.045 * i
|
pos.y = pos.y + 0.045 * i
|
||||||
tokenManager.spawnToken(pos, "clue", PLAY_ZONE_ROTATION)
|
tokenManager.spawnToken(pos, "clue", self.getRotation())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -48,7 +48,7 @@ do
|
|||||||
return mat.call("getHandColor")
|
return mat.call("getHandColor")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Returns if there is the card"Dream-Enhancing Serum" on the requested playermat
|
-- Returns if there is the card "Dream-Enhancing Serum" on the requested playermat
|
||||||
---@param matColor String Color of the playermat
|
---@param matColor String Color of the playermat
|
||||||
PlaymatApi.isDES = function(matColor)
|
PlaymatApi.isDES = function(matColor)
|
||||||
local mat = getObjectFromGUID(MAT_IDS[matColor])
|
local mat = getObjectFromGUID(MAT_IDS[matColor])
|
||||||
@ -70,6 +70,21 @@ do
|
|||||||
return mat.call("returnGlobalDiscardPosition")
|
return mat.call("returnGlobalDiscardPosition")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Transforms a local position into a global position
|
||||||
|
---@param localPos Table Local position to be transformed
|
||||||
|
---@param matColor String Color of the playermat
|
||||||
|
PlaymatApi.transformLocalPosition = function(localPos, matColor)
|
||||||
|
local mat = getObjectFromGUID(MAT_IDS[matColor])
|
||||||
|
return mat.positionToWorld(localPos)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Returns the rotation of the requested playmat
|
||||||
|
---@param matColor String Color of the playermat
|
||||||
|
PlaymatApi.returnRotation = function(matColor)
|
||||||
|
local mat = getObjectFromGUID(MAT_IDS[matColor])
|
||||||
|
return mat.getRotation()
|
||||||
|
end
|
||||||
|
|
||||||
-- Sets the requested playermat's snap points to limit snapping to matching card types or not. If
|
-- Sets the requested playermat's snap points to limit snapping to matching card types or not. If
|
||||||
-- matchTypes is true, the main card slot snap points will only snap assets, while the
|
-- matchTypes is true, the main card slot snap points will only snap assets, while the
|
||||||
-- investigator area point will only snap Investigators. If matchTypes is false, snap points will
|
-- investigator area point will only snap Investigators. If matchTypes is false, snap points will
|
||||||
|
@ -28,9 +28,9 @@ do
|
|||||||
playerMatGuids["White"] = "8b081b"
|
playerMatGuids["White"] = "8b081b"
|
||||||
playerMatGuids["Green"] = "383d8b"
|
playerMatGuids["Green"] = "383d8b"
|
||||||
|
|
||||||
local commonZones = {}
|
local commonZones = {}
|
||||||
commonZones["Investigator"] = { -1.17702, 0, 0.00209 }
|
commonZones["Investigator"] = { -1.17702, 0, 0.00209 }
|
||||||
commonZones["Minicard"] = { -0.16, 0, -1.222326 }
|
commonZones["Minicard"] = { -1.17702, 0, -1.45 }
|
||||||
commonZones["Deck"] = { -1.822724, 0, -0.02940192 }
|
commonZones["Deck"] = { -1.822724, 0, -0.02940192 }
|
||||||
commonZones["Discard"] = { -1.822451, 0, 0.6092291 }
|
commonZones["Discard"] = { -1.822451, 0, 0.6092291 }
|
||||||
commonZones["Ally"] = { -0.6157398, 0, 0.02435675 }
|
commonZones["Ally"] = { -0.6157398, 0, 0.02435675 }
|
||||||
@ -48,7 +48,7 @@ do
|
|||||||
commonZones["Threat3"] = { 0.002246313, 0, -0.6430681 }
|
commonZones["Threat3"] = { 0.002246313, 0, -0.6430681 }
|
||||||
commonZones["Threat4"] = { 0.4590618, 0, -0.6432732 }
|
commonZones["Threat4"] = { 0.4590618, 0, -0.6432732 }
|
||||||
|
|
||||||
local zoneData = {}
|
local zoneData = {}
|
||||||
zoneData["White"] = {}
|
zoneData["White"] = {}
|
||||||
zoneData["White"]["Investigator"] = commonZones["Investigator"]
|
zoneData["White"]["Investigator"] = commonZones["Investigator"]
|
||||||
zoneData["White"]["Minicard"] = commonZones["Minicard"]
|
zoneData["White"]["Minicard"] = commonZones["Minicard"]
|
||||||
|
Loading…
Reference in New Issue
Block a user