diff --git a/objects/Fan-MadeAccessories.aa8b38.json b/objects/Fan-MadeAccessories.aa8b38.json index b6c3001c..ac003e23 100644 --- a/objects/Fan-MadeAccessories.aa8b38.json +++ b/objects/Fan-MadeAccessories.aa8b38.json @@ -21,6 +21,7 @@ "DescriptivePhaseTracker.b171c8", "CustomDataHelper.2547b3", "UnderworldMarketHelper.3650ea", + "Subject5U-21Helper.1335e8", "Auto-failCounter.a9a321", "ElderSignCounter.e62cb5" ], diff --git a/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.json b/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.json new file mode 100644 index 00000000..f61e0e0d --- /dev/null +++ b/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.json @@ -0,0 +1,76 @@ +{ + "AltLookAngle": { + "x": 0, + "y": 0, + "z": 0 + }, + "AttachedSnapPoints": [ + { + "Position": { + "x": -0.5, + "y": 0.1, + "z": 0.2 + } + }, + { + "Position": { + "x": 0.5, + "y": 0.1, + "z": 0.2 + } + } + ], + "Autoraise": true, + "ColorDiffuse": { + "b": 1, + "g": 1, + "r": 1 + }, + "CustomImage": { + "CustomTile": { + "Stackable": false, + "Stretch": true, + "Thickness": 0.1, + "Type": 3 + }, + "ImageScalar": 1, + "ImageSecondaryURL": "", + "ImageURL": "http://cloud-3.steamusercontent.com/ugc/2088038980375797637/86B5B03D9FC65483CD1FE25E457CE4FFADF6C8CF/", + "WidthScale": 0 + }, + "Description": "Place cards, decks or bags on this tile and click \"Update!\" to display the class counts.\n\nMulti-class cards are counted for all classes (so the total number will be greater than the amount of cards).", + "DragSelectable": true, + "GMNotes": "", + "GUID": "1335e8", + "Grid": true, + "GridProjection": false, + "Hands": false, + "HideWhenFaceDown": false, + "IgnoreFoW": false, + "LayoutGroupSortIndex": 0, + "Locked": false, + "LuaScriptState": "", + "LuaScript_path": "Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.ttslua", + "MeasureMovement": false, + "Name": "Custom_Tile", + "Nickname": "Subject 5U-21 Helper", + "Snap": true, + "Sticky": true, + "Tags": [ + "CleanUpHelper_ignore" + ], + "Tooltip": true, + "Transform": { + "posX": 0, + "posY": 2, + "posZ": 0, + "rotX": 0, + "rotY": 270, + "rotZ": 0, + "scaleX": 4, + "scaleY": 1, + "scaleZ": 4 + }, + "Value": 0, + "XmlUI": "" +} \ No newline at end of file diff --git a/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.ttslua b/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.ttslua new file mode 100644 index 00000000..064004e8 --- /dev/null +++ b/objects/Fan-MadeAccessories.aa8b38/Subject5U-21Helper.1335e8.ttslua @@ -0,0 +1,103 @@ +local classOrder = { + "Guardian", + "Seeker", + "Survivor", + "Mystic", + "Rogue" +} + +local bParam = {} +bParam.width = 0 +bParam.height = 0 +bParam.function_owner = self +bParam.click_function = "none" +bParam.label = "0" +bParam.position = {x = 0, y = 0.1, z = -0.7} +bParam.scale = {x = 0.1, y = 0.1, z = 0.1} +bParam.font_color = "White" +bParam.font_size = 700 + +function onLoad() + self.createButton({ + width = 2750, + height = 800, + function_owner = self, + click_function = "updateDisplayButtons", + label = "Update!", + tooltip = "Count classes from cards on this tile", + position = {x = 0, y = 0.1, z = 0.875}, + scale = {x = 0.1, y = 0.1, z = 0.1}, + font_size = 500 + }) + createDisplayButtons() +end + +function createDisplayButtons() + local x_offset = 0.361 + bParam.position.x = -3 * x_offset + for i = 1, 5 do + bParam.position.x = bParam.position.x + x_offset + self.createButton(bParam) + end +end + +function updateDisplayButtons(_, playerColor) + local classCount = { + Guardian = 0, + Seeker = 0, + Survivor = 0, + Mystic = 0, + Rogue = 0, + uncounted = 0 + } + + -- loop through cards on this helper and count classes from metadata + for _, notes in ipairs(getNotesFromCardsAndContainers()) do + if notes.class then + for str in string.gmatch(notes.class, "([^|]+)") do + if not tonumber(classCount[str]) then + str = "uncounted" + end + classCount[str] = classCount[str] + 1 + end + end + end + + -- edit button labels with index 1-5 + for i = 1, 5 do + self.editButton({index = i, label = classCount[classOrder[i]]}) + end + + -- show message about uncounted cards + if classCount.uncounted > 0 then + printToColor("Search included " .. classCount.uncounted .. " neutral/ununcounted card(s).", playerColor, "Orange") + end +end + +function getNotesFromCardsAndContainers() + local search = Physics.cast({ + direction = { 0, 1, 0 }, + max_distance = 0, + type = 3, + size = self.getBounds().size:setAt("y", 1), + origin = self.getPosition() + Vector(0, 0.5, 0), + }) + + local notesList = {} + for _, hit in ipairs(search) do + local obj = hit.hit_object + local notes = {} + if obj.type == "Card" then + notes = JSON.decode(obj.getGMNotes()) or {} + table.insert(notesList, notes) + elseif obj.type == "Bag" or obj.type == "Deck" then + for _, deepObj in ipairs(obj.getData().ContainedObjects) do + if deepObj.Name == "Card" or deepObj.Name == "CardCustom" then + notes = JSON.decode(deepObj.GMNotes) or {} + table.insert(notesList, notes) + end + end + end + end + return notesList +end