bcc6dc5b8d
- Move position up - Add common COLLISION_ENABLED handling to prevent splash from showing when reloading a save with the scenario card on the table
75 lines
2.5 KiB
Plaintext
75 lines
2.5 KiB
Plaintext
local playArea = require("core/PlayAreaApi")
|
|
local tokenSpawnTracker = require("core/token/TokenSpawnTrackerApi")
|
|
|
|
local ENCOUNTER_DECK_AREA = {
|
|
upperLeft = { x = 0.9, z = 0.42 },
|
|
lowerRight = { x = 0.86, z = 0.38 },
|
|
}
|
|
local ENCOUNTER_DISCARD_AREA = {
|
|
upperLeft = { x = 1.62, z = 0.42 },
|
|
lowerRight = { x = 1.58, z = 0.38 },
|
|
}
|
|
|
|
local currentScenario
|
|
-- we use this to turn off collision handling until onLoad() is complete
|
|
local COLLISION_ENABLED = false
|
|
|
|
function onLoad(saveState)
|
|
if saveState ~= nil then
|
|
local loadedState = JSON.decode(saveState) or { }
|
|
currentScenario = loadedState.currentScenario
|
|
end
|
|
COLLISION_ENABLED = true
|
|
end
|
|
|
|
function onSave()
|
|
return JSON.encode({
|
|
currentScenario = currentScenario
|
|
})
|
|
end
|
|
|
|
-- TTS event handler. Handles scenario name event triggering and encounter card token resets.
|
|
function onCollisionEnter(collisionInfo)
|
|
if not COLLISION_ENABLED then
|
|
return
|
|
end
|
|
local object = collisionInfo.collision_object
|
|
if object.getName() == "Scenario" then
|
|
if currentScenario ~= object.getDescription() then
|
|
currentScenario = object.getDescription()
|
|
fireScenarioChangedEvent()
|
|
end
|
|
end
|
|
|
|
local localPos = self.positionToLocal(object.getPosition())
|
|
if inArea(localPos, ENCOUNTER_DECK_AREA) or inArea(localPos, ENCOUNTER_DISCARD_AREA) then
|
|
tokenSpawnTracker.resetTokensSpawned(object.getGUID())
|
|
end
|
|
end
|
|
|
|
-- Listens for cards entering the encounter deck or encounter discard, and resets the spawn state
|
|
-- for the cards when they do.
|
|
function onObjectEnterContainer(container, object)
|
|
local localPos = self.positionToLocal(container.getPosition())
|
|
if inArea(localPos, ENCOUNTER_DECK_AREA) or inArea(localPos, ENCOUNTER_DISCARD_AREA) then
|
|
tokenSpawnTracker.resetTokensSpawned(object.getGUID())
|
|
end
|
|
end
|
|
|
|
function fireScenarioChangedEvent()
|
|
Wait.frames(function() Global.call('titleSplash', currentScenario) end, 20)
|
|
playArea.onScenarioChanged(currentScenario)
|
|
end
|
|
|
|
-- Simple method to check if the given point is in a specified area. Local use only,
|
|
---@param point Vector. Point to check, only x and z values are relevant
|
|
---@param bounds Table. Defined area to see if the point is within. See MAIN_PLAY_AREA for sample
|
|
-- bounds definition.
|
|
---@return Boolean. True if the point is in the area defined by bounds
|
|
function inArea(point, bounds)
|
|
return (point.x < bounds.upperLeft.x
|
|
and point.x > bounds.lowerRight.x
|
|
and point.z < bounds.upperLeft.z
|
|
and point.z > bounds.lowerRight.z)
|
|
end
|