diff --git a/objects/Fan-MadeAccessories.aa8b38.json b/objects/Fan-MadeAccessories.aa8b38.json index be4f769a..56d31505 100644 --- a/objects/Fan-MadeAccessories.aa8b38.json +++ b/objects/Fan-MadeAccessories.aa8b38.json @@ -17,7 +17,7 @@ "ChaosBagManager.023240", "TokenArranger.022907", "CYOACampaignGuides.e87ea2", - "AttachmentHelper.d45664", + "AttachmentHelper.7f4976", "ArkhamFantasy-PixelArtMini-Cards.e17c9e", "jaqenZannsNavigationOverlay.a8affa", "DrawTokenButtonTooltipRenamer.cc77a8", diff --git a/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976.json b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976.json new file mode 100644 index 00000000..fd21c75a --- /dev/null +++ b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976.json @@ -0,0 +1,51 @@ +{ + "AltLookAngle": { + "x": 0, + "y": 0, + "z": 0 + }, + "Autoraise": true, + "ColorDiffuse": { + "b": 1, + "g": 0.37256, + "r": 0.30589 + }, + "ContainedObjects_order": [ + "AttachmentHelper.d45664" + ], + "ContainedObjects_path": "AttachmentHelper.7f4976", + "Description": "Provides card-sized bags that are useful for cards that are attached facedown (e.g. Backpack).", + "DragSelectable": true, + "GMNotes": "", + "GUID": "7f4976", + "Grid": true, + "GridProjection": false, + "Hands": false, + "HideWhenFaceDown": false, + "IgnoreFoW": false, + "LayoutGroupSortIndex": 0, + "Locked": false, + "LuaScript": "", + "LuaScriptState": "", + "MaterialIndex": -1, + "MeasureMovement": false, + "MeshIndex": -1, + "Name": "Infinite_Bag", + "Nickname": "Attachment Helper", + "Snap": true, + "Sticky": true, + "Tooltip": true, + "Transform": { + "posX": 27.677, + "posY": 4.472, + "posZ": -31.034, + "rotX": 0, + "rotY": 0, + "rotZ": 0, + "scaleX": 1, + "scaleY": 1, + "scaleZ": 1 + }, + "Value": 0, + "XmlUI": "" +} diff --git a/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.json b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.json new file mode 100644 index 00000000..629ef166 --- /dev/null +++ b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.json @@ -0,0 +1,65 @@ +{ + "AltLookAngle": { + "x": 0, + "y": 0, + "z": 0 + }, + "Autoraise": true, + "Bag": { + "Order": 0 + }, + "ColorDiffuse": { + "b": 1, + "g": 1, + "r": 1 + }, + "CustomMesh": { + "CastShadows": true, + "ColliderURL": "http://cloud-3.steamusercontent.com/ugc/1754695414379239413/0B8E68F3B7311DCF2138FB701F78D1D93FBA4CAB/", + "Convex": true, + "DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/1750192233783143973/D526236AAE16BDBB98D3F30E27BAFC1D3E21F4AC/", + "MaterialIndex": 1, + "MeshURL": "http://cloud-3.steamusercontent.com/ugc/1754695414379239413/0B8E68F3B7311DCF2138FB701F78D1D93FBA4CAB/", + "NormalURL": "", + "TypeIndex": 6 + }, + "Description": "Drop cards here to display name, cost and skill icons.\n\nSee context menu for options.", + "DragSelectable": true, + "GMNotes": "", + "GUID": "d45664", + "Grid": true, + "GridProjection": false, + "Hands": false, + "HideWhenFaceDown": false, + "IgnoreFoW": false, + "LayoutGroupSortIndex": 0, + "Locked": false, + "LuaScriptState": "[[],true,true]", + "LuaScript_path": "Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.ttslua", + "MaterialIndex": -1, + "MeasureMovement": false, + "MeshIndex": -1, + "Name": "Custom_Model_Bag", + "Nickname": "Attachment Helper", + "Number": 0, + "Snap": true, + "Sticky": true, + "Tags": [ + "Asset", + "scesetup_memory_object" + ], + "Tooltip": true, + "Transform": { + "posX": 19.228, + "posY": 3.822, + "posZ": -19.636, + "rotX": 0, + "rotY": 270, + "rotZ": 359, + "scaleX": 0.8, + "scaleY": 1, + "scaleZ": 0.8 + }, + "Value": 0, + "XmlUI": "" +} diff --git a/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.ttslua b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.ttslua new file mode 100644 index 00000000..de2c31a1 --- /dev/null +++ b/objects/Fan-MadeAccessories.aa8b38/AttachmentHelper.7f4976/AttachmentHelper.d45664.ttslua @@ -0,0 +1,202 @@ +local OPTION_TEXT = { + "Ancestral Knowledge", + "Astronomical Atlas", + "Crystallizer of Dreams", + "Diana Stanley", + "Gloria Goldberg", + "Sefina Rousseau", + "Wooden Sledge" +} + +local IMAGE_LIST = { + -- Ancestral Knowledge + "http://cloud-3.steamusercontent.com/ugc/1915746489207287888/2F9F6F211ED0F98E66C9D35D93221E4C7FB6DD3C/", + -- Astronomical Atlas + "http://cloud-3.steamusercontent.com/ugc/1754695853007989004/9153BC204FC707AE564ECFAC063A11CB8C2B5D1E/", + -- Crystallizer of Dreams + "http://cloud-3.steamusercontent.com/ugc/1915746489207280958/100F16441939E5E23818651D1EB5C209BF3125B9/", + -- Diana Stanley + "http://cloud-3.steamusercontent.com/ugc/1754695635919071208/1AB7222850201630826BFFBA8F2BD0065E2D572F/", + -- Gloria Goldberg + "http://cloud-3.steamusercontent.com/ugc/1754695635919102502/453D4426118C8A6DE2EA281184716E26CA924C84/", + -- Sefina Rousseau + "http://cloud-3.steamusercontent.com/ugc/1754695635919099826/3C3CBFFAADB2ACA9957C736491F470AE906CC953/", + -- Wooden Sledge + "http://cloud-3.steamusercontent.com/ugc/1750192233783143973/D526236AAE16BDBB98D3F30E27BAFC1D3E21F4AC/" +} + +-- save state and options to restore onLoad +function onSave() return JSON.encode({ cardsInBag, showCost, showIcons }) end + +-- load variables and create context menu +function onLoad(savedData) + local loadedData = JSON.decode(savedData) + cardsInBag = loadedData[1] or {} + showCost = loadedData[2] or true + showIcons = loadedData[3] or true + + recreateButtons() + + self.addContextMenuItem("Select image", selectImage) + self.addContextMenuItem("Toggle cost", function(color) + showCost = not showCost + printToColor("Show cost of cards: " .. tostring(showCost), color, "White") + refresh() + end) + + self.addContextMenuItem("Toggle skill icons", function(color) + showIcons = not showIcons + printToColor("Show skill icons of cards: " .. tostring(showIcons), color, "White") + refresh() + end) + + self.addContextMenuItem("More Information", function() + printToAll("------------------------------", "White") + printToAll("Attachment Helper by Chr1Z", "Orange") + printToAll("original by bankey", "White") + end) +end + +function selectImage(color) + Player[color].showOptionsDialog("Select image:", OPTION_TEXT, 1, function(_, option_index) + local customInfo = self.getCustomObject() + customInfo.diffuse = IMAGE_LIST[option_index] + self.setCustomObject(customInfo) + self.reload() + end) +end + +-- called for every card that enters +function onObjectEnterContainer(container, object) + if container == self then + if object.tag ~= "Card" then + broadcastToAll("The 'Attachment Helper' is meant to be used for single cards.", "White") + else + findCard(object.getGUID(), object.getName(), object.getGMNotes()) + end + -- TODO: implement splitting of decks that get thrown in here + recreateButtons() + end +end + +-- removes leaving cards from the "cardInBag" table +function onObjectLeaveContainer(container, object) + if container == self then + local guid = object.getGUID() + local found = false + for i, card in ipairs(cardsInBag) do + if card.id == guid then + table.remove(cardsInBag, i) + found = true + break + end + end + + if found ~= true then + local name = object.getName() + for i, card in ipairs(cardsInBag) do + if card.name == name then + table.remove(cardsInBag, i) + break + end + end + end + recreateButtons() + end +end + +-- refreshes displayed buttons based on contained cards +function refresh() + cardsInBag = {} + for _, object in ipairs(self.getObjects()) do + findCard(object.guid, object.name, object.gm_notes) + end + recreateButtons() +end + +-- gets cost and icons for a card +function findCard(guid, name, GMNotes) + local cost = "" + local icons = {} + local metadata = {} + local displayName = name + + if displayName == nil or displayName == "" then displayName = "unnamed" end + if showCost or showIcons then metadata = JSON.decode(GMNotes) end + + if showCost then + if GMNotes ~= "" then cost = metadata.cost end + if cost == nil or cost == "" then cost = "–" end + displayName = "[" .. cost .. "] " .. displayName + end + + if showIcons then + if GMNotes ~= "" 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 + displayName = displayName .. "\n" .. IconTypes[i] .. ": " .. icons[i] + found = true + else + displayName = displayName .. " " .. IconTypes[i] .. ": " .. icons[i] + end + end + end + end + table.insert(cardsInBag, { name = name, displayName = displayName, id = guid }) +end + +-- recreates buttons with up-to-date labels +function recreateButtons() + self.clearButtons() + local verticalPosition = 1.65 + + for _, card in ipairs(cardsInBag) do + local id = card.id + local funcName = "removeCard" .. id + self.setVar(funcName, function() removeCard(id) end) + self.createButton({ + label = card.displayName, + click_function = funcName, + function_owner = self, + position = { 0, 0, verticalPosition }, + height = 200, + width = 1200, + font_size = string.len(card.displayName) > 20 and 75 or 100 + }) + verticalPosition = verticalPosition - 0.5 + end + + local countLabel = "Attachment\nHelper" + if #cardsInBag ~= 0 then countLabel = #cardsInBag end + + self.createButton({ + label = countLabel, + click_function = "none", + function_owner = self, + position = { 0, 0, -1.35 }, + height = 0, + width = 0, + font_size = 225, + font_color = { 1, 1, 1 } + }) +end + +-- click-function for buttons to take a card out of the bag +function removeCard(cardGUID) + self.takeObject({ + guid = cardGUID, + rotation = self.getRotation(), + position = self.getPosition() + Vector(0, 0.25, 0), + callback_function = function(obj) obj.resting = true end + }) +end