commit
b1b384c1a2
@ -203,5 +203,10 @@
|
|||||||
"Name": "TitleGradient",
|
"Name": "TitleGradient",
|
||||||
"Type": 0,
|
"Type": 0,
|
||||||
"URL": "https://i.imgur.com/Mdjm349.png"
|
"URL": "https://i.imgur.com/Mdjm349.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "FinnIcon",
|
||||||
|
"Type": 0,
|
||||||
|
"URL": "http://cloud-3.steamusercontent.com/ugc/2037357792052848566/5DA900C430E97D3DFF2C9B8A3DB1CB2271791FC7/"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -1 +1 @@
|
|||||||
{"optionPanel":{"playAreaSnapTags":true,"showAttachmentHelper":false,"showChaosBagManager":false,"showCleanUpHelper":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showNavigationOverlay":false,"showSearchAssistant":[],"showTitleSplash":true,"showTokenArranger":false,"useClueClickers":false,"useSnapTags":true}}
|
{"acknowledgedUpgradeVersions":[],"optionPanel":{"playAreaSnapTags":true,"showAttachmentHelper":false,"showChaosBagManager":false,"showCleanUpHelper":false,"showCustomPlaymatImages":false,"showCYOA":false,"showDisplacementTool":false,"showDrawButton":false,"showHandHelper":[],"showNavigationOverlay":false,"showSearchAssistant":[],"showTitleSplash":true,"showTokenArranger":false,"useClueClickers":false,"useSnapTags":true}}
|
||||||
|
@ -39,6 +39,12 @@ local mythosAreaApi = require("core/MythosAreaApi")
|
|||||||
local tokenArrangerApi = require("accessories/TokenArrangerApi")
|
local tokenArrangerApi = require("accessories/TokenArrangerApi")
|
||||||
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
|
local blessCurseManagerApi = require("chaosbag/BlessCurseManagerApi")
|
||||||
|
|
||||||
|
-- online functionality related variables
|
||||||
|
local MOD_VERSION = "3.1.0"
|
||||||
|
local SOURCE_REPO = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main'
|
||||||
|
local library, requestObj, modMeta, notificationVisible
|
||||||
|
local acknowledgedUpgradeVersions = {}
|
||||||
|
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
-- data for tokens
|
-- data for tokens
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
@ -98,12 +104,13 @@ local tokenDrawingStats = {
|
|||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
-- saving state of optionPanel to restore later
|
-- saving state of optionPanel to restore later
|
||||||
function onSave() return JSON.encode({ optionPanel = optionPanel }) end
|
function onSave() return JSON.encode({ optionPanel = optionPanel, acknowledgedUpgradeVersions = acknowledgedUpgradeVersions }) end
|
||||||
|
|
||||||
function onLoad(savedData)
|
function onLoad(savedData)
|
||||||
if savedData then
|
if savedData then
|
||||||
loadedData = JSON.decode(savedData)
|
loadedData = JSON.decode(savedData)
|
||||||
optionPanel = loadedData.optionPanel
|
optionPanel = loadedData.optionPanel
|
||||||
|
acknowledgedUpgradeVersions = loadedData.acknowledgedUpgradeVersions
|
||||||
updateOptionPanelState()
|
updateOptionPanelState()
|
||||||
else
|
else
|
||||||
print("Saved state could not be found!")
|
print("Saved state could not be found!")
|
||||||
@ -114,6 +121,7 @@ function onLoad(savedData)
|
|||||||
if obj ~= nil then obj.interactable = false end
|
if obj ~= nil then obj.interactable = false end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
getModVersion()
|
||||||
math.randomseed(os.time())
|
math.randomseed(os.time())
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -614,21 +622,17 @@ end
|
|||||||
-- Content Importing and XML functions
|
-- Content Importing and XML functions
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
local source_repo = 'https://raw.githubusercontent.com/chr1z93/loadable-objects/main'
|
|
||||||
local library = nil
|
|
||||||
local request_obj
|
|
||||||
|
|
||||||
function onClick_refreshList()
|
function onClick_refreshList()
|
||||||
local request = WebRequest.get(source_repo .. '/library.json', completed_list_update)
|
local request = WebRequest.get(SOURCE_REPO .. '/library.json', completed_list_update)
|
||||||
request_obj = request
|
requestObj = request
|
||||||
startLuaCoroutine(Global, 'downloadCoroutine')
|
startLuaCoroutine(Global, 'downloadCoroutine')
|
||||||
end
|
end
|
||||||
|
|
||||||
function onClick_select(player, params)
|
function onClick_select(player, params)
|
||||||
params = JSON.decode(urldecode(params))
|
params = JSON.decode(urldecode(params))
|
||||||
local url = source_repo .. '/' .. params.url
|
local url = SOURCE_REPO .. '/' .. params.url
|
||||||
local request = WebRequest.get(url, function (request) complete_obj_download(request, params) end )
|
local request = WebRequest.get(url, function (request) complete_obj_download(request, params) end )
|
||||||
request_obj = request
|
requestObj = request
|
||||||
startLuaCoroutine(Global, 'downloadCoroutine')
|
startLuaCoroutine(Global, 'downloadCoroutine')
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -657,8 +661,8 @@ function onClick_toggleUi(_, title)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function downloadCoroutine()
|
function downloadCoroutine()
|
||||||
while request_obj do
|
while requestObj do
|
||||||
UI.setAttribute('download_progress', 'percentage', request_obj.download_progress * 100)
|
UI.setAttribute('download_progress', 'percentage', requestObj.download_progress * 100)
|
||||||
coroutine.yield(0)
|
coroutine.yield(0)
|
||||||
end
|
end
|
||||||
return 1
|
return 1
|
||||||
@ -732,7 +736,7 @@ function complete_obj_download(request, params)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
request_obj = nil
|
requestObj = nil
|
||||||
UI.setAttribute('download_progress', 'percentage', 100)
|
UI.setAttribute('download_progress', 'percentage', 100)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -756,7 +760,7 @@ function completed_list_update(request)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
request_obj = nil
|
requestObj = nil
|
||||||
UI.setAttribute('download_progress', 'percentage', 100)
|
UI.setAttribute('download_progress', 'percentage', 100)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1035,3 +1039,75 @@ function titleSplash(scenarioName)
|
|||||||
soundCubeApi.playSoundByName("Deep Bell")
|
soundCubeApi.playSoundByName("Deep Bell")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------
|
||||||
|
-- Update notification related functionality
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
-- grabs the latest mod version and release notes from GitHub (called onLoad())
|
||||||
|
function getModVersion()
|
||||||
|
WebRequest.get(SOURCE_REPO .. '/modversion.json', compareVersion)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- compares the modversion with GitHub and possibly shows the update notification
|
||||||
|
function compareVersion(request)
|
||||||
|
if request.is_error then
|
||||||
|
log(request.error)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- global variable to make it accessible for other functions
|
||||||
|
modMeta = JSON.decode(request.text)
|
||||||
|
|
||||||
|
-- stop here if on latest version
|
||||||
|
if MOD_VERSION == modMeta["latestVersion"] then return end
|
||||||
|
|
||||||
|
-- stop here if "don't show again" was clicked for this version before
|
||||||
|
if acknowledgedUpgradeVersions[modMeta["latestVersion"]] then return end
|
||||||
|
|
||||||
|
updateNotificationLoading()
|
||||||
|
|
||||||
|
-- delay to avoid lagging during onLoad()
|
||||||
|
Wait.time(function() UI.show("FinnIcon") end, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- updates the XML update notification based on the mod metadata
|
||||||
|
function updateNotificationLoading()
|
||||||
|
-- grab data
|
||||||
|
local highlights = modMeta["releaseHighlights"]
|
||||||
|
|
||||||
|
-- concatenate the release highlights
|
||||||
|
local highlightText = "• " .. highlights[1]
|
||||||
|
for i, entry in pairs(highlights) do
|
||||||
|
if i ~= 1 then
|
||||||
|
highlightText = highlightText .. "\n• " .. entry
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- update the XML UI
|
||||||
|
UI.setValue("notificationHeader", "New version available: ".. modMeta["latestVersion"])
|
||||||
|
UI.setValue("releaseHighlightText", highlightText)
|
||||||
|
UI.setAttribute("highlightRow", "preferredHeight", 20*#highlights)
|
||||||
|
UI.setAttribute("updateNotification", "height", 20*#highlights + 125)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- triggered by clicking on the Finn Icon
|
||||||
|
function onClick_FinnIcon()
|
||||||
|
if notificationVisible then
|
||||||
|
UI.hide("updateNotification")
|
||||||
|
notificationVisible = false
|
||||||
|
else
|
||||||
|
UI.show("updateNotification")
|
||||||
|
notificationVisible = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- close / don't show again buttons on the update notification
|
||||||
|
function onClick_notification(_, parameter)
|
||||||
|
if parameter == "dontShowAgain" then
|
||||||
|
-- this variable tracks if "don't show again" was pressed for a version
|
||||||
|
acknowledgedUpgradeVersions[modMeta["latestVersion"]] = true
|
||||||
|
end
|
||||||
|
UI.hide("FinnIcon")
|
||||||
|
UI.hide("updateNotification")
|
||||||
|
end
|
||||||
|
@ -98,16 +98,14 @@
|
|||||||
</VerticalLayout>
|
</VerticalLayout>
|
||||||
|
|
||||||
<!-- Title Splash when starting a scenario -->
|
<!-- Title Splash when starting a scenario -->
|
||||||
<Panel
|
<Panel id="title_splash"
|
||||||
id="title_splash"
|
|
||||||
height="220"
|
height="220"
|
||||||
position="0 250 0"
|
position="0 250 0"
|
||||||
showAnimation="FadeIn"
|
showAnimation="FadeIn"
|
||||||
hideAnimation="FadeOut"
|
hideAnimation="FadeOut"
|
||||||
active="false"
|
active="false"
|
||||||
animationDuration="2">
|
animationDuration="2">
|
||||||
<Image
|
<Image id="title_gradient"
|
||||||
id="title_gradient"
|
|
||||||
height="220"
|
height="220"
|
||||||
image="TitleGradient" />
|
image="TitleGradient" />
|
||||||
<Text id="title_splash_text"
|
<Text id="title_splash_text"
|
||||||
@ -122,4 +120,6 @@
|
|||||||
horizontalOverflow="Overflow">
|
horizontalOverflow="Overflow">
|
||||||
</Text>
|
</Text>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Include src="OptionPanel.xml"/>
|
<Include src="OptionPanel.xml"/>
|
||||||
|
<Include src="UpdateNotification.xml"/>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
outline="grey"
|
outline="grey"
|
||||||
showAnimation="SlideIn_Right"
|
showAnimation="SlideIn_Right"
|
||||||
hideAnimation="SlideOut_Right"
|
hideAnimation="SlideOut_Right"
|
||||||
animationDuration="0.1" />
|
animationDuration="0.2" />
|
||||||
|
|
||||||
<!-- group headers -->
|
<!-- group headers -->
|
||||||
<Row class="group-header"
|
<Row class="group-header"
|
||||||
|
80
xml/UpdateNotification.xml
Normal file
80
xml/UpdateNotification.xml
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<!-- Default formatting inherented from OptionPanel! -->
|
||||||
|
|
||||||
|
<!-- Icon with Finn, which can be clicked -->
|
||||||
|
<Image id="FinnIcon"
|
||||||
|
active="false"
|
||||||
|
showAnimation="SlideIn_Top"
|
||||||
|
hideAnimation="SlideOut_Top"
|
||||||
|
animationDuration="0.2"
|
||||||
|
rectAlignment="UpperLeft"
|
||||||
|
offsetXY="420 -5"
|
||||||
|
height="90"
|
||||||
|
width="90"
|
||||||
|
onClick="onClick_FinnIcon"
|
||||||
|
image="FinnIcon"
|
||||||
|
tooltip="Update notification"
|
||||||
|
tooltipBackgroundColor="rgba(0,0,0,0.8)"/>
|
||||||
|
|
||||||
|
<!-- main notification window -->
|
||||||
|
<TableLayout id="updateNotification"
|
||||||
|
active="false"
|
||||||
|
color="#000000"
|
||||||
|
outlineSize="2 2"
|
||||||
|
outline="grey"
|
||||||
|
showAnimation="SlideIn_Top"
|
||||||
|
hideAnimation="SlideOut_Top"
|
||||||
|
animationDuration="0.2"
|
||||||
|
rectAlignment="UpperLeft"
|
||||||
|
offsetXY="60 -5"
|
||||||
|
height="225"
|
||||||
|
width="350">
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<Row preferredHeight="50">
|
||||||
|
<Cell>
|
||||||
|
<Panel padding="10 10 0 0">
|
||||||
|
<!-- this part will be updated via script -->
|
||||||
|
<Text id="notificationHeader"
|
||||||
|
font="font_teutonic-arkham"
|
||||||
|
fontSize="30"
|
||||||
|
alignment="MiddleCenter">Placeholder</Text>
|
||||||
|
</Panel>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<!-- patch highlights -->
|
||||||
|
<Row id="highlightRow"
|
||||||
|
preferredHeight="100">
|
||||||
|
<Cell>
|
||||||
|
<Panel padding="15 15 0 7">
|
||||||
|
<!-- this part will be updated via script -->
|
||||||
|
<Text id="releaseHighlightText"
|
||||||
|
resizeTextForBestFit="true">Placeholder</Text>
|
||||||
|
</Panel>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<!-- explanation -->
|
||||||
|
<Row preferredHeight="25">
|
||||||
|
<Cell>
|
||||||
|
<Panel padding="15 15 0 7">
|
||||||
|
<Text resizeTextForBestFit="true">Visit the usual place to receive this update.</Text>
|
||||||
|
</Panel>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<!-- Buttons: "Don't show again" and "Close" -->
|
||||||
|
<Row preferredHeight="50">
|
||||||
|
<Cell>
|
||||||
|
<HorizontalLayout minHeight="55"
|
||||||
|
flexibleHeight="0"
|
||||||
|
padding="10 10 5 10"
|
||||||
|
spacing="10">
|
||||||
|
<Button class="bottomButtons"
|
||||||
|
onClick="onClick_notification(dontShowAgain)">Don't show again</Button>
|
||||||
|
<Button class="bottomButtons"
|
||||||
|
onClick="onClick_notification(close)">Close</Button>
|
||||||
|
</HorizontalLayout>
|
||||||
|
</Cell>
|
||||||
|
</Row>
|
||||||
|
</TableLayout>
|
Loading…
Reference in New Issue
Block a user