mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-28 18:15:52 -05:00
121 lines
4.2 KiB
CoffeeScript
121 lines
4.2 KiB
CoffeeScript
CocoView = require 'views/core/CocoView'
|
|
template = require 'templates/play/level/duel-stats-view'
|
|
ThangAvatarView = require 'views/play/level/ThangAvatarView'
|
|
utils = require 'core/utils'
|
|
|
|
# TODO:
|
|
# - if a hero is dead, a big indication that they are dead
|
|
# - each hero's current action?
|
|
# - if one player is you, an indicator that it's you?
|
|
# - indication of which team won (not always hero dead--ties and other victory conditions)
|
|
# - army composition or power or attack/defense (for certain levels): experiment with something simple, not like the previous unit list thing
|
|
|
|
module.exports = class DuelStatsView extends CocoView
|
|
id: 'duel-stats-view'
|
|
template: template
|
|
|
|
subscriptions:
|
|
#'surface:gold-changed': 'onGoldChanged'
|
|
'god:new-world-created': 'onNewWorld'
|
|
'god:streaming-world-updated': 'onNewWorld'
|
|
'surface:frame-changed': 'onFrameChanged'
|
|
|
|
constructor: (options) ->
|
|
super options
|
|
options.thangs = _.filter options.thangs, 'inThangList'
|
|
unless options.otherSession
|
|
options.otherSession = get: (prop) -> {
|
|
creatorName: $.i18n.t 'ladder.simple_ai'
|
|
team: if options.session.get('team') is 'humans' then 'ogres' else 'humans'
|
|
heroConfig: options.session.get('heroConfig')
|
|
}[prop]
|
|
#@teamGold = {}
|
|
#@teamGoldEarned = {}
|
|
|
|
getRenderData: (c) ->
|
|
c = super c
|
|
c.players = @players = (@formatPlayer team for team in ['humans', 'ogres'])
|
|
c
|
|
|
|
formatPlayer: (team) ->
|
|
p = team: team
|
|
session = _.find [@options.session, @options.otherSession], (s) -> s.get('team') is team
|
|
p.name = session.get 'creatorName'
|
|
p.heroThangType = (session.get('heroConfig') ? {}).thangType or '529ffbf1cf1818f2be000001'
|
|
p.heroID = if team is 'ogres' then 'Hero Placeholder 1' else 'Hero Placeholder'
|
|
p
|
|
|
|
afterRender: ->
|
|
super()
|
|
for player in @players
|
|
@buildAvatar player.heroID, player.team
|
|
@$el.css 'display', 'flex' # Show it
|
|
|
|
buildAvatar: (heroID, team) ->
|
|
@avatars ?= {}
|
|
return if @avatars[team]
|
|
thang = _.find @options.thangs, id: heroID
|
|
@avatars[team] = avatar = new ThangAvatarView thang: thang, includeName: false, supermodel: @supermodel
|
|
@$find(team, '.thang-avatar-placeholder').replaceWith avatar.$el
|
|
avatar.render()
|
|
|
|
onNewWorld: (e) ->
|
|
@options.thangs = _.filter e.world.thangs, 'inThangList'
|
|
|
|
onFrameChanged: (e) ->
|
|
@update()
|
|
|
|
update: ->
|
|
for player in @players
|
|
thang = _.find @options.thangs, id: @avatars[player.team].thang.id
|
|
@updateHealth thang
|
|
@updatePower()
|
|
|
|
updateHealth: (thang) ->
|
|
$health = @$find thang.team, '.player-health'
|
|
$health.find('.health-bar').css 'width', Math.max(0, Math.min(100, 100 * thang.health / thang.maxHealth)) + '%'
|
|
utils.replaceText $health.find('.health-value'), Math.round thang.health
|
|
|
|
updatePower: ->
|
|
# Right now we just display the army cost of all living units as opposed to doing something more sophisticate to measure power.
|
|
@costTable ?=
|
|
soldier: 20
|
|
archer: 25
|
|
decoy: 25
|
|
'griffin-rider': 50
|
|
paladin: 80
|
|
artillery: 75
|
|
'arrow-tower': 100
|
|
palisade: 10
|
|
peasant: 50
|
|
powers = humans: 0, ogres: 0
|
|
for thang in @options.thangs when thang.health > 0 and thang.exists
|
|
powers[thang.team] += @costTable[thang.type] or 0 if powers[thang.team]?
|
|
for player in @players
|
|
utils.replaceText @$find(player.team, '.power-value'), powers[player.team]
|
|
|
|
$find: (team, selector) ->
|
|
@$el.find(".player-container.team-#{team} " + selector)
|
|
|
|
destroy: ->
|
|
avatar.destroy() for team, avatar of @avatars ? {}
|
|
super()
|
|
|
|
#onGoldChanged: (e) ->
|
|
# return if @teamGold[e.team] is e.gold and @teamGoldEarned[e.team] is e.goldEarned
|
|
# @teamGold[e.team] = e.gold
|
|
# @teamGoldEarned[e.team] = e.goldEarned
|
|
# goldEl = @$find e.team, '.gold-amount'
|
|
# text = '' + e.gold
|
|
# if e.goldEarned and e.goldEarned > e.gold
|
|
# text += " (#{e.goldEarned})"
|
|
# goldEl.text text
|
|
# @updateTitle()
|
|
#
|
|
#updateTitle: ->
|
|
# for team, gold of @teamGold
|
|
# if @teamGoldEarned[team]
|
|
# title = "Team '#{team}' has #{gold} now of #{@teamGoldEarned[team]} gold earned."
|
|
# else
|
|
# title = "Team '#{team}' has #{gold} gold."
|
|
# @$find(team, '.player-gold').attr 'title', title
|