diff --git a/src/accessories/CampaignImporterExporter.ttslua b/src/accessories/CampaignImporterExporter.ttslua index f8a9da01..f2b83fe9 100644 --- a/src/accessories/CampaignImporterExporter.ttslua +++ b/src/accessories/CampaignImporterExporter.ttslua @@ -6,8 +6,12 @@ local optionPanelApi = require("core/OptionPanelApi") local playAreaApi = require("core/PlayAreaApi") local playmatApi = require("playermat/PlaymatApi") +local additionalIndex +local campaignLog +local checkWarning = true + local campaignTokenData = { - Name = "Custom_Model", + Name = "Custom_Model_Bag", Transform = { posX = -21.25, posY = 1.68, @@ -30,7 +34,7 @@ local campaignTokenData = { ColliderURL = "http://cloud-3.steamusercontent.com/ugc/943949966265929204/A38BB5D72419E6298385556D931877C0A1A55C17/", Convex = true, MaterialIndex = 2, - TypeIndex = 0, + TypeIndex = 6, CustomShader = { SpecularColor = { r = 0.7222887, @@ -47,6 +51,7 @@ local campaignTokenData = { local COLORS = { "White", "Orange", "Green", "Red" } function onLoad() + log(getObjectFromGUID("1f5a0a").getData()) self.createButton({ click_function = "createCampaignToken", function_owner = self, @@ -60,6 +65,24 @@ function onLoad() }) end +function onObjectLeaveContainer(container, object) + if container.hasTag("ImporterToken") and checkWarning then + broadcastToAll( + "Removing objects from the Save Coin bag will break functionality. Please replace the objects in the same order they were removed.", + Color.Yellow + ) + end +end + +function onObjectEnterContainer(container, object) + if container.hasTag("ImporterToken") and checkWarning then + broadcastToAll( + "Adding objects to the Save Coin bag will break functionality. Please remove the objects.", + Color.Yellow + ) + end +end + --------------------------------------------------------- -- main import functions (split up to allow for Wait conditions) --------------------------------------------------------- @@ -75,19 +98,22 @@ end function importFromToken(coin) broadcastToAll("Campaign Import Initiated") local importData = JSON.decode(coin.getGMNotes()) - coin.destruct() local campaignBoxGUID = importData["box"] local campaignBox = getObjectFromGUID(campaignBoxGUID) + if not campaignBox then + broadcastToAll("Campaign Box not present on table!", Color.Red) + return + end if campaignBox.type == "Generic" then campaignBox.call("buttonClick_download") end Wait.condition( function() if #campaignBox.getObjects() > 0 then - placeCampaignFromToken(importData) + placeCampaignFromToken(importData, coin) else - createCampaignFromToken(importData) + createCampaignFromToken(importData, coin) end end, function() @@ -104,10 +130,10 @@ function importFromToken(coin) end -- After box has been downloaded, places content on table -function placeCampaignFromToken(importData) +function placeCampaignFromToken(importData, coin) getObjectFromGUID(importData["box"]).call("buttonClick_place") Wait.condition( - function() createCampaignFromToken(importData) end, + function() createCampaignFromToken(importData, coin) end, function() return findUniqueObjectWithTag("CampaignLog") ~= nil end, 2, function() broadcastToAll("Error placing campaign box") end @@ -115,16 +141,30 @@ function placeCampaignFromToken(importData) end -- After content is placed on table, conducts all the other import operations -function createCampaignFromToken(importData) - -- destroy existing campaign log and load saved campaign log - findUniqueObjectWithTag("CampaignLog").destruct() - spawnObjectData({ data = importData["log"] }) +function createCampaignFromToken(importData, coin) + checkWarning = false if importData["additionalIndex"] then findUniqueObjectWithTag("AllCardsHotfix").destruct() - spawnObjectJSON({json = importData["additionalIndex"]}) + if coin.getObjects() then + local newBag = coin.takeObject({index = 0, position = importData["additionalIndex"]}) + Wait.time(function() newBag.setLock(true) end, 1) + else + spawnObjectJSON({json = importData["additionalIndex"]}) + end end - + + -- destroy existing campaign log and load saved campaign log + findUniqueObjectWithTag("CampaignLog").destruct() + if coin.getObjects() then + coin.takeObject({index = 0, position = importData["log"]}) + else + spawnObjectData({ data = importData["log"] }) + end + + coin.destruct() + checkWarning = true + chaosBagApi.setChaosBagState(importData["bag"]) -- populate trauma values @@ -188,13 +228,13 @@ function createCampaignToken(_, playerColor, _) return end - local campaignLog = findUniqueObjectWithTag("CampaignLog") + campaignLog = findUniqueObjectWithTag("CampaignLog") if campaignLog == nil then broadcastToAll("Campaign log not found!", Color.Red) return end - local additionalIndex = findUniqueObjectWithTag("AllCardsHotfix") + additionalIndex = findUniqueObjectWithTag("AllCardsHotfix") local traumaValues = { } local trauma = campaignLog.getVar("returnTrauma") @@ -221,7 +261,7 @@ function createCampaignToken(_, playerColor, _) local campaignData = { box = campaignBox.getGUID(), - log = campaignLog.getData(), + log = campaignLog.getPosition(), bag = chaosBagApi.getChaosBagState(), trauma = traumaValues, decks = deckImporterApi.getUiState(), @@ -229,11 +269,23 @@ function createCampaignToken(_, playerColor, _) playarea = playAreaApi.getSurface(), options = optionPanelApi.getOptions(), guide = campaignGuide.Book.getPage(), - additionalIndex = additionalIndex.getJSON() + additionalIndex = additionalIndex.getPosition() } campaignTokenData.GMNotes = JSON.encode(campaignData) campaignTokenData.Nickname = os.date("%b %d ") .. campaignBox.getName() .. " Save" - spawnObjectData({ data = campaignTokenData }) + spawnObjectData({ data = campaignTokenData, callback_function = finishTokenSpawning }) +end + +function finishTokenSpawning(obj) + local logData = campaignLog.getData() + local indexData = additionalIndex.getData() + additionalIndex.setLock(false) + checkWarning = false + obj.putObject(additionalIndex) + obj.putObject(campaignLog) + checkWarning = true + spawnObjectData({data = indexData}) + spawnObjectData({data = logData}) broadcastToAll("Campaign successfully exported! Save coin object to import on a fresh save", Color.Green) end @@ -261,12 +313,12 @@ function setTrauma(trauma) end -- gets data from campaign log if possible -function loadTrauma(campaignLog) - local trauma = campaignLog.getVar("returnTrauma") +function loadTrauma(log) + local trauma = log.getVar("returnTrauma") if trauma ~= nil then printToAll("Trauma values found in campaign log!", "Green") - trauma = campaignLog.call("returnTrauma") + trauma = log.call("returnTrauma") return trauma else return nil diff --git a/src/playercards/AllCardsBag.ttslua b/src/playercards/AllCardsBag.ttslua index a6a7bb9a..7b70b556 100644 --- a/src/playercards/AllCardsBag.ttslua +++ b/src/playercards/AllCardsBag.ttslua @@ -72,6 +72,7 @@ end -- yielding. Based on the current count of cards this will require -- approximately 60 frames to complete. function buildIndex() + local cardCount = 0 indexingDone = false if (self.getData().ContainedObjects == nil) then return 1 @@ -80,6 +81,11 @@ function buildIndex() local cardMetadata = JSON.decode(cardData.GMNotes) if (cardMetadata ~= nil) then addCardToIndex(cardData, cardMetadata) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end end end local hotfixBags = getObjectsWithTag("AllCardsHotfix") @@ -91,12 +97,22 @@ function buildIndex() local deepCardMetadata = JSON.decode(deepCardData.GMNotes) if deepCardMetadata ~= nil then addCardToIndex(deepCardData, deepCardMetadata) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end end end else local cardMetadata = JSON.decode(cardData.GMNotes) if cardMetadata ~= nil then addCardToIndex(cardData, cardMetadata) + cardCount = cardCount + 1 + if cardCount > 9 then + cardCount = 0 + coroutine.yield(0) + end end end end