mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 08:08:15 -05:00
95 lines
3.5 KiB
CoffeeScript
95 lines
3.5 KiB
CoffeeScript
CocoView = require 'views/kinds/CocoView'
|
|
template = require 'templates/play/level/control_bar'
|
|
{me} = require 'lib/auth'
|
|
|
|
GameMenuModal = require 'views/game-menu/GameMenuModal'
|
|
RealTimeCollection = require 'collections/RealTimeCollection'
|
|
|
|
module.exports = class ControlBarView extends CocoView
|
|
id: 'control-bar-view'
|
|
template: template
|
|
|
|
subscriptions:
|
|
'bus:player-states-changed': 'onPlayerStatesChanged'
|
|
'real-time-multiplayer:joined-game': 'onJoinedRealTimeMultiplayerGame'
|
|
'real-time-multiplayer:left-game': 'onLeftRealTimeMultiplayerGame'
|
|
|
|
events:
|
|
'click #next-game-button': -> Backbone.Mediator.publish 'level:next-game-pressed', {}
|
|
'click #game-menu-button': 'showGameMenuModal'
|
|
'click': -> Backbone.Mediator.publish 'tome:focus-editor', {}
|
|
'click .home a': 'onClickHome'
|
|
|
|
constructor: (options) ->
|
|
@worldName = options.worldName
|
|
@session = options.session
|
|
@level = options.level
|
|
@spectateGame = options.spectateGame ? false
|
|
super options
|
|
|
|
setBus: (@bus) ->
|
|
|
|
onPlayerStatesChanged: (e) ->
|
|
# TODO: this doesn't fire any more. Replacement?
|
|
return unless @bus is e.bus
|
|
numPlayers = _.keys(e.players).length
|
|
return if numPlayers is @numPlayers
|
|
@numPlayers = numPlayers
|
|
text = 'Multiplayer'
|
|
text += " (#{numPlayers})" if numPlayers > 1
|
|
$('#multiplayer-button', @$el).text(text)
|
|
|
|
getRenderData: (c={}) ->
|
|
super c
|
|
c.worldName = @worldName
|
|
c.multiplayerEnabled = @session.get('multiplayer')
|
|
c.ladderGame = @level.get('type') in ['ladder', 'hero-ladder']
|
|
c.spectateGame = @spectateGame
|
|
@homeViewArgs = [{supermodel: @supermodel}]
|
|
if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder']
|
|
levelID = @level.get('slug').replace /\-tutorial$/, ''
|
|
@homeLink = c.homeLink = '/play/ladder/' + levelID
|
|
@homeViewClass = require 'views/play/ladder/LadderView'
|
|
@homeViewArgs.push levelID
|
|
else if @level.get('type', true) in ['hero', 'hero-coop']
|
|
@homeLink = c.homeLink = '/play'
|
|
@homeViewClass = require 'views/play/WorldMapView'
|
|
# TODO: dynamically figure out which world map to return to
|
|
if @level.get('slug') in ['defense-of-plainswood', 'winding-trail', 'thornbush-farm', 'a-fiery-trap']
|
|
@homeLink += '/forest'
|
|
@homeViewArgs.push 'forest'
|
|
else
|
|
@homeLink = c.homeLink = '/'
|
|
@homeViewClass = require 'views/HomeView'
|
|
c.editorLink = "/editor/level/#{@level.get('slug')}"
|
|
c.multiplayerSession = @multiplayerSession if @multiplayerSession
|
|
c.multiplayerPlayers = @multiplayerPlayers if @multiplayerPlayers
|
|
c.meID = me.id
|
|
c
|
|
|
|
showGameMenuModal: ->
|
|
@openModalView new GameMenuModal level: @level, session: @session, supermodel: @supermodel
|
|
|
|
onClickHome: (e) ->
|
|
e.preventDefault()
|
|
e.stopImmediatePropagation()
|
|
Backbone.Mediator.publish 'router:navigate', route: @homeLink, viewClass: @homeViewClass, viewArgs: @homeViewArgs
|
|
|
|
onJoinedRealTimeMultiplayerGame: (e) ->
|
|
@multiplayerSession = e.session
|
|
@multiplayerPlayers = new RealTimeCollection('multiplayer_level_sessions/' + @multiplayerSession.id + '/players')
|
|
@multiplayerPlayers.on 'add', @onRealTimeMultiplayerPlayerAdded
|
|
@multiplayerPlayers.on 'remove', @onRealTimeMultiplayerPlayerRemoved
|
|
@render()
|
|
|
|
onLeftRealTimeMultiplayerGame: (e) ->
|
|
@multiplayerSession = null
|
|
@multiplayerPlayers.off()
|
|
@multiplayerPlayers = null
|
|
@render()
|
|
|
|
onRealTimeMultiplayerPlayerAdded: (e) =>
|
|
@render() unless @destroyed
|
|
|
|
onRealTimeMultiplayerPlayerRemoved: (e) =>
|
|
@render() unless @destroyed
|