Add achievements
This commit is contained in:
196
data/cdata/ui_scripts/achievements/__init__.lua
Normal file
196
data/cdata/ui_scripts/achievements/__init__.lua
Normal file
@ -0,0 +1,196 @@
|
||||
if (Engine.InFrontend()) then
|
||||
return
|
||||
end
|
||||
|
||||
local hud = LUI.UIElement.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
width = 500,
|
||||
height = 500,
|
||||
left = 0
|
||||
})
|
||||
|
||||
local hidetimer = LUI.UITimer.new(5000, "hide_toast")
|
||||
local finishtimer = LUI.UITimer.new(6000, "notification_finished")
|
||||
local animtime = 250
|
||||
|
||||
hud:setPriority(1000)
|
||||
|
||||
local isshowingachievement = false
|
||||
local notificationqueue = {}
|
||||
local shownotificationinternal = nil
|
||||
|
||||
local shownextnotification = function()
|
||||
isshowingachievement = false
|
||||
local data = notificationqueue[1]
|
||||
if (data == nil) then
|
||||
return
|
||||
end
|
||||
|
||||
table.remove(notificationqueue, 1)
|
||||
shownotificationinternal(data)
|
||||
end
|
||||
|
||||
local createtoast = function()
|
||||
local height = 80
|
||||
local width = 400
|
||||
local padding = 10
|
||||
local leftoffset = 10
|
||||
|
||||
local titlefont = CoD.TextSettings.Font27
|
||||
local descfont = CoD.TextSettings.Font21
|
||||
|
||||
local imagesize = height - padding * 2
|
||||
local textoffset = padding * 2 + imagesize
|
||||
local textyoffset = height / 2 - (titlefont.Height + descfont.Height) / 2
|
||||
local text2yoffset = 5
|
||||
|
||||
local container = LUI.UIElement.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = 100,
|
||||
left = 0,
|
||||
width = width,
|
||||
height = height
|
||||
})
|
||||
|
||||
container:registerAnimationState("hide", {
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = 100,
|
||||
left = -1000,
|
||||
width = width,
|
||||
height = height
|
||||
})
|
||||
|
||||
container:registerAnimationState("show", {
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = 100,
|
||||
left = 0,
|
||||
width = width,
|
||||
height = height
|
||||
})
|
||||
|
||||
container:registerAnimationState("show_right", {
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = 100,
|
||||
left = 40,
|
||||
width = width,
|
||||
height = height
|
||||
})
|
||||
|
||||
local bg = LUI.UIImage.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
rightAnchor = true,
|
||||
bottomAnchor = true,
|
||||
color = {
|
||||
r = 0.1,
|
||||
g = 0.1,
|
||||
b = 0.1,
|
||||
},
|
||||
alpha = 0.55
|
||||
})
|
||||
|
||||
local image = LUI.UIImage.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = padding,
|
||||
left = padding + leftoffset,
|
||||
width = imagesize,
|
||||
height = imagesize,
|
||||
})
|
||||
|
||||
local title = LUI.UIText.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
top = textyoffset,
|
||||
left = textoffset + leftoffset,
|
||||
font = titlefont.Font,
|
||||
height = titlefont.Height
|
||||
})
|
||||
|
||||
local desc = LUI.UIText.new({
|
||||
topAnchor = true,
|
||||
leftAnchor = true,
|
||||
width = width - textoffset - leftoffset - padding,
|
||||
alignment = LUI.Alignment.Left,
|
||||
top = textyoffset + titlefont.Height + text2yoffset,
|
||||
left = textoffset + leftoffset,
|
||||
font = descfont.Font,
|
||||
height = descfont.Height
|
||||
})
|
||||
|
||||
container:addElement(bg)
|
||||
container:addElement(image)
|
||||
container:addElement(title)
|
||||
container:addElement(desc)
|
||||
container:addElement(LUI.DecoFrame.new(nil, LUI.DecoFrame.Grey))
|
||||
|
||||
container:animateToState("hide")
|
||||
|
||||
container:addElement(hidetimer)
|
||||
container:addElement(finishtimer)
|
||||
|
||||
container:registerEventHandler("hide_toast", function()
|
||||
LUI.UITimer.Stop(hidetimer)
|
||||
container:animateToState("hide", animtime)
|
||||
end)
|
||||
|
||||
container:registerEventHandler("notification_finished", function()
|
||||
LUI.UITimer.Stop(finishtimer)
|
||||
shownextnotification()
|
||||
end)
|
||||
|
||||
hud:addElement(container)
|
||||
|
||||
container.image = image
|
||||
container.title = title
|
||||
container.desc = desc
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
local toast = createtoast()
|
||||
|
||||
shownotificationinternal = function(data)
|
||||
isshowingachievement = true
|
||||
|
||||
LUI.UITimer.Reset(hidetimer)
|
||||
LUI.UITimer.Reset(finishtimer)
|
||||
|
||||
toast:animateToState("hide")
|
||||
toast:animateToState("show", animtime)
|
||||
|
||||
toast.title:setText(data.title)
|
||||
toast.desc:setText(data.description)
|
||||
toast.image:setImage(data.image)
|
||||
|
||||
if (data.sound) then
|
||||
Engine.PlaySound(data.sound)
|
||||
end
|
||||
end
|
||||
|
||||
function addnotification(data)
|
||||
table.insert(notificationqueue, data)
|
||||
if (not isshowingachievement) then
|
||||
shownextnotification()
|
||||
end
|
||||
end
|
||||
|
||||
local addachievementnotification = function(id)
|
||||
addnotification({
|
||||
title = Engine.Localize("ACHIEVEMENT_EARNED"),
|
||||
description = Engine.ToUpperCase(Engine.Localize("ACHIEVEMENT_NAME_" .. id)),
|
||||
image = RegisterMaterial("trophy_" .. id),
|
||||
sound = "ui_achievement_unlocked"
|
||||
})
|
||||
end
|
||||
|
||||
hud:registerEventHandler("earned_achievement", function(element, event)
|
||||
addachievementnotification(event.id)
|
||||
end)
|
||||
|
||||
LUI.roots.UIRoot0:addElement(hud)
|
Reference in New Issue
Block a user