Merge pull request #235 from argonui/spawn-position-update

Playermat: spawning accessories relative to mat
This commit is contained in:
BootleggerFinn 2023-03-12 14:45:08 -05:00 committed by GitHub
commit 102d26c94f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -30,7 +30,7 @@ do
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 }