CocoView = require 'views/core/CocoView' template = require 'templates/play/level/thang_avatar' ThangType = require 'models/ThangType' module.exports = class ThangAvatarView extends CocoView className: 'thang-avatar-view' template: template subscriptions: 'tome:problems-updated': 'onProblemsUpdated' 'god:new-world-created': 'onNewWorld' constructor: (options) -> super options @thang = options.thang @includeName = options.includeName @thangType = @getSpriteThangType() if not @thangType console.error 'Thang avatar view expected a thang type to be provided.' return unless @thangType.isFullyLoaded() or @thangType.loading @thangType.fetch() # couldn't get the level view to load properly through the supermodel # so just doing it manually this time. @listenTo @thangType, 'sync', @render @listenTo @thangType, 'build-complete', @render getSpriteThangType: -> thangs = @supermodel.getModels(ThangType) thangs = (t for t in thangs when t.get('name') is @thang.spriteName) loadedThangs = (t for t in thangs when t.isFullyLoaded()) return loadedThangs[0] or thangs[0] # try to return one with all the goods, otherwise a projection getRenderData: (context={}) -> context = super context context.thang = @thang options = @thang?.getLankOptions() or {} #options.async = true # sync builds fail during async builds, and we build HUD version sync context.avatarURL = @thangType.getPortraitSource(options) unless @thangType.loading context.includeName = @includeName context setProblems: (problemCount, level) -> badge = @$el.find('.badge.problems').text(if problemCount then 'x' else '') badge.removeClass('error warning info') badge.addClass level if level setSharedThangs: (sharedThangCount) -> badge = @$el.find('.badge.shared-thangs').text(if sharedThangCount > 1 then sharedThangCount else '') # TODO: change the alert color based on whether any of those things that aren't us have problems #badge.removeClass('error warning info') #badge.addClass level if level setSelected: (selected) -> @$el.toggleClass 'selected', Boolean(selected) onProblemsUpdated: (e) -> return unless @thang?.id of e.spell.thangs myProblems = [] for thangID, spellThang of e.spell.thangs when thangID is @thang.id #aether = if e.isCast and spellThang.castAether then spellThang.castAether else spellThang.aether aether = spellThang.castAether # try only paying attention to the actually cast ones myProblems = myProblems.concat aether.getAllProblems() if aether worstLevel = null for level in ['error', 'warning', 'info'] when _.some myProblems, {level: level} worstLevel = level break @setProblems myProblems.length, worstLevel onNewWorld: (e) -> @options.thang = @thang = e.world.thangMap[@thang.id] if @thang and e.world.thangMap[@thang.id] destroy: -> super()