codecombat/app/views/play/level/MultiplayerStatusView.coffee
Matt Lott 35cba4a90d Sync PVP status view and bug fixes
Pvp status view (temp location and UI)
Remove pvp status from control bar
Add game menu param for jumping into a specific tab
Lots of bug fixing and session state cleanup
Does not address problems with executing real-time multiplayer cast
2014-10-31 16:33:43 -07:00

93 lines
3.4 KiB
CoffeeScript

CocoView = require 'views/kinds/CocoView'
template = require 'templates/play/level/multiplayer-status'
{me} = require 'lib/auth'
RealTimeModel = require 'models/RealTimeModel'
RealTimeCollection = require 'collections/RealTimeCollection'
GameMenuModal = require 'views/game-menu/GameMenuModal'
# Real-time Multiplayer ######################################################
#
# This view displays the real-time multiplayer status for the current level.
#
# It performs these actions:
# Multiplayer button into game-menu multiplayer section
# Display number of players waiting for an opponent in this level
# Display number of players current playing a pvp game in this level
# Status for user's current real-time multiplayer session
#
# It monitors these:
# Real-time multiplayer players
# Internal multiplayer status
#
# Real-time state variables:
# @playersCollection - Real-time multiplayer players
module.exports = class MultiplayerStatusView extends CocoView
id: 'multiplayer-status-view'
template: template
subscriptions:
'real-time-multiplayer:player-status': 'onRealTimeMultiplayerPlayerStatus'
events:
'click #multiplayer-button': 'onClickMultiplayerButton'
constructor: (options) ->
super(options)
@session = options.session
@level = options.level
@levelID = options.levelID
@status = ''
@players = {}
@playersCollection = new RealTimeCollection('multiplayer_players/' + @levelID)
@playersCollection.on 'add', @onPlayerAdded
@playersCollection.each (player) => @onPlayerAdded player
destroy: ->
@playersCollection?.off 'add', @onPlayerAdded
player.off 'change', @onPlayerChanged for id, player of @players
super()
getRenderData: ->
c = super()
c.playerCount = @playerCount
c.playersAvailable = @playersCollectionAvailable
c.playersUnavailable = @playersCollectionUnavailable
c.status = @status
c
onRealTimeMultiplayerPlayerStatus: (e) ->
@status = e.status
@render?()
onClickMultiplayerButton: (e) ->
@openModalView new GameMenuModal showTab: 'multiplayer', level: @level, session: @session, supermodel: @supermodel
onPlayerAdded: (player) =>
# console.log 'MultiplayerStatusView onPlayerAdded', player
unless player.id is me.id
@players[player.id] = new RealTimeModel('multiplayer_players/' + @levelID + '/' + player.id)
@players[player.id].on 'change', @onPlayerChanged
@countPlayers player
onPlayerChanged: (player) =>
# console.log 'MultiplayerStatusView onPlayerChanged', player
@countPlayers player
countPlayers: (changedPlayer) =>
# TODO: save this stale hearbeat threshold setting somewhere
staleHeartbeat = new Date()
staleHeartbeat.setMinutes staleHeartbeat.getMinutes() - 3
@playerCount = 0
@playersCollectionAvailable = 0
@playersCollectionUnavailable = 0
@playersCollection.each (player) =>
# Assume changedPlayer is fresher than entry in @playersCollection collection
player = changedPlayer if changedPlayer? and player.id is changedPlayer.id
unless staleHeartbeat >= new Date(player.get('heartbeat'))
@playerCount++
@playersCollectionAvailable++ if player.get('state') is 'available'
@playersCollectionUnavailable++ if player.get('state') is 'unavailable'
# console.log 'MultiplayerStatusView countPlayers', @playerCount, @playersCollectionAvailable, @playersCollectionUnavailable
@render()