mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-18 11:32:25 -05:00
25531477c5
This fixes #3243. Achievement notification animation now slides in from off-screen left and then hides back to off-screen left.
88 lines
3.2 KiB
CoffeeScript
88 lines
3.2 KiB
CoffeeScript
CocoView = require 'views/core/CocoView'
|
|
template = require 'templates/core/achievement-popup'
|
|
User = require '../../models/User'
|
|
Achievement = require '../../models/Achievement'
|
|
|
|
module.exports = class AchievementPopup extends CocoView
|
|
className: 'achievement-popup'
|
|
template: template
|
|
|
|
constructor: (options) ->
|
|
@achievement = options.achievement
|
|
@earnedAchievement = options.earnedAchievement
|
|
@container = options.container or @getContainer()
|
|
@popup = options.container
|
|
@popup ?= true
|
|
@className += ' popup' if @popup
|
|
super options
|
|
@render()
|
|
|
|
calculateData: ->
|
|
currentLevel = me.level()
|
|
nextLevel = currentLevel + 1
|
|
currentLevelXP = User.expForLevel(currentLevel)
|
|
nextLevelXP = User.expForLevel(nextLevel)
|
|
totalXPNeeded = nextLevelXP - currentLevelXP
|
|
expFunction = @achievement.getExpFunction()
|
|
currentXP = me.get 'points', true
|
|
if @achievement.isRepeatable()
|
|
achievedXP = expFunction(@earnedAchievement.get('previouslyAchievedAmount')) * @achievement.get('worth') if @achievement.isRepeatable()
|
|
else
|
|
achievedXP = @achievement.get 'worth', true
|
|
previousXP = currentXP - achievedXP
|
|
leveledUp = currentXP - achievedXP < currentLevelXP
|
|
#console.debug 'Leveled up' if leveledUp
|
|
alreadyAchievedPercentage = 100 * (previousXP - currentLevelXP) / totalXPNeeded
|
|
alreadyAchievedPercentage = 0 if alreadyAchievedPercentage < 0 # In case of level up
|
|
newlyAchievedPercentage = if leveledUp then 100 * (currentXP - currentLevelXP) / totalXPNeeded else 100 * achievedXP / totalXPNeeded
|
|
|
|
#console.debug "Current level is #{currentLevel} (#{currentLevelXP} xp), next level is #{nextLevel} (#{nextLevelXP} xp)."
|
|
#console.debug "Need a total of #{nextLevelXP - currentLevelXP}, already had #{previousXP} and just now earned #{achievedXP} totalling on #{currentXP}"
|
|
|
|
data =
|
|
title: @achievement.i18nName()
|
|
imgURL: @achievement.getImageURL()
|
|
description: @achievement.i18nDescription()
|
|
level: currentLevel
|
|
currentXP: currentXP
|
|
newXP: achievedXP
|
|
leftXP: nextLevelXP - currentXP
|
|
oldXPWidth: alreadyAchievedPercentage
|
|
newXPWidth: newlyAchievedPercentage
|
|
leftXPWidth: 100 - newlyAchievedPercentage - alreadyAchievedPercentage
|
|
|
|
getRenderData: ->
|
|
c = super()
|
|
_.extend c, @calculateData()
|
|
c.style = @achievement.getStyle()
|
|
c.popup = true
|
|
c.$ = $ # Allows the jade template to do i18n
|
|
c
|
|
|
|
render: ->
|
|
super()
|
|
@container.prepend @$el
|
|
if @popup
|
|
hide = =>
|
|
return if @destroyed
|
|
@$el.animate {left: -600}, =>
|
|
@$el.remove()
|
|
@destroy()
|
|
@$el.animate left: 0
|
|
@$el.on 'click', hide
|
|
_.delay hide, 10000 unless $('#editor-achievement-edit-view').length
|
|
|
|
getContainer: ->
|
|
unless @container
|
|
@container = $('.achievement-popup-container')
|
|
unless @container.length
|
|
$('body').append('<div class="achievement-popup-container"></div>')
|
|
@container = $('.achievement-popup-container')
|
|
@container
|
|
|
|
afterRender: ->
|
|
super()
|
|
_.delay @initializeTooltips, 1000 # TODO this could be smoother
|
|
|
|
initializeTooltips: ->
|
|
$('.progress-bar').addClass('has-tooltip').tooltip()
|