Update player mat handling of customizable cards
- Fixes broken data retrieval to get the selected upgrades - Moves "is this customization active" logic into the UpgradeSheetLibrary - Extends the area covered by searchAroundSelf() to extend farther in (and past) the set aside card areas - Made searchAroundSelf() dynamic, removing the need for explicit position and areas
This commit is contained in:
parent
90301b2e33
commit
ddb264fe13
@ -2,8 +2,6 @@
|
|||||||
-- specific setup (different for each playmat)
|
-- specific setup (different for each playmat)
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
PLAY_ZONE_POSITION = { x = -54.5, y = 4, z = 19 }
|
|
||||||
PLAY_ZONE_SCALE = { x = 32, y = 5, z = 12 }
|
|
||||||
TRASHCAN_GUID = "147e80"
|
TRASHCAN_GUID = "147e80"
|
||||||
STAT_TRACKER_GUID = "e598c2"
|
STAT_TRACKER_GUID = "e598c2"
|
||||||
RESOURCE_COUNTER_GUID = "4406f0"
|
RESOURCE_COUNTER_GUID = "4406f0"
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
-- specific setup (different for each playmat)
|
-- specific setup (different for each playmat)
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
PLAY_ZONE_POSITION = { x = -54.5, y = 4, z = -19 }
|
|
||||||
PLAY_ZONE_SCALE = { x = 32, y = 5, z = 12 }
|
|
||||||
TRASHCAN_GUID = "f7b6c8"
|
TRASHCAN_GUID = "f7b6c8"
|
||||||
STAT_TRACKER_GUID = "b4a5f7"
|
STAT_TRACKER_GUID = "b4a5f7"
|
||||||
RESOURCE_COUNTER_GUID = "816d84"
|
RESOURCE_COUNTER_GUID = "816d84"
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
-- specific setup (different for each playmat)
|
-- specific setup (different for each playmat)
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
PLAY_ZONE_POSITION = { x = -26.5, y = 4, z = 26.5 }
|
|
||||||
PLAY_ZONE_SCALE = { x = 32, y = 5, z = 12 }
|
|
||||||
TRASHCAN_GUID = "5f896a"
|
TRASHCAN_GUID = "5f896a"
|
||||||
STAT_TRACKER_GUID = "af7ed7"
|
STAT_TRACKER_GUID = "af7ed7"
|
||||||
RESOURCE_COUNTER_GUID = "cd15ac"
|
RESOURCE_COUNTER_GUID = "cd15ac"
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
-- specific setup (different for each playmat)
|
-- specific setup (different for each playmat)
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
PLAY_ZONE_POSITION = { x = -26.5, y = 4, z = -26.5 }
|
|
||||||
PLAY_ZONE_SCALE = { x = 32, y = 5, z = 12 }
|
|
||||||
TRASHCAN_GUID = "4b8594"
|
TRASHCAN_GUID = "4b8594"
|
||||||
STAT_TRACKER_GUID = "e74881"
|
STAT_TRACKER_GUID = "e74881"
|
||||||
RESOURCE_COUNTER_GUID = "a4b60d"
|
RESOURCE_COUNTER_GUID = "a4b60d"
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
-- selectedUpgrades holds the state of checkboxes and text input, each element being:
|
-- selectedUpgrades holds the state of checkboxes and text input, each element being:
|
||||||
-- selectedUpgrades[row] = { xp = #, text = "" }
|
-- selectedUpgrades[row] = { xp = #, text = "" }
|
||||||
|
|
||||||
|
local playmatApi = require("playermat/PlaymatApi")
|
||||||
|
|
||||||
-- Y position for UI elements. Visibility of checkboxes moves the checkbox inside the card object
|
-- Y position for UI elements. Visibility of checkboxes moves the checkbox inside the card object
|
||||||
-- when not selected.
|
-- when not selected.
|
||||||
local Y_VISIBLE = 0.25
|
local Y_VISIBLE = 0.25
|
||||||
@ -74,6 +76,16 @@ function getSelfId()
|
|||||||
return metadata.id
|
return metadata.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function isUpgradeActive(row)
|
||||||
|
return customizations[row] ~= nil
|
||||||
|
and customizations[row].checkboxes ~= nil
|
||||||
|
and customizations[row].checkboxes.count ~= nil
|
||||||
|
and customizations[row].checkboxes.count > 0
|
||||||
|
and selectedUpgrades[row] ~= nil
|
||||||
|
and selectedUpgrades[row].xp ~= nil
|
||||||
|
and selectedUpgrades[row].xp >= customizations[row].checkboxes.count
|
||||||
|
end
|
||||||
|
|
||||||
function resetSelections()
|
function resetSelections()
|
||||||
selectedUpgrades = { }
|
selectedUpgrades = { }
|
||||||
updateDisplay()
|
updateDisplay()
|
||||||
@ -218,6 +230,7 @@ function clickCheckbox(row, col, buttonIndex)
|
|||||||
selectedUpgrades[row].xp = col
|
selectedUpgrades[row].xp = col
|
||||||
end
|
end
|
||||||
updateCheckboxes(row)
|
updateCheckboxes(row)
|
||||||
|
playmatApi.syncAllCustomizableCards()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Updates saved value for given text box when it loses focus
|
-- Updates saved value for given text box when it loses focus
|
||||||
|
@ -15,6 +15,8 @@ local DRAWN_CHAOS_TOKEN_OFFSET = {-1.55, 0.25, -0.58}
|
|||||||
-- x-Values for discard buttons
|
-- x-Values for discard buttons
|
||||||
local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91}
|
local DISCARD_BUTTON_OFFSETS = {-1.365, -0.91, -0.455, 0, 0.455, 0.91}
|
||||||
|
|
||||||
|
local SEARCH_AROUND_SELF_X_BUFFER = 18
|
||||||
|
|
||||||
-- defined areas for the function "inArea()""
|
-- defined areas for the function "inArea()""
|
||||||
local MAIN_PLAY_AREA = {
|
local MAIN_PLAY_AREA = {
|
||||||
upperLeft = {
|
upperLeft = {
|
||||||
@ -155,8 +157,33 @@ function searchArea(origin, size)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Finds all objects on the playmat and associated set aside zone.
|
||||||
function searchAroundSelf()
|
function searchAroundSelf()
|
||||||
return searchArea(PLAY_ZONE_POSITION, PLAY_ZONE_SCALE)
|
local bounds = self.getBoundsNormalized()
|
||||||
|
-- Increase the width to cover the set aside zone
|
||||||
|
bounds.size.x = bounds.size.x + SEARCH_AROUND_SELF_X_BUFFER
|
||||||
|
-- Since the cast is centered on the position, shift left or right to keep the non-set aside edge
|
||||||
|
-- of the cast at the edge of the playmat
|
||||||
|
-- setAsideDirection accounts for the set aside zone being on the left or right, depending on the
|
||||||
|
-- table position of the playmat
|
||||||
|
local setAsideDirection = bounds.center.z > 0 and 1 or -1
|
||||||
|
local localCenter = self.positionToLocal(bounds.center)
|
||||||
|
localCenter.x = localCenter.x
|
||||||
|
+ setAsideDirection * SEARCH_AROUND_SELF_X_BUFFER / 2 / self.getScale().x
|
||||||
|
|
||||||
|
return searchArea(self.positionToWorld(localCenter), bounds.size)
|
||||||
|
end
|
||||||
|
|
||||||
|
function findCardsAroundSelf()
|
||||||
|
local cards = { }
|
||||||
|
for _, collision in ipairs(searchAroundSelf()) do
|
||||||
|
local obj = collision.hit_object
|
||||||
|
if obj.name == "Card" or obj.name == "CardCustom" then
|
||||||
|
table.insert(cards, obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return cards
|
||||||
end
|
end
|
||||||
|
|
||||||
function doNotReady(card)
|
function doNotReady(card)
|
||||||
@ -536,20 +563,6 @@ function replenishTokens(card, count, replenish)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- handling Runic Axe upgrade sheet for additional replenish
|
|
||||||
if card.getName() == "Runic Axe" then
|
|
||||||
for _, v in ipairs(searchAroundSelf()) do
|
|
||||||
local obj = v.hit_object
|
|
||||||
if obj.tag == "Card" then
|
|
||||||
local notes = JSON.decode(obj.getGMNotes()) or {}
|
|
||||||
if notes ~= nil and notes.id == "09022-c" then
|
|
||||||
if obj.getVar("markedBoxes")[7] == 3 then replenish = 2 end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- this is the theoretical new amount of uses (to be checked below)
|
-- this is the theoretical new amount of uses (to be checked below)
|
||||||
local newCount = foundTokens + replenish
|
local newCount = foundTokens + replenish
|
||||||
|
|
||||||
@ -569,21 +582,36 @@ function replenishTokens(card, count, replenish)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Finds all customizable cards in this play area and updates their metadata based on the selections
|
||||||
|
-- on the matching upgrade sheet.
|
||||||
|
-- This method is theoretically O(n^2), and should be used sparingly. In practice it will only be
|
||||||
|
-- called when a checkbox is added or removed in-game (which should be rare), and is bounded by the
|
||||||
|
-- number of customizable cards in play.
|
||||||
|
function syncAllCustomizableCards()
|
||||||
|
for _, card in ipairs(findCardsAroundSelf()) do
|
||||||
|
syncCustomizableMetadata(card)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function syncCustomizableMetadata(card)
|
function syncCustomizableMetadata(card)
|
||||||
local cardMetadata = JSON.decode(card.getGMNotes()) or { }
|
local cardMetadata = JSON.decode(card.getGMNotes()) or { }
|
||||||
if cardMetadata ~= nil and cardMetadata.customizations ~= nil then
|
if cardMetadata == nil or cardMetadata.customizations == nil then
|
||||||
for _, collision in ipairs(searchAroundSelf()) do
|
return
|
||||||
local obj = collision.hit_object
|
end
|
||||||
if obj.name == "Card" or obj.name == "CardCustom" then
|
for _, upgradeSheet in ipairs(findCardsAroundSelf()) do
|
||||||
local notes = JSON.decode(obj.getGMNotes()) or { }
|
local upgradeSheetMetadata = JSON.decode(upgradeSheet.getGMNotes()) or { }
|
||||||
if notes.id == (cardMetadata.id .. "-c") then
|
if upgradeSheetMetadata.id == (cardMetadata.id .. "-c") then
|
||||||
for i, customization in ipairs(cardMetadata.customizations) do
|
for i, customization in ipairs(cardMetadata.customizations) do
|
||||||
if obj.getVar("markedBoxes")[i] == customization.xp
|
if customization.replaces ~= nil and customization.replaces.uses ~= nil then
|
||||||
and customization.replaces ~= nil
|
-- Allowed use of call(), no APIs for individual cards
|
||||||
and customization.replaces.uses ~= nil then
|
if upgradeSheet.call("isUpgradeActive", i) then
|
||||||
cardMetadata.uses = customization.replaces.uses
|
cardMetadata.uses = customization.replaces.uses
|
||||||
card.setGMNotes(JSON.encode(cardMetadata))
|
card.setGMNotes(JSON.encode(cardMetadata))
|
||||||
end
|
else
|
||||||
|
-- TODO: Get the original metadata to restore it... maybe. This should only be
|
||||||
|
-- necessary in the very unlikely case that a user un-checks a previously-full upgrade
|
||||||
|
-- row while the card is in play. It will be much easier once the AllPlayerCardsApi is
|
||||||
|
-- in place, so defer until it is
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -185,6 +185,12 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
PlaymatApi.syncAllCustomizableCards = function()
|
||||||
|
for _, mat in ipairs(internal.getMatForColor("All")) do
|
||||||
|
mat.call("syncAllCustomizableCards")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Convenience function to look up a mat's object by color, or get all mats.
|
-- Convenience function to look up a mat's object by color, or get all mats.
|
||||||
---@param matColor String for one of the active player colors - White, Orange, Green, Red. Also
|
---@param matColor String for one of the active player colors - White, Orange, Green, Red. Also
|
||||||
-- accepts "All" as a special value which will return all four mats.
|
-- accepts "All" as a special value which will return all four mats.
|
||||||
|
Loading…
Reference in New Issue
Block a user