diff --git a/src/arkhamdb/DeckImporterUi.ttslua b/src/arkhamdb/DeckImporterUi.ttslua index 5788446d..524907c0 100644 --- a/src/arkhamdb/DeckImporterUi.ttslua +++ b/src/arkhamdb/DeckImporterUi.ttslua @@ -150,11 +150,8 @@ end -- Event handlers for deck ID change function redDeckChanged(_, _, inputValue) redDeckId = inputValue end - function orangeDeckChanged(_, _, inputValue) orangeDeckId = inputValue end - function whiteDeckChanged(_, _, inputValue) whiteDeckId = inputValue end - function greenDeckChanged(_, _, inputValue) greenDeckId = inputValue end -- Event handlers for toggle buttons @@ -174,14 +171,7 @@ function loadInvestigatorsChanged() end function loadDecks() - -- testLoadLotsOfDecks() - -- Method in DeckImporterMain, visible due to inclusion - - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end + if not allCardsBagApi.isIndexReady() then return end if (redDeckId ~= nil and redDeckId ~= "") then buildDeck("Red", redDeckId) end diff --git a/src/playercards/AllCardsBag.ttslua b/src/playercards/AllCardsBag.ttslua index c141564b..2355b2f4 100644 --- a/src/playercards/AllCardsBag.ttslua +++ b/src/playercards/AllCardsBag.ttslua @@ -18,7 +18,7 @@ end -- called once indexing is complete it means the hotfix bag has been added -- later, and we should rebuild the index to integrate the hotfix bag. function rebuildIndexForHotfix() - if (indexingDone) then + if indexingDone then startIndexBuild() end end @@ -210,6 +210,9 @@ function cardComparator(id1, id2) end function isIndexReady() + if not indexingDone then + broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) + end return indexingDone end @@ -221,10 +224,7 @@ end -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata function getCardById(params) - if (not indexingDone) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return { } - end + if not isIndexReady() then return {} end return cardIdIndex[params.id] end @@ -237,10 +237,8 @@ end -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata function getCardsByClassAndLevel(params) - if (not indexingDone) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return { } - end + if not isIndexReady() then return {} end + local upgradeKey if (params.upgraded) then upgradeKey = "-upgrade" @@ -251,10 +249,7 @@ function getCardsByClassAndLevel(params) end function getCardsByCycle(cycleName) - if (not indexingDone) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return { } - end + if not isIndexReady() then return {} end return cycleIndex[string.lower(cycleName)] end diff --git a/src/playercards/AllCardsBagApi.ttslua b/src/playercards/AllCardsBagApi.ttslua index 350f2f8d..c7baf29f 100644 --- a/src/playercards/AllCardsBagApi.ttslua +++ b/src/playercards/AllCardsBagApi.ttslua @@ -6,6 +6,14 @@ do return guidReferenceApi.getObjectByOwnerAndType("Mythos", "AllCardsBag") end + local function returnCopyOfList(data) + local copiedList = {} + for _, id in ipairs(data) do + table.insert(copiedList, id) + end + return copiedList + end + -- Returns a specific card from the bag, based on ArkhamDB ID ---@param id table String ID of the card to retrieve ---@return table table @@ -14,7 +22,7 @@ do -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata AllCardsBagApi.getCardById = function(id) - return getAllCardsBag().call("getCardById", {id = id}) + return getAllCardsBag().call("getCardById", { id = id }) end -- Gets a random basic weakness from the bag. Once a given ID has been returned @@ -36,7 +44,7 @@ do -- called once indexing is complete it means the hotfix bag has been added -- later, and we should rebuild the index to integrate the hotfix bag. AllCardsBagApi.rebuildIndexForHotfix = function() - return getAllCardsBag().call("rebuildIndexForHotfix") + getAllCardsBag().call("rebuildIndexForHotfix") end -- Searches the bag for cards which match the given name and returns a list. Note that this is @@ -44,7 +52,7 @@ do ---@param name string or string fragment to search for names ---@param exact boolean Whether the name match should be exact AllCardsBagApi.getCardsByName = function(name, exact) - return getAllCardsBag().call("getCardsByName", {name = name, exact = exact}) + return returnCopyOfList(getAllCardsBag().call("getCardsByName", { name = name, exact = exact })) end AllCardsBagApi.isBagPresent = function() @@ -59,16 +67,16 @@ do -- cardData: TTS object data, suitable for spawning the card -- cardMetadata: Table of parsed metadata AllCardsBagApi.getCardsByClassAndLevel = function(class, upgraded) - return getAllCardsBag().call("getCardsByClassAndLevel", {class = class, upgraded = upgraded}) + return returnCopyOfList(getAllCardsBag().call("getCardsByClassAndLevel", { class = class, upgraded = upgraded })) end AllCardsBagApi.getCardsByCycle = function(cycle) - return getAllCardsBag().call("getCardsByCycle", cycle) + return returnCopyOfList(getAllCardsBag().call("getCardsByCycle", cycle)) end AllCardsBagApi.getUniqueWeaknesses = function() - return getAllCardsBag().call("getUniqueWeaknesses") + return returnCopyOfList(getAllCardsBag().call("getUniqueWeaknesses")) end return AllCardsBagApi -end \ No newline at end of file +end diff --git a/src/playercards/PlayerCardPanel.ttslua b/src/playercards/PlayerCardPanel.ttslua index d1ae7311..f84bb340 100644 --- a/src/playercards/PlayerCardPanel.ttslua +++ b/src/playercards/PlayerCardPanel.ttslua @@ -26,22 +26,20 @@ local CYCLE_BUTTONS_Z_OFFSET = 0.2665 local STARTER_DECK_MODE_SELECTED_COLOR = { 0.2, 0.2, 0.2, 0.8 } local TRANSPARENT = { 0, 0, 0, 0 } -local STARTER_DECK_MODE_STARTERS = "starters" -local STARTER_DECK_MODE_CARDS_ONLY = "cards" -local FACE_UP_ROTATION = { x = 0, y = 270, z = 0} -local FACE_DOWN_ROTATION = { x = 0, y = 270, z = 180} +local FACE_UP_ROTATION = { x = 0, y = 270, z = 0 } +local FACE_DOWN_ROTATION = { x = 0, y = 270, z = 180 } -- ---------- IMPORTANT ---------- -- Coordinates defined below are in global dimensions relative to the panel - DO NOT USE THESE --- DIRECTLY. Call scalePositions() before use, and reference the variables below +-- DIRECTLY. Call scalePositions() before use, and reference the variables below -- Layout width for a single card, in global coordinate space local CARD_WIDTH = 2.3 --- Coordinates to begin laying out cards. These vary based on the cards that are being placed by +-- Coordinates to begin laying out cards. These vary based on the cards that are being placed by -- considering the width of the cards, number of cards, and desired spread intervals. --- IMPORTANT! Because of the mix of global card sizes and relative-to-scale positions, the X and Y +-- IMPORTANT! Because of the mix of global card sizes and relative-to-scale positions, the X and Y -- coordinates on these provide global disances while the Z is local. local START_POSITIONS = { classCards = Vector(CARD_WIDTH * 9.5, 2, 1.4), @@ -50,7 +48,7 @@ local START_POSITIONS = { other = Vector(CARD_WIDTH * 9.5, 2, 1.4), randomWeakness = Vector(0, 2, 1.4), -- Because the card spread is handled by the SpawnBag, we don't know (programatically) where this - -- should be placed. If more customizable cards are added it will need to be moved. + -- should be placed. If more customizable cards are added it will need to be moved. summonedServitor = Vector(CARD_WIDTH * -7.5, 2, 1.7) } @@ -64,12 +62,12 @@ local INVESTIGATOR_POSITION_SHIFT_ROW = Vector(0, 0, 11) local INVESTIGATOR_POSITION_SHIFT_COL = Vector(-6, 0, 0) local INVESTIGATOR_MAX_COLS = 6 --- Positions relative to the minicard to place other stacks. Both signature card piles and starter +-- Positions relative to the minicard to place other stacks. Both signature card piles and starter -- decks use SIGNATURE_OFFSET local INVESTIGATOR_CARD_OFFSET = Vector(0, 0, 2.55) local INVESTIGATOR_SIGNATURE_OFFSET = Vector(0, 0, 5.75) --- USE THESE! Positions and offset shifts accounting for the scale of the panel +-- USE THESE! Positions and offset shifts accounting for the scale of the panel local startPositions local cardRowOffset local cardGroupOffset @@ -78,7 +76,14 @@ local investigatorPositionShiftCol local investigatorCardOffset local investigatorSignatureOffset -local CLASS_LIST = { "Guardian", "Seeker", "Rogue", "Mystic", "Survivor", "Neutral" } +local CLASS_LIST = { + "Guardian", + "Seeker", + "Rogue", + "Mystic", + "Survivor", + "Neutral" +} local CYCLE_LIST = { "Core", "The Dunwich Legacy", @@ -94,9 +99,8 @@ local CYCLE_LIST = { } local excludedNonBasicWeaknesses - -local starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY -local helpVisibleToPlayers = { } +local spawnStarterDecks = false +local helpVisibleToPlayers = {} function onSave() return JSON.encode({ spawnBagState = spawnBag.getStateForSave() }) @@ -104,7 +108,7 @@ end function onLoad(savedData) if savedData and savedData ~= "" then - local saveState = JSON.decode(savedData) or { } + local saveState = JSON.decode(savedData) or {} if saveState.spawnBagState ~= nil then spawnBag.loadFromSave(saveState.spawnBagState) end @@ -117,7 +121,7 @@ end -- Build a list of non-basic weaknesses which should be excluded from the last weakness set, -- including all signature cards and evolved weaknesses. function buildExcludedWeaknessList() - excludedNonBasicWeaknesses = { } + excludedNonBasicWeaknesses = {} for _, investigator in pairs(INVESTIGATORS) do for _, signatureId in ipairs(investigator.signatures) do excludedNonBasicWeaknesses[signatureId] = true @@ -274,9 +278,8 @@ function createCycleButtons() if rowCount == 3 then -- Account for two centered buttons on the final row buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET / 2 - --[[ Account for centered button on the final row - buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET - ]] + -- Account for centered button on the final row + -- buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET end else buttonPos.x = buttonPos.x + CYCLE_BUTTONS_X_OFFSET @@ -297,8 +300,6 @@ function createClearButton() end function createInvestigatorModeButtons() - local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS - self.createButton({ function_owner = self, click_function = "setCardsOnlyMode", @@ -306,18 +307,18 @@ function createInvestigatorModeButtons() height = 170, width = 760, scale = Vector(0.25, 1, 0.25), - color = starterMode and TRANSPARENT or STARTER_DECK_MODE_SELECTED_COLOR + color = spawnStarterDecks and TRANSPARENT or STARTER_DECK_MODE_SELECTED_COLOR }) self.createButton({ function_owner = self, - click_function = "setStarterDeckMode", + click_function = "setspawnStarterDecks", position = Vector(0.66, 0.1, -0.322), height = 170, width = 760, scale = Vector(0.25, 1, 0.25), - color = starterMode and STARTER_DECK_MODE_SELECTED_COLOR or TRANSPARENT + color = spawnStarterDecks and STARTER_DECK_MODE_SELECTED_COLOR or TRANSPARENT }) - local checkX = starterMode and 0.52 or 0.11 + local checkX = spawnStarterDecks and 0.52 or 0.11 self.createButton({ function_owner = self, label = "✓", @@ -325,7 +326,8 @@ function createInvestigatorModeButtons() position = Vector(checkX, 0.11, -0.317), height = 0, width = 0, - scale = Vector(0.3, 1, 0.3), + font_size = 300, + scale = Vector(0.1, 1, 0.1), font_color = { 0, 0, 0 }, color = { 1, 1, 1 } }) @@ -354,13 +356,13 @@ function updateHelpVisibility() self.UI.setAttribute("helpPanel", "active", string.len(visibility) > 0) end -function setStarterDeckMode() - starterDeckMode = STARTER_DECK_MODE_STARTERS +function setspawnStarterDecks() + spawnStarterDecks = true updateStarterModeButtons() end function setCardsOnlyMode() - starterDeckMode = STARTER_DECK_MODE_CARDS_ONLY + spawnStarterDecks = false updateStarterModeButtons() end @@ -384,7 +386,7 @@ end function scalePositions() -- Assume scaling is consistent in X and Z dimensions local scale = 1 / self.getScale().x - startPositions = { } + startPositions = {} for key, pos in pairs(START_POSITIONS) do -- Because a scaled object means a different global size, using global distance for Z results in -- the cards being closer or farther depending on the scale. Leave the Z values and only scale X and Y @@ -405,14 +407,12 @@ function deleteAll() spawnBag.recall(true) end --- Spawn an investigator group, based on the current UI setting for either investigators or starter --- decks. +-- Spawn an investigator group, based on the current UI setting for either investigators or starter decks ---@param groupName string Name of the group to spawn, matching a key in InvestigatorPanelData function spawnInvestigatorGroup(groupName) - local starterMode = starterDeckMode == STARTER_DECK_MODE_STARTERS prepareToPlaceCards() Wait.frames(function() - if starterMode then + if spawnStarterDecks then spawnStarters(groupName) else spawnInvestigators(groupName) @@ -420,7 +420,7 @@ function spawnInvestigatorGroup(groupName) end, 2) end --- Spawn cards for all investigators in the given group. This creates piles for all defined +-- Spawn cards for all investigators in the given group. This creates piles for all defined -- investigator cards and minicards as well as the signature cards. ---@param groupName string Name of the group to spawn, matching a key in InvestigatorPanelData function spawnInvestigators(groupName) @@ -451,14 +451,14 @@ end function getInvestigatorRowStartPos(investigatorCount, row) local rowStart = Vector(startPositions.investigator) rowStart:add(Vector( - investigatorPositionShiftRow.x * (row - 1), - investigatorPositionShiftRow.y * (row - 1), - investigatorPositionShiftRow.z * (row - 1))) + investigatorPositionShiftRow.x * (row - 1), + investigatorPositionShiftRow.y * (row - 1), + investigatorPositionShiftRow.z * (row - 1))) local investigatorsInRow = math.min(investigatorCount - INVESTIGATOR_MAX_COLS * (row - 1), INVESTIGATOR_MAX_COLS) rowStart:add(Vector( - investigatorPositionShiftCol.x * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, - investigatorPositionShiftCol.y * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, - investigatorPositionShiftCol.z * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2)) + investigatorPositionShiftCol.x * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, + investigatorPositionShiftCol.y * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2, + investigatorPositionShiftCol.z * (INVESTIGATOR_MAX_COLS - investigatorsInRow) / 2)) return rowStart end @@ -470,23 +470,23 @@ function buildInvestigatorSpawnSpec(investigatorName, investigatorData, position local sigPos = Vector(position):add(investigatorSignatureOffset) local spawns = buildCommonSpawnSpec(investigatorName, investigatorData, position) table.insert(spawns, { - name = investigatorName .. "signatures", - cards = investigatorData.signatures, - globalPos = self.positionToWorld(sigPos), - rotation = FACE_UP_ROTATION - }) + name = investigatorName .. "signatures", + cards = investigatorData.signatures, + globalPos = self.positionToWorld(sigPos), + rotation = FACE_UP_ROTATION + }) return spawns end --- Builds the spawn specs for minicards and investigator cards. These are common enough to be +-- Builds the spawn specs for minicards and investigator cards. These are common enough to be -- shared, and will only differ in whether they spawn the full stack of possible investigator and -- minicards, or only the first of each. ---@param investigatorName string Name of the investigator, matching a key in InvestigatorPanelData ---@param investigatorData table Spawn definition for the investigator, retrieved from INVESTIGATORS ---@param position tts__Vector Where to spawn the minicard; investigagor cards will be placed below ---@param oneCardOnly? boolean If true, will spawn only the first card in the investigator card ---- and minicard lists. Otherwise, spawn them all in a deck +--- and minicard lists. Otherwise, spawn them all in a deck function buildCommonSpawnSpec(investigatorName, investigatorData, position, oneCardOnly) local cardPos = Vector(position):add(investigatorCardOffset) return { @@ -533,23 +533,24 @@ function spawnStarterDeck(investigatorName, investigatorData, position) end local deckPos = Vector(position):add(investigatorSignatureOffset) arkhamDb.getDecklist("None", investigatorData.starterDeck, true, false, false, function(slots) - local cardIdList = { } + local cardIdList = {} for id, count in pairs(slots) do for i = 1, count do table.insert(cardIdList, id) end end spawnBag.spawn({ - name = investigatorName.."starter", + name = investigatorName .. "starter", cards = cardIdList, globalPos = self.positionToWorld(deckPos), rotation = FACE_DOWN_ROTATION }) end) end + -- Clears the currently placed cards, then places cards for the given class and level spread ---@param cardClass string Class to place ("Guardian", "Seeker", etc) ----@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. +---@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. function spawnClassCards(cardClass, isUpgraded) prepareToPlaceCards() Wait.frames(function() placeClassCards(cardClass, isUpgraded) end, 2) @@ -557,18 +558,15 @@ end -- Spawn the class cards. ---@param cardClass string Class to place ("Guardian", "Seeker", etc) ----@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. +---@param isUpgraded boolean If true, spawn the Level 1-5 cards. Otherwise, Level 0. function placeClassCards(cardClass, isUpgraded) - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end + if not allCardsBagApi.isIndexReady() then return end + local cardIdList = allCardsBagApi.getCardsByClassAndLevel(cardClass, isUpgraded) - local skillList = { } - local eventList = { } - local assetList = { } + local skillList = {} + local eventList = {} + local assetList = {} for _, cardId in ipairs(cardIdList) do local cardMetadata = allCardsBagApi.getCardById(cardId).metadata if (cardMetadata.type == "Skill") then @@ -614,24 +612,22 @@ function placeClassCards(cardClass, isUpgraded) end end +-- called by the XML UI to spawn cards from fan-made camnpaigns +function spawnOtherCards() + spawnCycle("Other") +end + -- Spawns the investigator sets and all cards for the given cycle ---@param cycle string Name of a cycle, should match the standard used in card metadata function spawnCycle(cycle) + if not allCardsBagApi.isIndexReady() then return end + prepareToPlaceCards() spawnInvestigators(cycle) - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end - local cycleCardList = allCardsBagApi.getCardsByCycle(cycle) - local copiedList = { } - for i, id in ipairs(cycleCardList) do - copiedList[i] = id - end + spawnBag.spawn({ - name = "cycle"..cycle, - cards = copiedList, + name = "cycle" .. cycle, + cards = allCardsBagApi.getCardsByCycle(cycle), globalPos = self.positionToWorld(startPositions.cycle), rotation = FACE_UP_ROTATION, spread = true, @@ -671,16 +667,13 @@ end -- Clears the current cards, and places all basic weaknesses on the table. function spawnWeaknesses() + if not allCardsBagApi.isIndexReady() then return end + prepareToPlaceCards() - local indexReady = allCardsBagApi.isIndexReady() - if (not indexReady) then - broadcastToAll("Still loading player cards, please try again in a few seconds", {0.9, 0.2, 0.2}) - return - end - local weaknessIdList = allCardsBagApi.getUniqueWeaknesses() - local basicWeaknessList = { } - local otherWeaknessList = { } - for i, id in ipairs(weaknessIdList) do + + local basicWeaknessList = {} + local otherWeaknessList = {} + for _, id in ipairs(allCardsBagApi.getUniqueWeaknesses()) do local cardMetadata = allCardsBagApi.getCardById(id).metadata if cardMetadata.basicWeaknessCount ~= nil and cardMetadata.basicWeaknessCount > 0 then table.insert(basicWeaknessList, id) @@ -721,7 +714,7 @@ function spawnRandomWeakness() prepareToPlaceCards() local weaknessId = allCardsBagApi.getRandomWeaknessId() if (weaknessId == nil) then - broadcastToAll("All basic weaknesses are in play!", {0.9, 0.2, 0.2}) + broadcastToAll("All basic weaknesses are in play!", { 0.9, 0.2, 0.2 }) return end spawnBag.spawn({ diff --git a/src/playercards/SpawnBag.ttslua b/src/playercards/SpawnBag.ttslua index 3bdcb80e..982d489c 100644 --- a/src/playercards/SpawnBag.ttslua +++ b/src/playercards/SpawnBag.ttslua @@ -1,32 +1,32 @@ require("playercards/PlayerCardSpawner") -- Allows spawning of defined lists of cards which will be created from the template in the All --- Player Cards bag. SpawnBag.spawn will create objects based on a table definition, while --- SpawnBag.recall will clean them all up. Recall will be limited to a small area around the --- spawned objects. Objects moved out of this area will not be cleaned up. +-- Player Cards bag. SpawnBag.spawn will create objects based on a table definition, while +-- SpawnBag.recall will clean them all up. Recall will be limited to a small area around the +-- spawned objects. Objects moved out of this area will not be cleaned up. -- -- SpawnSpec: Spawning requires a spawn specification with the following structure: -- { --- name: Name of this spawn content, used for internal tracking. Multiple specs can be spawned, +-- name: Name of this spawn content, used for internal tracking. Multiple specs can be spawned, -- but each requires a separate name -- cards: A list of card IDs to be spawned --- globalPos: Where the spawned objects should be placed, in global coordinates. This should be +-- globalPos: Where the spawned objects should be placed, in global coordinates. This should be -- a valid Vector with x, y, and z defined, e.g. { x = 5, y = 1, z = 15 } --- rotation: Rotation for the spawned objects. X=180 should be used for face down items. As with +-- rotation: Rotation for the spawned objects. X=180 should be used for face down items. As with -- globalPos, this should be a valid Vector with x, y, and z defined --- spread: Optional Boolean. If present and true, cards will be spawned next to each other in a --- spread moving to the right. globalPos will define the location of the first card, each +-- spread: Optional Boolean. If present and true, cards will be spawned next to each other in a +-- spread moving to the right. globalPos will define the location of the first card, each -- after that will be moved a predefined distance --- spreadCols: Optional integer. If spread is true, specifies the maximum columns cards will be --- laid out in before starting a new row. If spread is true but spreadCols is not set, all +-- spreadCols: Optional integer. If spread is true, specifies the maximum columns cards will be +-- laid out in before starting a new row. If spread is true but spreadCols is not set, all -- cards will be in a single row (however long that may be) -- } -- See BondedBag.ttslua for an example do local allCardsBagApi = require("playercards/AllCardsBagApi") - local SpawnBag = { } - local internal = { } + local SpawnBag = {} + local internal = {} -- To assist debugging, will draw a box around the recall zone when it's set up local SHOW_RECALL_ZONE = false @@ -36,8 +36,8 @@ do local RECALL_BUFFER_Z = 0.5 -- In order to mimic the behavior of the previous memory buttons we use a temporary bag when - -- recalling objects. This bag is tiny and transparent, and will be placed at the same location as - -- this object. Once all placed cards are recalled bag to this bag, it will be destroyed + -- recalling objects. This bag is tiny and transparent, and will be placed at the same location as + -- this object. Once all placed cards are recalled bag to this bag, it will be destroyed local RECALL_BAG = { Name = "Bag", Transform = { @@ -58,8 +58,8 @@ do } -- Tracks what has been placed by this "bag" so they can be recalled - local placedSpecs = { } - local placedObjectGuids = { } + local placedSpecs = {} + local placedObjectGuids = {} local recallZone = nil -- Loads a table of saved state, extracted during the parent object's onLoad @@ -81,21 +81,13 @@ do -- Places the given spawnSpec on the table. See comment at the start of the file for spawnSpec table data and examples SpawnBag.spawn = function(spawnSpec) -- Limit to one placement at a time - if (placedSpecs[spawnSpec.name]) then - return - end - if (spawnSpec == nil) then - -- TODO: error here - return - end - local cardsToSpawn = { } - local cardList = spawnSpec.cards - for _, cardId in ipairs(cardList) do + if placedSpecs[spawnSpec.name] or spawnSpec == nil then return end + + local cardsToSpawn = {} + for _, cardId in ipairs(spawnSpec.cards) do local cardData = allCardsBagApi.getCardById(cardId) - if (cardData ~= nil) then + if cardData ~= nil then table.insert(cardsToSpawn, cardData) - else - -- TODO: error here end end if (spawnSpec.spread) then @@ -120,14 +112,13 @@ do internal.recallSpawned() end - -- We've recalled everything we can, some cards may have been moved out of the - -- card area. Just reset at this point. - placedSpecs = { } - placedObjectGuids = { } + -- We've recalled everything we can, some cards may have been moved out of the card area. Just reset at this point. + placedSpecs = {} + placedObjectGuids = {} recallZone = nil end - -- Deleted all spawned cards. + -- Delete all spawned cards internal.deleteSpawned = function() for guid, _ in pairs(placedObjectGuids) do local obj = getObjectFromGUID(guid) @@ -140,9 +131,9 @@ do end end - -- Recalls spawned cards with a fake bag that replicates the memory bag recall style. + -- Recalls spawned cards with a fake bag that replicates the memory bag recall style internal.recallSpawned = function() - local trash = spawnObjectData({data = RECALL_BAG, position = self.getPosition()}) + local trash = spawnObjectData({ data = RECALL_BAG, position = self.getPosition() }) for guid, _ in pairs(placedObjectGuids) do local obj = getObjectFromGUID(guid) if (obj ~= nil) then @@ -156,71 +147,70 @@ do trash.destruct() end - - -- Callback for when an object has been spawned. Tracks the object for later recall and updates the - -- recall zone. + -- Callback for when an object has been spawned. Tracks the object for later recall and updates the recall zone. internal.recordPlacedObject = function(spawned) placedObjectGuids[spawned.getGUID()] = true internal.expandRecallZone(spawned) end - -- Expands the current recall zone based on the position of the given object. The recall zone will + -- Expands the current recall zone based on the position of the given object. The recall zone will -- be maintained as the bounding box of the extreme object positions, plus a small amount of buffer internal.expandRecallZone = function(spawnedCard) local pos = spawnedCard.getPosition() if (recallZone == nil) then -- First card out of the bag, initialize surrounding that - recallZone = { } + recallZone = {} recallZone.upperLeft = { x = pos.x + RECALL_BUFFER_X, z = pos.z + RECALL_BUFFER_Z } recallZone.lowerRight = { x = pos.x - RECALL_BUFFER_X, z = pos.z - RECALL_BUFFER_Z } return - else - if (pos.x > recallZone.upperLeft.x) then - recallZone.upperLeft.x = pos.x + RECALL_BUFFER_X - end - if (pos.x < recallZone.lowerRight.x) then - recallZone.lowerRight.x = pos.x - RECALL_BUFFER_X - end - if (pos.z > recallZone.upperLeft.z) then - recallZone.upperLeft.z = pos.z + RECALL_BUFFER_Z - end - if (pos.z < recallZone.lowerRight.z) then - recallZone.lowerRight.z = pos.z - RECALL_BUFFER_Z - end end - if (SHOW_RECALL_ZONE) then + + if pos.x > recallZone.upperLeft.x then + recallZone.upperLeft.x = pos.x + RECALL_BUFFER_X + end + if pos.x < recallZone.lowerRight.x then + recallZone.lowerRight.x = pos.x - RECALL_BUFFER_X + end + if pos.z > recallZone.upperLeft.z then + recallZone.upperLeft.z = pos.z + RECALL_BUFFER_Z + end + if pos.z < recallZone.lowerRight.z then + recallZone.lowerRight.z = pos.z - RECALL_BUFFER_Z + end + + if SHOW_RECALL_ZONE then local y = 1.5 local thick = 0.05 Global.setVectorLines({ { - points = { {recallZone.upperLeft.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.lowerRight.z} }, - color = {1,0,0}, + points = { { recallZone.upperLeft.x, y, recallZone.upperLeft.z }, { recallZone.upperLeft.x, y, recallZone.lowerRight.z } }, + color = { 1, 0, 0 }, thickness = thick, - rotation = {0,0,0} + rotation = { 0, 0, 0 } }, { - points = { {recallZone.upperLeft.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.lowerRight.z} }, - color = {1,0,0}, + points = { { recallZone.upperLeft.x, y, recallZone.lowerRight.z }, { recallZone.lowerRight.x, y, recallZone.lowerRight.z } }, + color = { 1, 0, 0 }, thickness = thick, - rotation = {0,0,0} + rotation = { 0, 0, 0 } }, { - points = { {recallZone.lowerRight.x,y,recallZone.lowerRight.z}, {recallZone.lowerRight.x,y,recallZone.upperLeft.z} }, - color = {1,0,0}, + points = { { recallZone.lowerRight.x, y, recallZone.lowerRight.z }, { recallZone.lowerRight.x, y, recallZone.upperLeft.z } }, + color = { 1, 0, 0 }, thickness = thick, - rotation = {0,0,0} + rotation = { 0, 0, 0 } }, { - points = { {recallZone.lowerRight.x,y,recallZone.upperLeft.z}, {recallZone.upperLeft.x,y,recallZone.upperLeft.z} }, - color = {1,0,0}, + points = { { recallZone.lowerRight.x, y, recallZone.upperLeft.z }, { recallZone.upperLeft.x, y, recallZone.upperLeft.z } }, + color = { 1, 0, 0 }, thickness = thick, - rotation = {0,0,0} + rotation = { 0, 0, 0 } } }) end end - -- Checks to see if the given object is in the current recall zone. If there isn't a recall zone, + -- Checks to see if the given object is in the current recall zone. If there isn't a recall zone, -- will return true so that everything can be easily cleaned up. internal.isInRecallZone = function(obj) if (recallZone == nil) then @@ -228,11 +218,11 @@ do end local pos = obj.getPosition() return (pos.x < recallZone.upperLeft.x and pos.x > recallZone.lowerRight.x - and pos.z < recallZone.upperLeft.z and pos.z > recallZone.lowerRight.z) + and pos.z < recallZone.upperLeft.z and pos.z > recallZone.lowerRight.z) end internal.reverseList = function(list) - local reversed = { } + local reversed = {} for i = 1, #list do reversed[i] = list[#list - i + 1] end diff --git a/xml/playercards/PlayerCardPanel.xml b/xml/playercards/PlayerCardPanel.xml index 17ecfb2c..d193129f 100644 --- a/xml/playercards/PlayerCardPanel.xml +++ b/xml/playercards/PlayerCardPanel.xml @@ -1,24 +1,31 @@ - - • Select a group to place cards • Copy the cards you want for your deck • Select a new group to clear the placed cards and see new ones • Clear to remove all cards + + + \ No newline at end of file