-- Bundled by luabundle {"version":"1.6.0"} local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire) local loadingPlaceholder = {[{}] = true} local register local modules = {} local require local loaded = {} register = function(name, body) if not modules[name] then modules[name] = body end end require = function(name) local loadedModule = loaded[name] if loadedModule then if loadedModule == loadingPlaceholder then return nil end else if not modules[name] then if not superRequire then local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name) error('Tried to require ' .. identifier .. ', but no such module has been registered') else return superRequire(name) end end loaded[name] = loadingPlaceholder loadedModule = modules[name](require, loaded, register, modules) loaded[name] = loadedModule end return loadedModule end return require, loaded, register, modules end)(nil) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("playercards/customizable/SummonedServitorUpgradeSheet") end) __bundle_register("playercards/customizable/SummonedServitorUpgradeSheet", function(require, _LOADED, __bundle_register, __bundle_modules) -- Customizable Cards: Summoned Servitor -- by Chr1Z information = { version = "1.7", last_updated = "12.10.2022" } -- Color information for buttons boxSize = 35 -- static values x_1 = -0.935 x_offset = 0.068 y_visible = 0.25 y_invisible = -0.5 -- z-values (lines on the sheet) posZ = { -0.92, -0.625, -0.33, 0.055, 0.26, 0.56, 0.765, 1.06 } -- box setup (amount of boxes per line and amount of marked boxes in that line) existingBoxes = { 1, 1, 1, 1, 1, 2, 3, 5 } inputBoxes = {} -- Locations of the slot selectors local SLOT_ICON_POSITIONS = { arcane = { x = 0.160, z = 0.65}, ally = { x = -0.073, z = 0.65} } -- These match with ArkhamDB's way of storing the data in the dropdown menu local slotIndices = {arcane = "1", ally = "0", none = ""} local selectedSlot = slotIndices.none -- override 'marked boxes' for debugging ('all' or 'none') markDEBUG = "" -- save state when going into bags / decks function onDestroy() self.script_state = onSave() end function onSave() return JSON.encode({ markedBoxes, {selectedSlot} }) end -- Startup procedure function onLoad(saved_data) if saved_data ~= "" and markDEBUG == "" then local loaded_data = JSON.decode(saved_data) markedBoxes = loaded_data[1] selectedSlot = loaded_data[2][1] else markedBoxes = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } selectedSlot = "" end makeData() createButtonsAndBoxes() updateSlotDisplay() self.addContextMenuItem("Reset Inputs", function() updateState() end) self.addContextMenuItem("Scale: normal", function() self.setScale({ 1, 1, 1 }) end) self.addContextMenuItem("Scale: double", function() self.setScale({ 2, 1, 2 }) end) self.addContextMenuItem("Scale: triple", function() self.setScale({ 3, 1, 3 }) end) end function updateState(markedBoxesNew) if markedBoxesNew then markedBoxes = markedBoxesNew end makeData() createButtonsAndBoxes() updateSlotDisplay() end -- create Data function makeData() Data = {} Data.checkbox = {} Data.textbox = {} -- repeat this for each entry (= line) in existingBoxes local totalCount = 0 for i = 1, #existingBoxes do -- repeat this for each checkbox per line for j = 1, existingBoxes[i] do totalCount = totalCount + 1 Data.checkbox[totalCount] = {} Data.checkbox[totalCount].pos = {} Data.checkbox[totalCount].pos.x = x_1 + j * x_offset Data.checkbox[totalCount].pos.z = posZ[i] Data.checkbox[totalCount].row = i if (markDEBUG == "all") or (markedBoxes[i] >= j and markDEBUG ~= "none") then Data.checkbox[totalCount].pos.y = y_visible Data.checkbox[totalCount].state = true else Data.checkbox[totalCount].pos.y = y_invisible Data.checkbox[totalCount].state = false end end end -- repeat this for each entry (= line) in inputBoxes local totalCount = 0 for i = 1, #inputBoxes do -- repeat this for each textbox per line for j = 1, inputBoxes[i] do totalCount = totalCount + 1 Data.textbox[totalCount] = {} Data.textbox[totalCount].pos = inputPos[totalCount] Data.textbox[totalCount].width = inputWidth[totalCount] Data.textbox[totalCount].value = inputValues[totalCount] end end end -- checks or unchecks the given box function click_checkbox(tableIndex) local row = Data.checkbox[tableIndex].row if Data.checkbox[tableIndex].state == true then Data.checkbox[tableIndex].pos.y = y_invisible Data.checkbox[tableIndex].state = false markedBoxes[row] = markedBoxes[row] - 1 else Data.checkbox[tableIndex].pos.y = y_visible Data.checkbox[tableIndex].state = true markedBoxes[row] = markedBoxes[row] + 1 end self.editButton({ index = tableIndex - 1, position = Data.checkbox[tableIndex].pos }) end -- updates saved value for given text box function click_textbox(i, value, selected) if selected == false then inputValues[i] = value end end function createButtonsAndBoxes() self.clearButtons() self.clearInputs() for i, box_data in ipairs(Data.checkbox) do local funcName = "checkbox" .. i local func = function() click_checkbox(i) end self.setVar(funcName, func) self.createButton({ click_function = funcName, function_owner = self, position = box_data.pos, height = boxSize, width = boxSize, font_size = box_data.size, scale = { 1, 1, 1 }, color = { 0, 0, 0 }, font_color = { 0, 0, 0 } }) end for i, box_data in ipairs(Data.textbox) do local funcName = "textbox" .. i local func = function(_, _, val, sel) click_textbox(i, val, sel) end self.setVar(funcName, func) self.createInput({ input_function = funcName, function_owner = self, label = "Click to type", alignment = 2, position = box_data.pos, scale = buttonScale, width = box_data.width, height = (inputFontsize * 1) + 24, font_size = inputFontsize, color = "White", font_color = buttonFontColor, value = box_data.value }) end makeSlotSelectionButtons() end -- Creates the invisible buttons overlaying the slot words function makeSlotSelectionButtons() local buttonPositions = { x = -1 * SLOT_ICON_POSITIONS.arcane.x, y = 0.2, z = SLOT_ICON_POSITIONS.arcane.z } local buttonData = { click_function = "click_arcane", function_owner = self, position = buttonPositions, height = 130, width = 130, scale = { 1, 1, 1 }, color = { 0, 0, 0, 0 }, } self.createButton(buttonData) buttonData.click_function = "click_ally" buttonPositions.x = -1 * SLOT_ICON_POSITIONS.ally.x buttonData.position = buttonPositions self.createButton(buttonData) end function click_arcane() if selectedSlot == slotIndices.arcane then selectedSlot = slotIndices.none else selectedSlot = slotIndices.arcane end updateSlotDisplay() end function click_ally() if selectedSlot == slotIndices.ally then selectedSlot = slotIndices.none else selectedSlot = slotIndices.ally end updateSlotDisplay() end -- Refresh the vector circles indicating a slot is selected. function updateSlotDisplay() local box = {} local center = {} center = SLOT_ICON_POSITIONS["arcane"] local arcaneVecList = { Vector(center.x + 0.12, 0.3, center.z + 0.05), Vector(center.x - 0.12, 0.3, center.z + 0.05), Vector(center.x - 0.12, 0.3, center.z - 0.05), Vector(center.x + 0.12, 0.3, center.z - 0.05), Vector(center.x + 0.12, 0.3, center.z + 0.05), } center = SLOT_ICON_POSITIONS["ally"] local allyVecList = { Vector(center.x + 0.07, 0.3, center.z + 0.05), Vector(center.x - 0.07, 0.3, center.z + 0.05), Vector(center.x - 0.07, 0.3, center.z - 0.05), Vector(center.x + 0.07, 0.3, center.z - 0.05), Vector(center.x + 0.07, 0.3, center.z + 0.05), } local arcaneVecColor = {0.5, 0.5, 0.5, 0.75} local allyVecColor = {0.5, 0.5, 0.5, 0.75} if selectedSlot == slotIndices.arcane then arcaneVecColor = {0.597, 0.195, 0.796} elseif selectedSlot == slotIndices.ally then allyVecColor = {0.597, 0.195, 0.796} end self.setVectorLines({ { points = arcaneVecList, color = arcaneVecColor, thickness = 0.02, }, { points = allyVecList, color = allyVecColor, thickness = 0.02, }, }) end end) return __bundle_require("__root")