From 492882205180497b849198cb752b04673a2e4e3d Mon Sep 17 00:00:00 2001 From: Chr1Z93 Date: Thu, 13 Jun 2024 13:56:46 +0200 Subject: [PATCH 1/3] updated investigator scaling --- src/playercards/PlayerCardSpawner.ttslua | 49 +++++++++++------------- src/playermat/Playmat.ttslua | 11 +++++- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/playercards/PlayerCardSpawner.ttslua b/src/playercards/PlayerCardSpawner.ttslua index e0501619..72c742b7 100644 --- a/src/playercards/PlayerCardSpawner.ttslua +++ b/src/playercards/PlayerCardSpawner.ttslua @@ -6,8 +6,8 @@ local SPREAD_X_SHIFT = -3.66 Spawner = { } --- Spawns a list of cards at the given position/rotation. This will separate cards by size - --- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If +-- Spawns a list of cards at the given position/rotation. This will separate cards by size - +-- investigator, standard, and mini, spawning them in that order with larger cards on bottom. If -- there are different types, the provided callback will be called once for each type as it spawns -- either a card or deck. ---@param cardList table A list of Player Card data structures (data/metadata) @@ -33,8 +33,8 @@ Spawner.spawnCards = function(cardList, pos, rot, sort, callback) table.insert(standardCards, card) end end - -- Spawn each of the three types individually. Each Y position shift accounts for the thickness - -- of the spawned deck + + -- Spawn each of the three types individually. Y position accounts for the thickness of the spawned deck local position = { x = pos.x, y = pos.y, z = pos.z } Spawner.spawn(investigatorCards, position, rot, callback) @@ -52,7 +52,7 @@ Spawner.spawnCardSpread = function(cardList, startPos, maxCols, rot, sort, callb local position = { x = startPos.x, y = startPos.y, z = startPos.z } -- Special handle the first row if we have less than a full single row, but only if there's a - -- reasonable max column count. Single-row spreads will send a large value for maxCols + -- reasonable max column count. Single-row spreads will send a large value for maxCols if maxCols < 100 and #cardList < maxCols then position.z = startPos.z + ((maxCols - #cardList) / 2 * SPREAD_Z_SHIFT) end @@ -75,7 +75,7 @@ Spawner.spawnCardSpread = function(cardList, startPos, maxCols, rot, sort, callb end end --- Spawn a specific list of cards. This method is for internal use and should not be called +-- Spawn a specific list of cards. This method is for internal use and should not be called -- directly, use spawnCards instead. ---@param cardList table A list of Player Card data structures (data/metadata) ---@param pos table Position where the cards should be spawned (global) @@ -90,25 +90,18 @@ Spawner.spawn = function(cardList, pos, rot, callback) if cardList[1].data.SidewaysCard then rot = { rot.x, rot.y - 90, rot.z } end - spawnObjectData({ + return spawnObjectData({ data = cardList[1].data, position = pos, rotation = rot, callback_function = callback }) - return end -- For multiple cards, construct a deck and spawn that - local deck = Spawner.buildDeckDataTemplate() - - -- Decks won't inherently scale to the cards in them. The card list being spawned should be all - -- the same type/size by this point, so use the first card to set the size - deck.Transform = { - scaleX = cardList[1].data.Transform.scaleX, - scaleY = 1, - scaleZ = cardList[1].data.Transform.scaleZ - } + local deckScaleX = cardList[1].data.Transform.scaleX + local deckScaleZ = cardList[1].data.Transform.scaleZ + local deck = Spawner.buildDeckDataTemplate(deckScaleX, deckScaleZ) local sidewaysDeck = true for _, spawnCard in ipairs(cardList) do @@ -123,7 +116,7 @@ Spawner.spawn = function(cardList, pos, rot, callback) rot = { rot.x, rot.y - 90, rot.z } end - spawnObjectData({ + return spawnObjectData({ data = deck, position = pos, rotation = rot, @@ -131,12 +124,12 @@ Spawner.spawn = function(cardList, pos, rot, callback) }) end --- Inserts a card into the given deck. This does three things: +-- Inserts a card into the given deck. This does three things: -- 1. Add the card's data to ContainedObjects -- 2. Add the card's ID (the TTS CardID, not the Arkham ID) to the deck's --- ID list. Note that the deck's ID list is "DeckIDs" even though it +-- ID list. Note that the deck's ID list is "DeckIDs" even though it -- contains a list of card Ids --- 3. Extract the card's CustomDeck table and add it to the deck. The deck's +-- 3. Extract the card's CustomDeck table and add it to the deck. The deck's -- "CustomDeck" field is a list of all CustomDecks used by cards within the -- deck, keyed by the DeckID and referencing the custom deck table ---@param deck table TTS deck data structure to add to @@ -176,20 +169,22 @@ end -- creates a new table on each call without using metatables or previous -- definitions because we can't be sure that TTS doesn't modify the structure ---@return table deck Table containing the minimal TTS deck data structure -Spawner.buildDeckDataTemplate = function() +Spawner.buildDeckDataTemplate = function(deckScaleX, deckScaleZ) local deck = {} deck.Name = "Deck" - -- Card data. DeckIDs and CustomDeck entries will be built from the cards + -- Card data. DeckIDs and CustomDeck entries will be built from the cards deck.ContainedObjects = {} deck.DeckIDs = {} deck.CustomDeck = {} -- Transform is required, Position and Rotation will be overridden by the spawn call so can be omitted here + -- Decks won't inherently scale to the cards in them. The card list being spawned should be all + -- the same type/size by this point, so use the first card to set the size deck.Transform = { - scaleX = 1, + scaleX = deckScaleX or 1, scaleY = 1, - scaleZ = 1, + scaleZ = deckScaleZ or 1, } return deck @@ -220,14 +215,14 @@ Spawner.getpbcn = function(metadata) end end --- Comparison function used to sort the cards in a deck. Groups bonded or +-- Comparison function used to sort the cards in a deck. Groups bonded or -- permanent cards first, then sorts within theose types by name/subname. -- Normal cards will sort in standard alphabetical order, while -- permanent/bonded/customizable will be in reverse alphabetical order. -- -- Since cards spawn in the order provided by this comparator, with the first -- cards ending up at the bottom of a pile, this ordering will spawn in reverse --- alphabetical order. This presents the cards in order for non-face-down +-- alphabetical order. This presents the cards in order for non-face-down -- areas, and presents them in order when Searching the face-down deck. Spawner.cardComparator = function(card1, card2) local pbcn1 = Spawner.getpbcn(card1.metadata) diff --git a/src/playermat/Playmat.ttslua b/src/playermat/Playmat.ttslua index 61c6712a..2b3d1187 100644 --- a/src/playermat/Playmat.ttslua +++ b/src/playermat/Playmat.ttslua @@ -887,8 +887,15 @@ function maybeUpdateActiveInvestigator(card) return end - -- set proper scale for the card - card.setScale({1.15, 1, 1.15}) + -- set proper scale for investigators + local cardData = card.getData() + if cardData["SidewaysCard"] == true then + -- 115% for easier readability + card.setScale({ 1.15, 1, 1.15 }) + else + -- Zoop-exported investigators are horizontal cards and TTS scales them differently + card.setScale({ 0.825, 1, 0.825 }) + end -- remove old action tokens for _, obj in ipairs(searchAroundSelf("isUniversalToken")) do From 804040a20a8fdb8bb7ae1aa1b441889995e38c27 Mon Sep 17 00:00:00 2001 From: Chr1Z93 Date: Thu, 13 Jun 2024 14:55:22 +0200 Subject: [PATCH 2/3] updated scale --- src/playermat/Playmat.ttslua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playermat/Playmat.ttslua b/src/playermat/Playmat.ttslua index 2b3d1187..fff4063e 100644 --- a/src/playermat/Playmat.ttslua +++ b/src/playermat/Playmat.ttslua @@ -894,7 +894,7 @@ function maybeUpdateActiveInvestigator(card) card.setScale({ 1.15, 1, 1.15 }) else -- Zoop-exported investigators are horizontal cards and TTS scales them differently - card.setScale({ 0.825, 1, 0.825 }) + card.setScale({ 0.8214, 1, 0.8214 }) end -- remove old action tokens From 3c631c1718319de4561dd13b3e9406b9d1d17165 Mon Sep 17 00:00:00 2001 From: Chr1Z93 Date: Fri, 14 Jun 2024 01:07:41 +0200 Subject: [PATCH 3/3] updated attachment helper --- src/accessories/AttachmentHelper.ttslua | 33 ++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/accessories/AttachmentHelper.ttslua b/src/accessories/AttachmentHelper.ttslua index 7c5dfda9..c070f798 100644 --- a/src/accessories/AttachmentHelper.ttslua +++ b/src/accessories/AttachmentHelper.ttslua @@ -49,6 +49,12 @@ local BACKGROUNDS = { fontcolor = { 1, 1, 1 }, icons = false }, + { + title = "Hunting Jacket", + url = "http://cloud-3.steamusercontent.com/ugc/2450601762292308846/0E171E3F3F0D016EEC574F3CA25738A46D95595C/", + fontcolor = { 1, 1, 1 }, + icons = false + }, { title = "Ikiaq", url = "http://cloud-3.steamusercontent.com/ugc/2021606446228198966/5A408D8D760221DEA164E986B9BE1F79C4803071/", @@ -110,6 +116,7 @@ function onLoad(savedData) printToColor("Show skill icons of cards: " .. tostring(showIcons), color, "White") refresh() end) + self.addContextMenuItem("Draw all cards", function(color) self.deal(self.getQuantity(), color) end) end -- gets the font color based on background url @@ -232,38 +239,30 @@ end -- gets cost and icons for a card function findCard(guid, name, GMNotes) - local icons = {} local metadata = JSON.decode(GMNotes) or {} local buttonLabel = name or "unnamed" + local hasIcons = false if metadata.cost then buttonLabel = "[" .. metadata.cost .. "] " .. buttonLabel end if showIcons then - if metadata ~= {} then - icons[1] = metadata.wildIcons - icons[2] = metadata.willpowerIcons - icons[3] = metadata.intellectIcons - icons[4] = metadata.combatIcons - icons[5] = metadata.agilityIcons - end - - local IconTypes = { "Wild", "Willpower", "Intellect", "Combat", "Agility" } - local found = false - for i = 1, 5 do - if icons[i] ~= nil and icons[i] ~= "" then - if found == false then + local iconTypes = { "Wild", "Willpower", "Intellect", "Combat", "Agility" } + for _, iconName in ipairs(iconTypes) do + local mdName = string.lower(iconName) .. "Icons" + if metadata[mdName] ~= nil then + if hasIcons == false then buttonLabel = buttonLabel .. "\n" - found = true + hasIcons = true else buttonLabel = buttonLabel .. " " end - buttonLabel = buttonLabel .. IconTypes[i] .. ": " .. icons[i] + buttonLabel = buttonLabel .. iconName .. ": " .. metadata[mdName] end end end - table.insert(cardsInBag, { buttonLabel = buttonLabel, hasIcons = (#icons > 0), name = name, guid = guid }) + table.insert(cardsInBag, { buttonLabel = buttonLabel, hasIcons = hasIcons, name = name, guid = guid }) end -- recreates buttons with up-to-date labels