Fixed a few issues with real-time multiplayer flags.

This commit is contained in:
Nick Winter 2014-09-04 20:10:04 -07:00
parent b698200cf0
commit d3eb7a7438
6 changed files with 22 additions and 12 deletions

View file

@ -334,7 +334,7 @@ module.exports = class SpriteBoss extends CocoClass
onFlagUpdated: (e) -> onFlagUpdated: (e) ->
return unless e.active return unless e.active
pendingFlag = new FlagSprite @thangTypeFor('Flag'), @createSpriteOptions(thangID: 'Pending Flag ' + Math.random(), color: e.color, team: me.team, isCursor: false, pos: e.pos) pendingFlag = new FlagSprite @thangTypeFor('Flag'), @createSpriteOptions(thangID: 'Pending Flag ' + Math.random(), color: e.color, team: e.team, isCursor: false, pos: e.pos)
@addSprite pendingFlag, pendingFlag.thang.id, @spriteLayers['Floating'] @addSprite pendingFlag, pendingFlag.thang.id, @spriteLayers['Floating']
@pendingFlags.push pendingFlag @pendingFlags.push pendingFlag

View file

@ -5,10 +5,10 @@ module.exports =
session: {type: 'object'} session: {type: 'object'}
'real-time-multiplayer:left-game': c.object {title: 'Multiplayer left game'} 'real-time-multiplayer:left-game': c.object {title: 'Multiplayer left game'}
'real-time-multiplayer:manual-cast': c.object {title: 'Multiplayer manual cast'} 'real-time-multiplayer:manual-cast': c.object {title: 'Multiplayer manual cast'}
'real-time-multiplayer:new-opponent-code': c.object {title: 'Multiplayer new opponent code', required: ['code', 'codeLanguage']}, 'real-time-multiplayer:new-opponent-code': c.object {title: 'Multiplayer new opponent code', required: ['code', 'codeLanguage']},
code: {type: 'object'} code: {type: 'object'}
codeLanguage: {type: 'string'} codeLanguage: {type: 'string'}
team: {type: 'string'}

View file

@ -180,5 +180,5 @@ module.exports = # /app/lib/surface
'surface:remove-selected-flag': c.object {} 'surface:remove-selected-flag': c.object {}
'surface:remove-flag': c.object {required: 'color'}, 'surface:remove-flag': c.object {required: ['color']},
color: {type: 'string'} color: {type: 'string'}

View file

@ -3,6 +3,8 @@ template = require 'templates/play/level/level-flags-view'
{me} = require 'lib/auth' {me} = require 'lib/auth'
RealTimeCollection = require 'collections/RealTimeCollection' RealTimeCollection = require 'collections/RealTimeCollection'
multiplayerFlagDelay = 0.5 # Long, static second delay for now; should be more than enough.
module.exports = class LevelFlagsView extends CocoView module.exports = class LevelFlagsView extends CocoView
id: 'level-flags-view' id: 'level-flags-view'
template: template template: template
@ -54,7 +56,9 @@ module.exports = class LevelFlagsView extends CocoView
onStageMouseDown: (e) -> onStageMouseDown: (e) ->
return unless @flagColor and @realTime return unless @flagColor and @realTime
pos = x: e.worldPos.x, y: e.worldPos.y pos = x: e.worldPos.x, y: e.worldPos.y
flag = player: me.id, team: me.team, color: @flagColor, pos: pos, time: @world.dt * @world.frames.length, active: true delay = if @realTimeFlags then multiplayerFlagDelay else 0
now = @world.dt * @world.frames.length
flag = player: me.id, team: me.team, color: @flagColor, pos: pos, time: now + delay, active: true
@flags[@flagColor] = flag @flags[@flagColor] = flag
@flagHistory.push flag @flagHistory.push flag
@realTimeFlags?.create flag @realTimeFlags?.create flag
@ -67,7 +71,9 @@ module.exports = class LevelFlagsView extends CocoView
onRemoveFlag: (e) -> onRemoveFlag: (e) ->
delete @flags[e.color] delete @flags[e.color]
flag = player: me.id, team: me.team, color: e.color, time: @world.dt * @world.frames.length, active: false delay = if @realTimeFlags then multiplayerFlagDelay else 0
now = @world.dt * @world.frames.length
flag = player: me.id, team: me.team, color: e.color, time: now + delay, active: false
@flagHistory.push flag @flagHistory.push flag
Backbone.Mediator.publish 'level:flag-updated', flag Backbone.Mediator.publish 'level:flag-updated', flag
#console.log e.color, 'deleted at time', flag.time #console.log e.color, 'deleted at time', flag.time
@ -79,6 +85,7 @@ module.exports = class LevelFlagsView extends CocoView
onJoinedMultiplayerGame: (e) -> onJoinedMultiplayerGame: (e) ->
@realTimeFlags = new RealTimeCollection('multiplayer_level_sessions/' + e.session.id + '/flagHistory') @realTimeFlags = new RealTimeCollection('multiplayer_level_sessions/' + e.session.id + '/flagHistory')
@realTimeFlags.on 'add', @onRealTimeMultiplayerFlagAdded @realTimeFlags.on 'add', @onRealTimeMultiplayerFlagAdded
@realTimeFlags.on 'remove', @onRealTimeMultiplayerFlagRemoved
onLeftMultiplayerGame: (e) -> onLeftMultiplayerGame: (e) ->
if @realTimeFlags if @realTimeFlags
@ -98,3 +105,5 @@ module.exports = class LevelFlagsView extends CocoView
active: e.get('active') active: e.get('active')
@flagHistory.push flag @flagHistory.push flag
Backbone.Mediator.publish 'level:flag-updated', flag Backbone.Mediator.publish 'level:flag-updated', flag
onRealTimeMultiplayerFlagRemoved: (e) =>

View file

@ -619,6 +619,7 @@ module.exports = class PlayLevelView extends RootView
myPlayer.set 'code', @session.get('code') myPlayer.set 'code', @session.get('code')
myPlayer.set 'codeLanguage', @session.get('codeLanguage') myPlayer.set 'codeLanguage', @session.get('codeLanguage')
myPlayer.set 'state', 'submitted' myPlayer.set 'state', 'submitted'
myPlayer.set 'team', me.team
else else
console.error 'Did not find my player in onRealTimeMultiplayerCast' console.error 'Did not find my player in onRealTimeMultiplayerCast'
if opponentPlayer if opponentPlayer
@ -636,7 +637,7 @@ module.exports = class PlayLevelView extends RootView
onOpponentSubmitted: (opponentPlayer, myPlayer) => onOpponentSubmitted: (opponentPlayer, myPlayer) =>
# Save opponent's code # Save opponent's code
Backbone.Mediator.publish 'real-time-multiplayer:new-opponent-code', {codeLanguage: opponentPlayer.get('codeLanguage'), code: opponentPlayer.get('code')} Backbone.Mediator.publish 'real-time-multiplayer:new-opponent-code', {codeLanguage: opponentPlayer.get('codeLanguage'), code: opponentPlayer.get('code'), team: opponentPlayer.get('team')}
# I'm ready to rumble # I'm ready to rumble
myPlayer.set 'state', 'ready' myPlayer.set 'state', 'ready'
if opponentPlayer.get('state') is 'ready' if opponentPlayer.get('state') is 'ready'

View file

@ -164,11 +164,11 @@ module.exports = class Spell
false false
onNewOpponentCode: (e) => onNewOpponentCode: (e) =>
return unless @spellKey return unless @spellKey and @canWrite e.team
if e.codeLanguage and e.code if e.codeLanguage and e.code
spellkeyComponents = @spellKey.split '/' [thangSlug, methodSlug] = @spellKey.split '/'
if e.code[spellkeyComponents[0]]?[spellkeyComponents[1]] if opponentCode = e.code[thangSlug]?[methodSlug]
@source = e.code[spellkeyComponents[0]][spellkeyComponents[1]] @source = opponentCode
@updateLanguageAether e.codeLanguage @updateLanguageAether e.codeLanguage
else else
console.error 'Spell onNewOpponentCode did not receive code', e console.error 'Spell onNewOpponentCode did not receive code', e