Fixed #828. Added many other minor refactorings.

This commit is contained in:
Nick Winter 2014-08-27 12:24:03 -07:00
parent d5b1010a47
commit ee9e453896
105 changed files with 911 additions and 1304 deletions

View file

@ -10,7 +10,7 @@ module.exports = class CocoRouter extends Backbone.Router
initialize: ->
# http://nerds.airbnb.com/how-to-add-google-analytics-page-tracking-to-57536
@bind 'route', @_trackPageView
Backbone.Mediator.subscribe 'gapi-loaded', @onGPlusAPILoaded, @
Backbone.Mediator.subscribe 'auth:gplus-api-loaded', @onGPlusAPILoaded, @
Backbone.Mediator.subscribe 'router:navigate', @onNavigate, @
routes:

View file

@ -2,7 +2,7 @@ Backbone.Mediator.setValidationEnabled false
app = require 'application'
channelSchemas =
'app': require './schemas/subscriptions/app'
'auth': require './schemas/subscriptions/auth'
'bus': require './schemas/subscriptions/bus'
'editor': require './schemas/subscriptions/editor'
'errors': require './schemas/subscriptions/errors'
@ -10,8 +10,8 @@ channelSchemas =
'play': require './schemas/subscriptions/play'
'surface': require './schemas/subscriptions/surface'
'tome': require './schemas/subscriptions/tome'
'user': require './schemas/subscriptions/user'
'world': require './schemas/subscriptions/world'
'god': require './schemas/subscriptions/god'
'scripts': require './schemas/subscriptions/scripts'
definitionSchemas =
'bus': require './schemas/definitions/bus'

View file

@ -91,7 +91,7 @@ module.exports = class Angel extends CocoClass
when 'user-code-problem'
Backbone.Mediator.publish 'god:user-code-problem', problem: event.data.problem
when 'world-load-progress-changed'
Backbone.Mediator.publish 'god:world-load-progress-changed', event.data
Backbone.Mediator.publish 'god:world-load-progress-changed', progress: event.data.progress
unless event.data.progress is 1 or @work.preload or @work.headless or @work.synchronous or @deserializationQueue.length or @shared.firstWorld
@worker.postMessage func: 'serializeFramesSoFar' # Stream it!

View file

@ -33,7 +33,7 @@ class Media
class AudioPlayer extends CocoClass
subscriptions:
'play-sound': (e) -> @playInterfaceSound e.trigger, e.volume
'audio-player:play-sound': (e) -> @playInterfaceSound e.trigger, e.volume
constructor: () ->
super()

View file

@ -19,11 +19,7 @@ module.exports = Bus = class Bus extends CocoClass
Bus.activeBuses[@docName] = @
subscriptions:
'level-bus-echo-states': 'onEchoStates'
'me:synced': 'onMeSynced'
onEchoStates: ->
@notifyStateChanges()
'auth:me-synced': 'onMeSynced'
connect: ->
Backbone.Mediator.publish 'bus:connecting', {bus: @}
@ -99,7 +95,7 @@ module.exports = Bus = class Bus extends CocoClass
@onPlayerJoined(snapshot) if player.connected and not wasConnected
Backbone.Mediator.publish('bus:player-states-changed', {states: @players, bus: @})
onMeSynced: =>
onMeSynced: ->
@myConnection?.child('name').set(me.get('name'))
countPlayers: -> _.size(@players)

View file

@ -11,7 +11,7 @@ module.exports = [
scriptPrereqs: ["Introduction"]
}
{
channel: "level-set-playing"
channel: "level:set-playing"
noteChain: []
scriptPrereqs: ["Victory Playback"]
id: "Victory Playback Started"

View file

@ -14,10 +14,9 @@ userPropsToSave =
module.exports = FacebookHandler = class FacebookHandler extends CocoClass
subscriptions:
'facebook-logged-in':'onFacebookLogin'
'facebook-logged-out': 'onFacebookLogout'
'auth:logged-in-with-facebook': 'onFacebookLoggedIn'
onFacebookLogin: (e) =>
onFacebookLoggedIn: (e) ->
# user is logged in also when the page first loads, so check to see
# if we really need to do the lookup
return if not me
@ -30,9 +29,6 @@ module.exports = FacebookHandler = class FacebookHandler extends CocoClass
break
FB.api('/me', @onReceiveMeInfo) if doIt
onFacebookLogout: (e) =>
console.warn('On facebook logout not implemented.')
onReceiveMeInfo: (r) =>
unless r.email
console.error('could not get data, since no email provided')
@ -45,7 +41,7 @@ module.exports = FacebookHandler = class FacebookHandler extends CocoClass
me.set('email', r.email) if r.email
me.set('facebookID', r.id) if r.id
Backbone.Mediator.publish('logging-in-with-facebook')
Backbone.Mediator.publish 'auth:logging-in-with-facebook', {}
window.tracker?.trackEvent 'Facebook Login'
window.tracker?.identify()
me.patch({

View file

@ -23,8 +23,8 @@ module.exports = GPlusHandler = class GPlusHandler extends CocoClass
super()
subscriptions:
'gplus-logged-in':'onGPlusLogin'
'gapi-loaded':'onGPlusLoaded'
'auth:logged-in-with-gplus':'onGPlusLogin'
'auth:gplus-api-loaded':'onGPlusLoaded'
onGPlusLoaded: ->
session_state = null
@ -88,7 +88,7 @@ module.exports = GPlusHandler = class GPlusHandler extends CocoClass
return unless @responsesComplete is 2
return unless me.get('email') and me.get('gplusID')
Backbone.Mediator.publish('logging-in-with-gplus')
Backbone.Mediator.publish 'auth:logging-in-with-gplus', {}
gplusID = me.get('gplusID')
window.tracker?.trackEvent 'Google Login'
window.tracker?.identify()

View file

@ -6,14 +6,14 @@ module.exports = class GitHubHandler extends CocoClass
scopes: 'user:email'
subscriptions:
'github-login': 'commenceGitHubLogin'
'auth:log-in-with-github': 'commenceGitHubLogin'
constructor: ->
super arguments...
@clientID = if application.isProduction() then '9b405bf5fb84590d1f02' else 'fd5c9d34eb171131bc87'
@redirectURI = if application.isProduction() then 'http://codecombat.com/github/auth_callback' else 'http://localhost:3000/github/auth_callback'
commenceGitHubLogin: ->
commenceGitHubLogin: (e) ->
request =
scope: @scopes
client_id: @clientID

View file

@ -127,7 +127,7 @@ module.exports = class God extends CocoClass
when 'debug-value-return'
Backbone.Mediator.publish 'god:debug-value-return', event.data.serialized
when 'debug-world-load-progress-changed'
Backbone.Mediator.publish 'god:debug-world-load-progress-changed', event.data
Backbone.Mediator.publish 'god:debug-world-load-progress-changed', progress: event.data.progress
onNewWorldCreated: (e) ->
@currentUserCodeMap = @filterUserCodeMapWhenFromWorld e.world.userCodeMap

View file

@ -11,6 +11,7 @@ module.exports = class LevelBus extends Bus
subscriptions:
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
'self-wizard:created': 'onSelfWizardCreated'
'tome:editing-began': 'onEditingBegan'
'tome:editing-ended': 'onEditingEnded'
'script:state-changed': 'onScriptStateChanged'
@ -18,8 +19,8 @@ module.exports = class LevelBus extends Bus
'script:reset': 'onScriptReset'
'surface:frame-changed': 'onFrameChanged'
'surface:sprite-selected': 'onSpriteSelected'
'level-set-playing': 'onSetPlaying'
'level-show-victory': 'onVictory'
'level:set-playing': 'onSetPlaying'
'level:show-victory': 'onVictory'
'tome:spell-changed': 'onSpellChanged'
'tome:spell-created': 'onSpellCreated'
'application:idle-changed': 'onIdleChanged'
@ -51,10 +52,12 @@ module.exports = class LevelBus extends Bus
return true unless @session?.get('multiplayer')
super()
onSelfWizardTargetChanged: =>
wizardSprite = @getSelfWizard()
@wizardRef?.child('targetPos').set(wizardSprite?.targetPos or null)
@wizardRef?.child('targetSprite').set(wizardSprite?.targetSprite?.thang.id or null)
onSelfWizardCreated: (e) ->
@selfWizardSprite = e.sprite
onSelfWizardTargetChanged: (e) ->
@wizardRef?.child('targetPos').set(@selfWizardSprite?.targetPos or null)
@wizardRef?.child('targetSprite').set(@selfWizardSprite?.targetSprite?.thang.id or null)
onMeSynced: =>
super()
@ -63,9 +66,8 @@ module.exports = class LevelBus extends Bus
join: ->
super()
@wizardRef = @myConnection.child('wizard')
wizardSprite = @getSelfWizard()
@wizardRef?.child('targetPos').set(wizardSprite?.targetPos or null)
@wizardRef?.child('targetSprite').set(wizardSprite?.targetSprite?.thang.id or null)
@wizardRef?.child('targetPos').set(@selfWizardSprite?.targetPos or null)
@wizardRef?.child('targetSprite').set(@selfWizardSprite?.targetSprite?.thang.id or null)
@wizardRef?.child('wizardColor1').set(me.get('wizardColor1') or 0.0)
disconnect: ->
@ -81,11 +83,6 @@ module.exports = class LevelBus extends Bus
@fireRef.remove()
@onDisconnect.cancel(-> callback?())
getSelfWizard: ->
e = {}
Backbone.Mediator.publish('echo-self-wizard-sprite', e)
return e.payload
# UPDATING FIREBASE AND SESSION
onEditingBegan: -> @wizardRef?.child('editing').set(true)

View file

@ -9,7 +9,7 @@ module.exports = LinkedInHandler = class LinkedInHandler extends CocoClass
super()
subscriptions:
'linkedin-loaded': 'onLinkedInLoaded'
'auth:linkedin-api-loaded': 'onLinkedInLoaded'
onLinkedInLoaded: (e) ->
IN.Event.on IN, 'auth', @onLinkedInAuth

View file

@ -12,7 +12,7 @@ init = ->
me.set 'testGroupNumber', Math.floor(Math.random() * 256)
me.patch()
Backbone.listenTo(me, 'sync', -> Backbone.Mediator.publish('me:synced', {me: me}))
Backbone.listenTo me, 'sync', -> Backbone.Mediator.publish('auth:me-synced', me: me)
module.exports.createUser = (userObject, failure=backboneFailure, nextURL=null) ->
user = new User(userObject)
@ -57,7 +57,7 @@ onSetVolume = (e) ->
me.set('volume', e.volume)
me.save()
Backbone.Mediator.subscribe('level-set-volume', onSetVolume, module.exports)
Backbone.Mediator.subscribe('level:set-volume', onSetVolume, module.exports)
trackFirstArrival = ->
# will have to filter out users who log in with existing accounts separately

View file

@ -15,8 +15,8 @@ module.exports = class DOMScriptModule extends ScriptModule
endNotes: ->
notes = []
notes.push({'channel': 'end-level-highlight-dom'}) if @noteGroup.dom.highlight?
notes.push({'channel': 'level-enable-controls'}) if @noteGroup.dom.lock?
notes.push({'channel': 'level:end-highlight-dom'}) if @noteGroup.dom.highlight?
notes.push({'channel': 'level:enable-controls'}) if @noteGroup.dom.lock?
return notes
skipNotes: ->
@ -28,7 +28,7 @@ module.exports = class DOMScriptModule extends ScriptModule
highlightNote: ->
dom = @noteGroup.dom
note =
channel: 'level-highlight-dom'
channel: 'level:highlight-dom'
event:
selector: dom.highlight.target
delay: dom.highlight.delay
@ -41,7 +41,7 @@ module.exports = class DOMScriptModule extends ScriptModule
focusNote: ->
note =
channel: 'level-focus-dom'
channel: 'level:focus-dom'
event:
selector: @noteGroup.dom.focus
note
@ -51,7 +51,7 @@ module.exports = class DOMScriptModule extends ScriptModule
e.showModal = @noteGroup.dom.showVictory in [true, 'Done Button And Modal']
e.showModal = showModal if showModal?
note =
channel: 'level-show-victory'
channel: 'level:show-victory'
event: e
note
@ -59,8 +59,8 @@ module.exports = class DOMScriptModule extends ScriptModule
event = {}
lock = @noteGroup.dom.lock
event.controls = lock if _.isArray lock # array: subset of controls
channel = if lock then 'level-disable-controls' else 'level-enable-controls'
channel = if lock then 'level:disable-controls' else 'level:enable-controls'
return {channel: channel, event: event}
letterboxNote: ->
return {channel: 'level-set-letterbox', event: {on: @noteGroup.dom.letterbox}}
return {channel: 'level:set-letterbox', event: {on: @noteGroup.dom.letterbox}}

View file

@ -1,31 +0,0 @@
ScriptModule = require './ScriptModule'
module.exports = class GoalsScriptModule extends ScriptModule
@neededFor: (noteGroup) ->
return noteGroup.goals?
startNotes: ->
notes = []
notes.push(@addNote()) if @noteGroup.goals.add?
notes.push(@removeNote()) if @noteGroup.goals.remove?
return notes
endNotes: ->
return []
skipNotes: ->
return @startNotes()
addNote: ->
note =
channel: 'level-add-goals'
event:
goals: @noteGroup.goals.add
return note
removeNote: ->
note =
channel: 'level-remove-goals'
event:
goals: @noteGroup.goals.remove
return note

View file

@ -25,18 +25,17 @@ module.exports = class PlaybackScriptModule extends ScriptModule
playingNote: ->
note =
channel: 'level-set-playing'
channel: 'level:set-playing'
event: {playing: @noteGroup.playback.playing}
return note
scrubNote: (instant=false) ->
scrub = @noteGroup.playback.scrub
note =
channel: 'level-set-time'
channel: 'level:set-time'
event:
frameOffset: scrub.frameOffset or 2
scrubDuration: if instant then 0 else scrub.duration
note.event.time = scrub.toTime if scrub.toTime?
note.event.ratio = scrub.toRatio if scrub.toRatio?
return note

View file

@ -1,6 +1,3 @@
# * search for how various places handle or call 'end-current-script' event
CocoClass = require 'lib/CocoClass'
CocoView = require 'views/kinds/CocoView'
{scriptMatchesEventPrereqs} = require './../world/script_event_prereqs'
@ -10,8 +7,6 @@ allScriptModules.push(require './SpriteScriptModule')
allScriptModules.push(require './DOMScriptModule')
allScriptModules.push(require './SurfaceScriptModule')
allScriptModules.push(require './PlaybackScriptModule')
GoalScriptsModule = require './GoalsScriptModule'
allScriptModules.push(GoalScriptsModule)
allScriptModules.push(require './SoundScriptModule')
@ -32,16 +27,15 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
originalScripts: [] # use these later when you want to revert to an original state
subscriptions:
'end-current-script': 'onEndNoteGroup'
'end-all-scripts': 'onEndAll'
'script:end-current-script': 'onEndNoteGroup'
'level:started': -> @setWorldLoading(false)
'level:restarted': 'onLevelRestarted'
'level:shift-space-pressed': 'onEndNoteGroup'
'level:escape-pressed': 'onEndAll'
shortcuts:
'⇧+space, space, enter': -> Backbone.Mediator.publish 'level:shift-space-pressed'
'escape': -> Backbone.Mediator.publish 'level:escape-pressed'
'⇧+space, space, enter': -> Backbone.Mediator.publish 'level:shift-space-pressed', {}
'escape': -> Backbone.Mediator.publish 'level:escape-pressed', {}
# SETUP / TEARDOWN
@ -94,13 +88,14 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
scriptStates: scriptStates
timeSinceLastScriptEnded: (if @lastScriptEnded then now - @lastScriptEnded else 0) / 1000
Backbone.Mediator.publish 'script-manager:tick', stateEvent
Backbone.Mediator.publish 'script:tick', stateEvent # Is this even needed?
loadFromSession: ->
# load the queue with note groups to skip through
@addEndedScriptsFromSession()
@addPartiallyEndedScriptFromSession()
@fireGoalNotesEarly()
for noteGroup in @noteGroupQueue
@processNoteGroup(noteGroup)
addPartiallyEndedScriptFromSession: ->
scripts = @session.get('state').scripts
@ -133,14 +128,6 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
noteGroup.skipMe = true for noteGroup in noteChain
@addNoteChain(noteChain, false)
fireGoalNotesEarly: ->
for noteGroup in @noteGroupQueue
@processNoteGroup(noteGroup)
for module in noteGroup.modules
if module instanceof GoalScriptsModule
notes = module.skipNotes()
@processNote(note, noteGroup) for note in notes
setWorldLoading: (@worldLoading) ->
@run() unless @worldLoading
@ -238,7 +225,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
if nextNoteGroup.script.duration
f = => @onNoteGroupTimeout? nextNoteGroup
setTimeout(f, nextNoteGroup.script.duration)
Backbone.Mediator.publish('note-group-started')
Backbone.Mediator.publish 'script:note-group-started', {}
skipAhead: ->
return if @worldLoading
@ -270,7 +257,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
publishNote: (note) ->
Backbone.Mediator.publish 'playback:real-time-playback-ended', {}
Backbone.Mediator.publish(note.channel, note.event)
Backbone.Mediator.publish note.channel, note.event ? {}
# ENDING NOTES
@ -279,7 +266,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@endAll({force:true})
@initProperties()
@resetThings()
Backbone.Mediator.publish 'script:reset'
Backbone.Mediator.publish 'script:reset', {}
@quiet = false
@run()
@ -298,7 +285,7 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
clearTimeout(timeout) for timeout in @currentTimeouts
for module in @currentNoteGroup.modules
@processNote(note, @currentNoteGroup) for note in module.endNotes()
Backbone.Mediator.publish 'note-group-ended' unless @quiet
Backbone.Mediator.publish 'script:note-group-ended' unless @quiet
@scriptInProgress = false
@trackScriptCompletionsFromNoteGroup(@currentNoteGroup)
@currentNoteGroup = null
@ -307,8 +294,8 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@resetThings()
@ending = false
onEndAll: ->
# press escape
onEndAll: (e) ->
# Escape was pressed.
@endAll()
endAll: (options) ->
@ -341,8 +328,8 @@ module.exports = ScriptManager = class ScriptManager extends CocoClass
@run()
resetThings: ->
Backbone.Mediator.publish 'level-enable-controls', {}
Backbone.Mediator.publish 'level-set-letterbox', { on: false }
Backbone.Mediator.publish 'level:enable-controls', {}
Backbone.Mediator.publish 'level:set-letterbox', { on: false }
trackScriptCompletionsFromNoteGroup: (noteGroup) ->
return unless noteGroup.isLast

View file

@ -23,12 +23,12 @@ module.exports = class SoundScriptModule extends ScriptModule
addSuppressSelectionSoundsNote: ->
note =
channel: 'level-suppress-selection-sounds'
channel: 'level:suppress-selection-sounds'
event: {suppress: @noteGroup.sound.suppressSelectionSounds}
return note
addMusicNote: ->
note =
channel: 'level-play-music'
channel: 'music-player:play-music'
event: @noteGroup.sound.music
return note

View file

@ -20,7 +20,7 @@ module.exports = class SpritesScriptModule extends ScriptModule
spriteMoveNote: (sprite, instant=false) ->
duration = if instant then 0 else sprite.move.duration
note =
channel: 'level-sprite-move'
channel: 'sprite:move'
event:
pos: sprite.move.target
duration: duration
@ -41,7 +41,7 @@ module.exports = class SpritesScriptModule extends ScriptModule
blurb = utils.i18n sprite.say, 'blurb'
sound = sprite.say.sound # TODO support sound i18n
note =
channel: 'level-sprite-dialogue'
channel: 'level:sprite-dialogue'
event:
message: text
blurb: blurb
@ -54,7 +54,7 @@ module.exports = class SpritesScriptModule extends ScriptModule
spriteSelectNote: (sprite) ->
note =
channel: 'level-select-sprite'
channel: 'level:select-sprite'
event:
thangID: if sprite.select then sprite.id else null
return note
@ -64,7 +64,7 @@ module.exports = class SpritesScriptModule extends ScriptModule
for sprite in @noteGroup.sprites or []
notes[sprite.id] ?= {}
notes[sprite.id]['move'] = (@spriteMoveNote sprite, true) if sprite.move?
notes[sprite.id]['say'] = { channel: 'level-sprite-clear-dialogue' } if sprite.say?
notes[sprite.id]['say'] = { channel: 'level:sprite-clear-dialogue' } if sprite.say?
noteArray = []
for spriteID of notes
for type of notes[spriteID]

View file

@ -13,7 +13,7 @@ module.exports = class SurfaceScriptModule extends ScriptModule
endNotes: ->
notes = []
notes.push({channel:'level-highlight-sprites', event: {thangIDs: []}}) if @noteGroup.surface.highlight?
notes.push({channel:'sprite:highlight-sprites', event: {thangIDs: []}}) if @noteGroup.surface.highlight?
notes.push(@surfaceCameraNote(true)) if @noteGroup.surface.focus?
notes.push(@surfaceLockSelectNote()) if @noteGroup.surface.lockSelect?
return notes
@ -33,12 +33,12 @@ module.exports = class SurfaceScriptModule extends ScriptModule
e.duration = if focus.duration? then focus.duration else 1500
e.duration = 0 if instant
e.bounds = focus.bounds if focus.bounds?
return { channel: 'level-set-surface-camera', event: e }
return { channel: 'camera:set-camera', event: e }
surfaceHighlightNote: ->
highlight = @noteGroup.surface.highlight
note =
channel: 'level-highlight-sprites'
channel: 'sprite:highlight-sprites'
event:
thangIDs: highlight.targets
delay: highlight.delay
@ -46,4 +46,4 @@ module.exports = class SurfaceScriptModule extends ScriptModule
return note
surfaceLockSelectNote: ->
return { channel: 'level-lock-select', event: {lock: @noteGroup.surface.lockSelect} }
return { channel: 'level:lock-select', event: {lock: @noteGroup.surface.lockSelect} }

View file

@ -8,7 +8,7 @@ module.exports = initializeFacebook = ->
cookie: true # enable cookies to allow the server to access the session
xfbml: true # parse XFBML
Backbone.Mediator.publish 'fbapi-loaded'
Backbone.Mediator.publish 'auth:facebook-api-loaded', {}
# This is fired for any auth related change, such as login, logout or session refresh.
FB.Event.subscribe 'auth.authResponseChange', (response) ->
@ -17,13 +17,12 @@ module.exports = initializeFacebook = ->
if response.status is 'connected'
# They have logged in to the app.
Backbone.Mediator.publish 'facebook-logged-in',
response: response
Backbone.Mediator.publish 'facebook-logged-in', response: response
else if response.status is 'not_authorized'
#
else
#
#
# Load the SDK asynchronously
((d) ->

View file

@ -1,9 +1,9 @@
module.exports = initializeGoogle = ->
window.onGPlusLoaded = ->
Backbone.Mediator.publish 'gapi-loaded'
Backbone.Mediator.publish 'auth:gplus-api-loaded', {}
return
window.signinCallback = (authResult) ->
Backbone.Mediator.publish 'gplus-logged-in', authResult if authResult['access_token']
Backbone.Mediator.publish 'auth:logged-in-with-gplus', authResult if authResult.access_token
return
(->
po = document.createElement('script')

View file

@ -1,7 +1,7 @@
module.exports = initializeLinkedIn = ->
window.linkedInAsyncInit = ->
#console.log 'Linkedin async init success!'
Backbone.Mediator.publish 'linkedin-loaded'
Backbone.Mediator.publish 'auth:linkedin-api-loaded', {}
linkedInSnippet =
''

View file

@ -40,9 +40,9 @@ module.exports = class Camera extends CocoClass
# INIT
subscriptions:
'camera-zoom-in': 'onZoomIn'
'camera-zoom-out': 'onZoomOut'
'camera-zoom-to': 'onZoomTo'
'camera:zoom-in': 'onZoomIn'
'camera:zoom-out': 'onZoomOut'
'camera:zoom-to': 'onZoomTo'
'level:restarted': 'onLevelRestarted'
'surface:mouse-scrolled': 'onMouseScrolled'
'sprite:mouse-down': 'onMouseDown'
@ -187,7 +187,7 @@ module.exports = class Camera extends CocoClass
y: target.y + (@lastPos.y - e.originalEvent.rawY) / @zoom
@zoomTo newPos, @zoom, 0
@lastPos = {x: e.originalEvent.rawX, y: e.originalEvent.rawY}
Backbone.Mediator.publish 'camera:dragged'
Backbone.Mediator.publish 'camera:dragged', {}
onLevelRestarted: ->
@setBounds(@firstBounds, false)
@ -322,5 +322,5 @@ module.exports = class Camera extends CocoClass
createjs.Tween.removeTweens @
super()
onZoomTo: (pos, time) ->
@zoomTo @worldToSurface(pos), @zoom, time
onZoomTo: (e) ->
@zoomTo @worldToSurface(e.pos), @zoom, e.duration

View file

@ -57,11 +57,11 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
currentAction: null # related action that is right now playing
subscriptions:
'level-sprite-dialogue': 'onDialogue'
'level-sprite-clear-dialogue': 'onClearDialogue'
'level-set-letterbox': 'onSetLetterbox'
'level:sprite-dialogue': 'onDialogue'
'level:sprite-clear-dialogue': 'onClearDialogue'
'level:set-letterbox': 'onSetLetterbox'
'surface:ticked': 'onSurfaceTicked'
'level-sprite-move': 'onMove'
'sprite:move': 'onMove'
constructor: (@thangType, options) ->
super()
@ -519,14 +519,11 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@imageObject.on 'pressmove', @onMouseEvent, @, false, 'sprite:dragged'
@imageObject.on 'pressup', @onMouseEvent, @, false, 'sprite:mouse-up'
onSetLetterbox: (e) ->
@letterboxOn = e.on
onMouseEvent: (e, ourEventName) ->
return if @letterboxOn or not @imageObject
p = @imageObject
p = p.parent while p.parent
newEvent = sprite: @, thang: @thang, originalEvent: e, canvas:p.canvas
newEvent = sprite: @, thang: @thang, originalEvent: e, canvas: p.canvas
@trigger ourEventName, newEvent
Backbone.Mediator.publish ourEventName, newEvent
@ -680,7 +677,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
sound = e.sound ? AudioPlayer.soundForDialogue e.message, @thangType.get 'soundTriggers'
@dialogueSoundInstance?.stop()
if @dialogueSoundInstance = @playSound sound, false
@dialogueSoundInstance.addEventListener 'complete', -> Backbone.Mediator.publish 'dialogue-sound-completed'
@dialogueSoundInstance.addEventListener 'complete', -> Backbone.Mediator.publish 'sprite:dialogue-sound-completed', {}
@notifySpeechUpdated e
onClearDialogue: (e) ->
@ -688,6 +685,9 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@dialogueSoundInstance?.stop()
@notifySpeechUpdated {}
onSetLetterbox: (e) ->
@letterboxOn = e.on
setNameLabel: (name) ->
label = @addLabel 'name', Label.STYLE_NAME
label.setText name
@ -750,7 +750,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
distance = @thang.pos.distance target.pos
offset = Math.max(target.width, target.height, 2) / 2 + 3
pos = Vector.add(@thang.pos, heading.multiply(distance - offset))
Backbone.Mediator.publish 'level-sprite-clear-dialogue', {}
Backbone.Mediator.publish 'level:sprite-clear-dialogue', {}
@onClearDialogue()
args = [pos]
args.push(e.duration) if e.duration?

View file

@ -2,7 +2,7 @@ CocoClass = require 'lib/CocoClass'
module.exports = class CoordinateGrid extends CocoClass
subscriptions:
'level-toggle-grid': 'onToggleGrid'
'level:toggle-grid': 'onToggleGrid'
shortcuts:
'ctrl+g, ⌘+g': 'onToggleGrid'

View file

@ -1,7 +1,7 @@
module.exports = class DebugDisplay extends createjs.Container
layerPriority: 20
subscriptions:
'level-set-debug': 'onSetDebug'
'level:set-debug': 'onSetDebug'
constructor: (options) ->
super()

View file

@ -2,9 +2,9 @@ CocoClass = require 'lib/CocoClass'
module.exports = class Dimmer extends CocoClass
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level-highlight-sprites': 'onHighlightSprites'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'sprite:highlight-sprites': 'onHighlightSprites'
'sprite:speech-updated': 'onSpriteSpeechUpdated'
'surface:frame-changed': 'onFrameChanged'
'camera:zoom-updated': 'onZoomUpdated'

View file

@ -4,8 +4,8 @@ CocoSprite = require 'lib/surface/CocoSprite'
module.exports = IndieSprite = class IndieSprite extends CocoSprite
notOfThisWorld: true
subscriptions:
'note-group-started': 'onNoteGroupStarted'
'note-group-ended': 'onNoteGroupEnded'
'script:note-group-started': 'onNoteGroupStarted'
'script:note-group-ended': 'onNoteGroupEnded'
constructor: (thangType, options) ->
options.thang = @makeIndieThang thangType, options

View file

@ -1,6 +1,6 @@
module.exports = class Letterbox extends createjs.Container
subscriptions:
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
constructor: (options) ->
super()

View file

@ -216,7 +216,7 @@ module.exports = class Mark extends CocoClass
onLoadedThangType: ->
@build()
@toggle(@toggleTo) if @toggleTo?
Backbone.Mediator.publish 'sprite:loaded'
Backbone.Mediator.publish 'sprite:loaded', {sprite: @}
update: (pos=null) ->
return false unless @on and @mark

View file

@ -9,7 +9,7 @@ module.exports = class MusicPlayer extends CocoClass
standingBy: null
subscriptions:
'level-play-music': 'onPlayMusic'
'music-player:play-music': 'onPlayMusic'
'audio-player:loaded': 'onAudioLoaded'
constructor: ->

View file

@ -24,10 +24,9 @@ module.exports = class PointChooser extends CocoClass
@shape.layerIndex = 100
onMouseDown: (e) =>
console.log 'got stagemousedown', e, key.shift
return unless key.shift
@setPoint @options.camera.screenToWorld {x: e.stageX, y: e.stageY}
Backbone.Mediator.publish 'choose-point', point: @point
Backbone.Mediator.publish 'surface:choose-point', point: @point
updateShape: ->
sup = @options.camera.worldToSurface @point

View file

@ -27,7 +27,7 @@ module.exports = class RegionChooser extends CocoClass
onMouseUp: (e) =>
return unless @firstPoint
Backbone.Mediator.publish 'choose-region', points: [@firstPoint, @secondPoint]
Backbone.Mediator.publish 'surface:choose-region', points: [@firstPoint, @secondPoint]
@firstPoint = null
@secondPoint = null
@options.camera.dragDisabled = false

View file

@ -12,12 +12,12 @@ module.exports = class SpriteBoss extends CocoClass
subscriptions:
'bus:player-joined': 'onPlayerJoined'
'bus:player-left': 'onPlayerLeft'
'level-set-debug': 'onSetDebug'
'level-highlight-sprites': 'onHighlightSprites'
'level:set-debug': 'onSetDebug'
'sprite:highlight-sprites': 'onHighlightSprites'
'surface:stage-mouse-down': 'onStageMouseDown'
'level-select-sprite': 'onSelectSprite'
'level-suppress-selection-sounds': 'onSuppressSelectionSounds'
'level-lock-select': 'onSetLockSelect'
'level:select-sprite': 'onSelectSprite'
'level:suppress-selection-sounds': 'onSuppressSelectionSounds'
'level:lock-select': 'onSetLockSelect'
'level:restarted': 'onLevelRestarted'
'god:new-world-created': 'onNewWorld'
'god:streaming-world-updated': 'onNewWorld'
@ -198,7 +198,7 @@ module.exports = class SpriteBoss extends CocoClass
sprite.setThang thang # make sure Sprite has latest Thang
else
sprite = @addThangToSprites(thang)
Backbone.Mediator.publish 'surface:new-thang-added', thang:thang, sprite:sprite
Backbone.Mediator.publish 'surface:new-thang-added', thang: thang, sprite: sprite
updateCache = updateCache or sprite.imageObject.parent is @spriteLayers['Obstacle']
sprite.playSounds()
item.modifyStats() for item in itemsJustEquipped
@ -319,9 +319,9 @@ module.exports = class SpriteBoss extends CocoClass
if alive and not @suppressSelectionSounds
instance = sprite.playSound 'selected'
if instance?.playState is 'playSucceeded'
Backbone.Mediator.publish 'thang-began-talking', thang: sprite?.thang
Backbone.Mediator.publish 'sprite:thang-began-talking', thang: sprite?.thang
instance.addEventListener 'complete', ->
Backbone.Mediator.publish 'thang-finished-talking', thang: sprite?.thang
Backbone.Mediator.publish 'sprite:thang-finished-talking', thang: sprite?.thang
onFlagColorSelected: (e) ->
@removeSprite @flagCursorSprite if @flagCursorSprite

View file

@ -52,19 +52,19 @@ module.exports = Surface = class Surface extends CocoClass
frameRate: 30 # Best as a divisor of 60, like 15, 30, 60, with RAF_SYNCHED timing.
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level-set-playing': 'onSetPlaying'
'level-set-debug': 'onSetDebug'
'level-toggle-debug': 'onToggleDebug'
'level-toggle-pathfinding': 'onTogglePathFinding'
'level-set-time': 'onSetTime'
'level-set-surface-camera': 'onSetCamera'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'level:set-playing': 'onSetPlaying'
'level:set-debug': 'onSetDebug'
'level:toggle-debug': 'onToggleDebug'
'level:toggle-pathfinding': 'onTogglePathFinding'
'level:set-time': 'onSetTime'
'camera:set-camera': 'onSetCamera'
'level:restarted': 'onLevelRestarted'
'god:new-world-created': 'onNewWorld'
'god:streaming-world-updated': 'onNewWorld'
'tome:cast-spells': 'onCastSpells'
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
'application:idle-changed': 'onIdleChanged'
'camera:zoom-updated': 'onZoomUpdated'
'playback:real-time-playback-started': 'onRealTimePlaybackStarted'
@ -127,7 +127,7 @@ module.exports = Surface = class Surface extends CocoClass
@showLevel()
@updateState true if @loaded
@onFrameChanged()
Backbone.Mediator.publish 'surface:world-set-up'
Backbone.Mediator.publish 'surface:world-set-up', {world: @world}
onTogglePathFinding: (e) ->
e?.preventDefault?()
@ -311,7 +311,6 @@ module.exports = Surface = class Surface extends CocoClass
return if @currentFrame is @lastFrame and not force
progress = @getProgress()
Backbone.Mediator.publish('surface:frame-changed',
type: 'frame-changed'
selectedThang: @spriteBoss.selectedSprite?.thang
progress: progress
frame: @currentFrame
@ -321,11 +320,11 @@ module.exports = Surface = class Surface extends CocoClass
if @lastFrame < @world.frames.length and @currentFrame >= @world.totalFrames - 1
@ended = true
@setPaused true
Backbone.Mediator.publish 'surface:playback-ended'
Backbone.Mediator.publish 'surface:playback-ended', {}
else if @currentFrame < @world.totalFrames and @ended
@ended = false
@setPaused false
Backbone.Mediator.publish 'surface:playback-restarted'
Backbone.Mediator.publish 'surface:playback-restarted', {}
@lastFrame = @currentFrame
@ -368,7 +367,7 @@ module.exports = Surface = class Surface extends CocoClass
# This has a tendency to break scripts that are waiting for playback to change when the level is loaded
# so only run it after the first world is created.
Backbone.Mediator.publish 'level-set-playing', {playing: true} unless event.firstWorld or @setPlayingCalled
Backbone.Mediator.publish 'level:set-playing', {playing: true} unless event.firstWorld or @setPlayingCalled
@setWorld event.world
@onFrameChanged(true)
@ -450,11 +449,10 @@ module.exports = Surface = class Surface extends CocoClass
@loaded = true
@spriteBoss.createMarks()
@spriteBoss.createIndieSprites @world.indieSprites, @options.wizards
Backbone.Mediator.publish 'registrar-echo-states'
@updateState true
@drawCurrentFrame()
createjs.Ticker.addEventListener 'tick', @tick
Backbone.Mediator.publish 'level:started'
Backbone.Mediator.publish 'level:started', {}
createOpponentWizard: (opponent) ->
@spriteBoss.createOpponentWizard opponent
@ -464,7 +462,7 @@ module.exports = Surface = class Surface extends CocoClass
onToggleDebug: (e) ->
e?.preventDefault?()
Backbone.Mediator.publish 'level-set-debug', {debug: not @debug}
Backbone.Mediator.publish 'level:set-debug', {debug: not @debug}
onSetDebug: (e) ->
return if e.debug is @debug
@ -488,6 +486,7 @@ module.exports = Surface = class Surface extends CocoClass
onMouseUp: (e) =>
return if @disabled
console.log 'yo on mouse up', e
onBackground = not @stage.hitTest e.stageX, e.stageY
Backbone.Mediator.publish 'surface:stage-mouse-up', onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e

View file

@ -16,10 +16,9 @@ module.exports = class WizardSprite extends IndieSprite
subscriptions:
'bus:player-states-changed': 'onPlayerStatesChanged'
'me:synced': 'onMeSynced'
'auth:me-synced': 'onMeSynced'
'surface:sprite-selected': 'onSpriteSelected'
'echo-self-wizard-sprite': 'onEchoSelfWizardSprite'
'echo-all-wizard-sprites': 'onEchoAllWizardSprites'
'sprite:echo-all-wizard-sprites': 'onEchoAllWizardSprites'
shortcuts:
'up': 'onMoveKey'
@ -36,6 +35,7 @@ module.exports = class WizardSprite extends IndieSprite
@setNameLabel me.displayName()
else if options.name
@setNameLabel options.name
Backbone.Mediator.publish 'self-wizard:created', sprite: @
makeIndieThang: (thangType, options) ->
thang = super thangType, options
@ -112,7 +112,6 @@ module.exports = class WizardSprite extends IndieSprite
@targetPos = @getPosFromTarget(@targetSprite or targetPos)
@endMoveTween()
onEchoSelfWizardSprite: (e) -> e.payload = @ if @isSelf
onEchoAllWizardSprites: (e) -> e.payload.push @
defaultPos: -> x: 35, y: 24, z: @thang.depth / 2 + @thang.bobHeight
move: (pos, duration) -> @setTarget(pos, duration)
@ -132,7 +131,7 @@ module.exports = class WizardSprite extends IndieSprite
@targetPos = @boundWizard targetPos
@beginMoveTween(duration, isLinear)
@shoveOtherWizards()
Backbone.Mediator.publish('self-wizard:target-changed', {sender: @}) if @isSelf
Backbone.Mediator.publish('self-wizard:target-changed', {sprite: @}) if @isSelf
boundWizard: (target) ->
# Passed an {x, y} in world coordinates, returns {x, y} within world bounds
@ -179,7 +178,7 @@ module.exports = class WizardSprite extends IndieSprite
shoveOtherWizards: (removeMe) ->
return unless @targetSprite
allWizards = []
Backbone.Mediator.publish('echo-all-wizard-sprites', {payload: allWizards})
Backbone.Mediator.publish 'sprite:echo-all-wizard-sprites', payload: allWizards
allOfUs = (wizard for wizard in allWizards when wizard.targetSprite is @targetSprite)
allOfUs = (wizard for wizard in allOfUs when wizard isnt @) if removeMe
@ -271,4 +270,4 @@ module.exports = class WizardSprite extends IndieSprite
position = {x: @targetPos.x + x, y: @targetPos.y + y}
@setTarget(position, interval, true)
@updatePosition()
Backbone.Mediator.publish 'camera-zoom-to', position, interval
Backbone.Mediator.publish 'camera:zoom-to', pos: position, duration: interval

View file

@ -312,7 +312,7 @@ class CocoModel extends Backbone.Model
achievements = new NewAchievementCollection
achievements.fetch
success: (collection) ->
me.fetch (success: -> Backbone.Mediator.publish('achievements:new', collection)) unless _.isEmpty(collection.models)
me.fetch (success: -> Backbone.Mediator.publish('achievements:new', earnedAchievements: collection)) unless _.isEmpty(collection.models)
error: ->
console.error 'Miserably failed to fetch unnotified achievements', arguments

View file

@ -65,7 +65,7 @@ GoalSchema = c.object {title: 'Goal', description: 'A goal that the player can a
ResponseSchema = c.object {title: 'Dialogue Button', description: 'A button to be shown to the user with the dialogue.', required: ['text']},
text: {title: 'Title', description: 'The text that will be on the button', 'default': 'Okay', type: 'string', maxLength: 30}
channel: c.shortString(title: 'Channel', format: 'event-channel', description: 'Channel that this event will be broadcast over, like "level-set-playing".')
channel: c.shortString(title: 'Channel', format: 'event-channel', description: 'Channel that this event will be broadcast over, like "level:set-playing".')
event: {type: 'object', title: 'Event', description: 'Event that will be broadcast when this button is pressed, like {playing: true}.'}
buttonClass: c.shortString(title: 'Button Class', description: 'CSS class that will be added to the button, like "btn-primary".')
i18n: {type: 'object', format: 'i18n', props: ['text'], description: 'Help translate this button'}

View file

@ -1,45 +0,0 @@
module.exports =
'application: idle-changed':
{} # TODO schema
'fbapi-loaded':
{} # TODO schema
'logging-in-with-facebook':
{} # TODO schema
'facebook-logged-in':
title: 'Facebook logged in'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when you successfully logged in with facebook'
type: 'object'
properties:
response:
type: 'object'
properties:
status: {type: 'string'}
authResponse:
type: 'object'
properties:
accessToken: {type: 'string'}
expiresIn: {type: 'number'}
signedRequest: {type: 'string'}
userID: {type: 'string'}
required: ['response']
'facebook-logged-out': {}
'linkedin-loaded': {}
'gapi-loaded':
{} # TODO schema
'logging-in-with-gplus':
{} # TODO schema
'gplus-logged-in':
title: 'G+ logged in'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when you successfully logged in with G+'
type: 'object'
required: ['access_token']

View file

@ -0,0 +1,39 @@
c = require 'schemas/schemas'
module.exports =
'auth:me-synced': c.object {required: ['me']},
me: {type: 'object'}
'auth:facebook-api-loaded': c.object {}
'auth:logging-in-with-facebook': c.object {}
'auth:logged-in-with-facebook': c.object {title: 'Facebook logged in', description: 'Published when you successfully logged in with Facebook', required: ['response']},
response:
type: 'object'
properties:
status: {type: 'string'}
authResponse:
type: 'object'
properties:
accessToken: {type: 'string'}
expiresIn: {type: 'number'}
signedRequest: {type: 'string'}
userID: {type: 'string'}
'auth:linkedin-api-loaded': c.object {}
'auth:gplus-api-loaded': c.object {}
'auth:logging-in-with-gplus': c.object {}
'auth:logged-in-with-gplus':
title: 'G+ logged in'
description: 'Published when you successfully logged in with G+'
type: 'object'
required: ['access_token']
properties:
access_token: {type: 'string'}
# Could be some other stuff
'auth:log-in-with-github': c.object {}

View file

@ -1,71 +1,27 @@
c = require 'schemas/schemas'
module.exports =
'bus:connecting':
title: 'Bus Connecting'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when a Bus starts connecting'
type: 'object'
properties:
bus:
$ref: 'bus'
'bus:connecting': c.object {title: 'Bus Connecting', description: 'Published when a Bus starts connecting'},
bus: {$ref: 'bus'}
'bus:connected':
title: 'Bus Connected'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when a Bus has connected'
type: 'object'
properties:
bus:
$ref: 'bus'
'bus:connected': c.object {title: 'Bus Connected', description: 'Published when a Bus has connected'},
bus: {$ref: 'bus'}
'bus:disconnected':
title: 'Bus Disconnected'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when a Bus has disconnected'
type: 'object'
properties:
bus:
$ref: 'bus'
'bus:disconnected': c.object {title: 'Bus Disconnected', description: 'Published when a Bus has disconnected'},
bus: {$ref: 'bus'}
'bus:new-message':
title: 'Message sent'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'A new message was sent'
type: 'object'
properties:
message:
type: 'object'
bus:
$ref: 'bus'
'bus:new-message': c.object {title: 'Message sent', description: 'A new message was sent'},
message: {type: 'object'}
bus: {$ref: 'bus'}
'bus:player-joined':
title: 'Player joined'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'A new player has joined'
type: 'object'
properties:
player:
type: 'object'
bus:
$ref: 'bus'
'bus:player-joined': c.object {title: 'Player joined', description: 'A new player has joined'},
player: {type: 'object'}
bus: {$ref: 'bus'}
'bus:player-left':
title: 'Player left'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'A player has left'
type: 'object'
properties:
player:
type: 'object'
bus:
$ref: 'bus'
'bus:player-left': c.object {title: 'Player left', description: 'A player has left'},
player: {type: 'object'}
bus: {$ref: 'bus'}
'bus:player-states-changed':
title: 'Player state changes'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'State of the players has changed'
type: 'object'
properties:
player:
type: 'array'
bus:
$ref: 'bus'
'bus:player-states-changed': c.object {title: 'Player state changes', description: 'State of the players has changed'},
states: c.array {}, {type: 'object'}
bus: {$ref: 'bus'}

View file

@ -1,78 +1,43 @@
c = require 'schemas/schemas'
module.exports =
'save-new-version':
title: 'Save New Version'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when a version gets saved'
type: 'object'
properties:
major:
type: 'boolean'
commitMessage:
type: 'string'
required: ['major', 'commitMessage']
additionalProperties: false
'editor:save-new-version': c.object {title: 'Save New Version', description: 'Published when a version gets saved', required: ['major', 'commitMessage']},
major: {type: 'boolean'}
commitMessage: {type: 'string'}
# TODO all these events starting with 'level:' should have 'editor' in their name
# to avoid confusion with level play events
'editor:view-switched': c.object {title: 'Level View Switched', description: 'Published whenever the view switches'}
'level:view-switched':
title: 'Level View Switched'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published whenever the view switches'
$ref: 'jQueryEvent'
'editor:level-component-editing-ended': c.object {required: ['component']},
component: {type: 'object'}
'level-components-changed':
{} # TODO schema
'editor:edit-level-system': c.object {required: ['original', 'majorVersion']},
original: {type: 'string'}
majorVersion: {type: 'integer', minimum: 0}
'edit-level-component':
{} # TODO schema
'editor:level-system-added': c.object {required: ['system']},
system: {type: 'object'}
'level-component-edited':
{} # TODO schema
'editor:level-system-editing-ended': c.object {required: ['system']},
system: {type: 'object'}
'level-component-editing-ended':
{} # TODO schema
'editor:edit-level-thang': c.object {required: ['thangID']},
thangID: {type: 'string'}
'level-systems-changed':
{} # TODO schema
'editor:level-thang-edited': c.object {required: ['thangID', 'thangData']},
thangID: {type: 'string'}
thangData: {type: 'object'}
'edit-level-system':
{} # TODO schema
'editor:level-thang-done-editing': c.object {}
'level-system-added':
{} # TODO schema
'editor:level-loaded': c.object {required: ['level']},
level: {type: 'object'}
'level-system-edited':
{} # TODO schema
'level:reload-from-data': c.object {required: ['level', 'supermodel']},
level: {type: 'object'}
supermodel: {type: 'object'}
'level-system-editing-ended':
{} # TODO schema
'level:reload-thang-type': c.object {required: ['thangType']},
thangType: {type: 'object'}
'level-thangs-changed':
title: 'Level Thangs Changed'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when a Thang changes'
type: 'object'
properties:
thangsData:
type: 'array'
required: ['thangsData']
additionalProperties: false
'edit-level-thang':
{} # TODO schema
'level-thang-edited':
{} # TODO schema
'level-thang-done-editing':
{} # TODO schema
'level-loaded':
{} # TODO schema
'level-reload-from-data':
{} # TODO schema
'save-new-version':
{} # TODO schema
'editor:random-terrain-generated': c.object {required: ['thangs']},
thangs: c.array {}, {type: 'object'}

View file

@ -1,4 +1,6 @@
c = require 'schemas/schemas'
module.exports =
# app/lib/errors
'server-error':
{} # TODO schema
'errors:server-error': c.object {required: ['response']},
response: {type: 'object'}

View file

@ -0,0 +1,53 @@
c = require 'schemas/schemas'
goalStatesSchema =
type: 'object'
additionalProperties:
type: 'object'
required: ['status']
properties:
status:
oneOf: [
{type: 'null'}
{type: 'string', enum: ['success', 'failure', 'incomplete']}
]
keyFrame:
oneOf: [
{type: 'integer', minimum: 0}
{type: 'string', enum: ['end']}
]
team: {type: ['null', 'string']}
worldUpdatedEventSchema = c.object {required: ['world', 'firstWorld', 'goalStates', 'team', 'firstChangedFrame']},
world: {type: 'object'}
firstWorld: {type: 'boolean'}
goalStates: goalStatesSchema
team: {type: 'string'}
firstChangedFrame: {type: 'integer', minimum: 0}
module.exports =
'god:user-code-problem': c.object {required: ['problem']},
problem: {type: 'object'}
'god:non-user-code-problem': c.object {required: ['problem']},
problem: {type: 'object'}
'god:infinite-loop': c.object {required: ['firstWorld']},
firstWorld: {type: 'boolean'}
'god:new-world-created': worldUpdatedEventSchema
'god:streaming-world-updated': worldUpdatedEventSchema
'god:goals-calculated': c.object {required: ['goalStates']},
goalStates: goalStatesSchema
'god:world-load-progress-changed': c.object {required: ['progress']},
progress: {type: 'number', minimum: 0, maximum: 1}
'god:debug-world-load-progress-changed': c.object {required: ['progress']},
progress: {type: 'number', minimum: 0, maximum: 1}
'god:debug-value-return': c.object {required: ['key']},
key: {type: 'string'}
value: {type: 'any'}

View file

@ -1,23 +1,29 @@
c = require 'schemas/schemas'
module.exports =
'audio-played:loaded':
{} # TODO schema
'application:idle-changed': c.object {},
idle: {type: 'boolean'}
# TODO location is debatable
'note-group-started':
{} # TODO schema
'audio-player:loaded': c.object {required: ['sender']},
sender: {type: 'object'}
'note-group-ended':
{} # TODO schema
'audio-player:play-sound': c.object {required: ['trigger']},
trigger: {type: 'string'}
volume: {type: 'number', minimum: 0, maximum: 1}
'modal-opened':
{} # TODO schema
'music-player:play-music': c.object {required: ['play']},
play: {type: 'boolean'}
file: {type: 'string'}
'modal-closed':
{} # TODO schema
'modal:opened': c.object {}
# TODO I propose prepending 'modal:'
'save-new-version':
{} # TODO schema
'modal:closed': c.object {}
'router:navigate':
{} # TODO schema
'router:navigate': c.object {required: ['route']},
route: {type: 'string'}
view: {type: 'object'}
viewClass: {type: 'object'}
viewArgs: {type: 'array'}
'achievements:new': c.object {required: 'earnedAchievements'},
earnedAchievements: {type: 'object'}

View file

@ -1,203 +1,153 @@
c = require 'schemas/schemas'
module.exports =
# TODO There should be a better way to divide these channels into smaller ones
# TODO location is debatable
'echo-self-wizard-sprite':
{} # TODO schema
'level:session-will-save': c.object {required: ['session']},
session: {type: 'object'}
'level:session-will-save':
{} # TODO schema
'level:shift-space-pressed': c.object {}
'level-loader:progress-changed':
{} # TODO schema
'level:escape-pressed': c.object {}
'level:shift-space-pressed':
{} # TODO schema
'level:enable-controls': c.object {},
controls: c.array {},
c.shortString()
'level:escape-pressed':
{} # TODO schema
'level:disable-controls': c.object {},
controls: c.array {},
c.shortString()
'level-enable-controls':
{} # TODO schema
'level-set-letterbox':
{} # TODO schema
'level:set-letterbox': c.object {},
on: {type: 'boolean'}
'level:started':
{} # TODO schema
'level:started': c.object {}
'level-set-debug':
{} # TODO schema
'level:set-debug': c.object {required: ['debug']},
debug: {type: 'boolean'}
'level:restarted':
{} # TODO schema
'level:restart': c.object {}
'level-set-volume':
{} # TODO schema
'level:restarted': c.object {}
'level-set-time':
{} # TODO schema
'level:set-volume': c.object {required: ['volume']},
volume: {type: 'number', minimum: 0, maximum: 1}
'level-select-sprite':
{} # TODO schema
'level:set-time': c.object {},
time: {type: 'number', minimum: 0}
ratio: {type: 'number', minimum: 0, maximum: 1}
frameOffset: {type: 'integer'}
scrubDuration: {type: 'integer', minimum: 0}
'level-set-playing':
{} # TODO schema
'level:select-sprite': c.object {},
thangID: {type: ['string', 'null', 'undefined']}
spellName: {type: ['string', 'null', 'undefined']}
'level:team-set':
{} # TODO schema
'level:set-playing': c.object {required: ['playing']},
playing: {type: 'boolean'}
'level:docs-shown': {}
'level:team-set': c.object {required: ['team']},
team: c.shortString()
'level:docs-hidden': {}
'level:docs-shown': c.object {}
'level:victory-hidden':
{} # TODO schema
'level:docs-hidden': c.object {}
'level:flag-color-selected':
type: 'object'
additionalProperties: false
properties:
color:
oneOf: [
{type: 'null'}
{type: 'string', enum: ['green', 'black', 'violet'], description: 'The flag color to place next, or omitted/null if deselected.'}
]
pos:
'level:flag-color-selected': c.object {},
color:
oneOf: [
{type: 'null'}
{type: 'string', enum: ['green', 'black', 'violet'], description: 'The flag color to place next, or omitted/null if deselected.'}
]
pos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'level:flag-updated': c.object {required: ['player', 'color', 'time', 'active']},
player: {type: 'string'}
team: {type: 'string'}
color: {type: 'string', enum: ['green', 'black', 'violet']}
time: {type: 'number', minimum: 0}
active: {type: 'boolean'}
pos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'level:next-game-pressed': c.object {}
'level:loading-view-unveiled': c.object {required: ['view']},
view: {type: 'object'}
'playback:manually-scrubbed': c.object {required: ['ratio']},
ratio: {type: 'number', minimum: 0, maximum: 1}
'playback:stop-real-time-playback': c.object {}
'playback:real-time-playback-started': c.object {}
'playback:real-time-playback-ended': c.object {}
'level:play-next-level': c.object {}
'level:toggle-playing': c.object {}
'level:toggle-grid': c.object {}
'level:toggle-debug': c.object {}
'level:toggle-pathfinding': c.object {}
'level:scrub-forward': c.object {}
'level:scrub-back': c.object {}
'level:show-victory': c.object {required: ['showModal']},
showModal: {type: 'boolean'}
'level:highlight-dom': c.object {required: ['selector']},
selector: {type: 'string'}
delay: {type: 'number'}
sides: {type: 'array', items: {'enum': ['left', 'right', 'top', 'bottom']}}
offset: {type: 'object'}
rotation: {type: 'number'}
'level:end-highlight-dom': c.object {}
'level:focus-dom': c.object {},
selector: {type: 'string'}
'level:lock-select': c.object {},
lock: {type: ['boolean', 'array']}
'level:suppress-selection-sounds': c.object {required: ['suppress']},
suppress: {type: 'boolean'}
'goal-manager:new-goal-states': c.object {required: ['goalStates', 'goals', 'overallStatus', 'timedOut']},
goalStates:
type: 'object'
additionalProperties:
type: 'object'
additionalProperties: false
required: ['x', 'y']
required: ['status']
properties:
x: {type: 'number'}
y: {type: 'number'}
status:
oneOf: [
{type: 'null'}
{type: 'string', enum: ['success', 'failure', 'incomplete']}
]
keyFrame:
oneOf: [
{type: 'integer', minimum: 0}
{type: 'string', enum: ['end']}
]
team: {type: ['null', 'string']}
goals: c.array {},
{type: 'object'}
overallStatus:
oneOf: [
{type: 'null'}
{type: 'string', enum: ['success', 'failure', 'incomplete']}
]
timedOut: {type: 'boolean'}
'level:flag-updated':
type: 'object'
additionalProperties: false
required: ['player', 'color', 'time', 'active']
properties:
player:
type: 'string'
team:
type: 'string'
color:
type: 'string'
enum: ['green', 'black', 'violet']
time:
type: 'number'
minimum: 0
active:
type: 'boolean'
pos:
type: 'object'
additionalProperties: false
required: ['x', 'y']
properties:
x: {type: 'number'}
y: {type: 'number'}
'next-game-pressed':
{} # TODO schema
'end-current-script':
{} # TODO schema
'script:reset':
{} # TODO schema
'script:ended':
{} # TODO schema
'end-all-scripts': {}
'script:state-changed':
{} # TODO schema
'script-manager:tick':
type: 'object'
additionalProperties: false
properties:
scriptRunning: {type: 'string'}
noteGroupRunning: {type: 'string'}
timeSinceLastScriptEnded: {type: 'number'}
scriptStates:
type: 'object'
additionalProperties:
title: 'Script State'
type: 'object'
additionalProperties: false
properties:
timeSinceLastEnded:
type: 'number'
description: 'seconds since this script ended last'
timeSinceLastTriggered:
type: 'number'
description: 'seconds since this script was triggered last'
'play-sound':
{} # TODO schema
# TODO refactor name
'onLoadingViewUnveiled':
{} # TODO schema
'playback:manually-scrubbed':
{} # TODO schema
'playback:stop-real-time-playback':
type: 'object'
additionalProperties: false
'playback:real-time-playback-started':
type: 'object'
additionalProperties: false
'playback:real-time-playback-ended':
type: 'object'
additionalProperties: false
'change:editor-config':
{} # TODO schema
'restart-level':
{} # TODO schema
'play-next-level':
{} # TODO schema
'level-select-sprite':
{} # TODO schema
'level-toggle-grid':
{} # TODO schema
'level-toggle-debug':
{} # TODO schema
'level-toggle-pathfinding':
{} # TODO schema
'level-scrub-forward':
{} # TODO schema
'level-scrub-back':
{} # TODO schema
'level-show-victory':
type: 'object'
additionalProperties: false
properties:
showModal: {type: 'boolean'}
'level-highlight-dom':
type: 'object'
additionalProperties: false
properties:
selector: {type: 'string'}
delay: {type: 'number'}
sides: {type: 'array', items: {'enum': ['left', 'right', 'top', 'bottom']}}
offset: {type: 'object'}
rotation: {type: 'number'}
'goal-manager:new-goal-states':
{} # TODO schema
'level:edit-wizard-settings': c.object {}

View file

@ -0,0 +1,27 @@
c = require 'schemas/schemas'
module.exports =
'script:end-current-script': c.object {}
'script:reset': c.object {}
'script:ended': c.object {required: ['scriptID']},
scriptID: {type: 'string'}
'script:state-changed': c.object {required: ['currentScript', 'currentScriptOffset']},
currentScript: {type: ['string', 'null']}
currentScriptOffset: {type: 'integer', minimum: 0}
'script:tick': c.object {required: ['scriptRunning', 'noteGroupRunning', 'scriptStates', 'timeSinceLastScriptEnded']},
scriptRunning: {type: 'string'}
noteGroupRunning: {type: 'string'}
timeSinceLastScriptEnded: {type: 'number'}
scriptStates:
type: 'object'
additionalProperties: c.object {title: 'Script State'},
timeSinceLastEnded: {type: 'number', minimum: 0, description: 'seconds since this script ended last'}
timeSinceLastTriggered: {type: 'number', minimum: 0, description: 'seconds since this script was triggered last'}
'script:note-group-started': c.object {}
'script:note-group-ended': c.object {}

View file

@ -1,108 +1,180 @@
c = require 'schemas/schemas'
spriteMouseEventSchema = c.object {required: ['sprite', 'thang', 'originalEvent', 'canvas']},
sprite: {type: 'object'}
thang: {type: 'object'}
originalEvent: {type: 'object'}
canvas: {type: 'object'}
module.exports = # /app/lib/surface
'camera-dragged':
{} # TODO schema
'camera:dragged': c.object {}
'camera-zoom-in':
{} # TODO schema
'camera:zoom-in': c.object {}
'camera-zoom-out':
{} # TODO schema
'camera:zoom-out': c.object {}
'camera-zoom-to':
{} # TODO schema
'camera:zoom-to': c.object {required: ['pos']},
pos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
duration: {type: 'number', minimum: 0}
'camera:zoom-updated':
{} # TODO schema
'camera:zoom-updated': c.object {required: ['camera', 'zoom', 'surfaceViewport']},
camera: {type: 'object'}
zoom: {type: 'number', minimum: 0, exclusiveMinimum: true}
surfaceViewport: {type: 'object'}
'sprite:speech-updated':
{} # TODO schema
'camera:set-camera': c.object {},
pos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
thangID: {type: 'string'}
zoom: {type: 'number'}
duration: {type: 'number', minimum: 0}
bounds: c.array {maxItems: 2, minItems: 2},
c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'dialogue-sound-completed':
{} # TODO schema
'sprite:speech-updated': c.object {required: ['sprite', 'thang']},
sprite: {type: 'object'}
thang: {type: 'object'}
blurb: {type: 'string'}
message: {type: 'string'}
mood: {type: 'string'}
responses: {type: 'array'}
spriteID: {type: 'string'}
sound: {type: ['null', 'undefined', 'object']}
'surface:gold-changed':
{} # TODO schema
'level:sprite-dialogue': c.object {required: ['spriteID', 'message']},
blurb: {type: 'string'}
message: {type: 'string'}
mood: {type: 'string'}
responses: {type: 'array'}
spriteID: {type: 'string'}
sound: {type: ['null', 'undefined', 'object']}
'surface:coordinate-selected':
{} # TODO schema
'sprite:dialogue-sound-completed': c.object {}
'surface:coordinates-shown':
{} # TODO schema
'level:sprite-clear-dialogue': c.object {}
'level-sprite-clear-dialogue':
{} # TODO schema
'surface:gold-changed': c.object {required: ['team', 'gold']},
team: {type: 'string'}
gold: {type: 'number'}
goldEarned: {type: 'number'}
'sprite:loaded':
{} # TODO schema
'surface:coordinate-selected': c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'choose-point':
{} # TODO schema
'surface:coordinates-shown': c.object {}
'choose-region':
{} # TODO schema
'sprite:loaded': c.object {},
sprite: {type: 'object'}
'surface:new-thang-added':
{} # TODO schema
'surface:choose-point': c.object {required: ['point']},
point: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'surface:sprite-selected':
{} # TODO schema
'surface:choose-region': c.object {required: ['points']},
points: c.array {minItems: 2, maxItems: 2},
c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'thang-began-talking':
{} # TODO schema
'surface:new-thang-added': c.object {required: ['thang', 'sprite']},
thang: {type: 'object'}
sprite: {type: 'object'}
'thang-finished-talking':
{} # TODO schema
'surface:sprite-selected': c.object {required: ['thang', 'sprite']},
thang: {type: ['object', 'null', 'undefined']}
sprite: {type: ['object', 'null', 'undefined']}
spellName: {type: ['string', 'null', 'undefined']}
originalEvent: {type: ['object', 'null', 'undefined']}
worldPos: {type: ['object', 'null', 'undefined']}
'surface:world-set-up':
{} # TODO schema
'sprite:thang-began-talking': c.object {},
thang: {type: 'object'}
'surface:frame-changed':
{} # TODO schema
'sprite:thang-finished-talking': c.object {},
thang: {type: 'object'}
'surface:playback-ended':
{} # TODO schema
'sprite:highlight-sprites': c.object {},
thangIDs: c.array {}, {type: 'string'}
delay: {type: 'number'}
'surface:playback-restarted':
{} # TODO schema
'sprite:move': c.object {required: ['spriteID', 'pos']},
spriteID: {type: 'string'}
pos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
duration: {type: 'number', minimum: 0}
'level-set-playing':
{} # TODO schema
'sprite:mouse-down': spriteMouseEventSchema
'sprite:clicked': spriteMouseEventSchema
'sprite:double-clicked': spriteMouseEventSchema
'sprite:dragged': spriteMouseEventSchema
'sprite:mouse-up': spriteMouseEventSchema
'registrar-echo-states':
{} # TODO schema
'surface:world-set-up': c.object {},
world: {type: 'object'}
'surface:mouse-moved':
{} # TODO schema
'surface:frame-changed': c.object {required: ['frame', 'world', 'progress']},
frame: {type: 'number', minimum: 0}
world: {type: 'object'}
progress: {type: 'number', minimum: 0, maximum: 1}
selectedThang: {type: ['object', 'null', 'undefined']}
'surface:stage-mouse-down':
{} # TODO schema
'surface:playback-ended': c.object {}
'surface:mouse-scrolled':
{} # TODO schema
'surface:playback-restarted': c.object {}
'surface:ticked':
{} # TODO schema
'surface:mouse-moved': c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
'surface:mouse-over':
{} # TODO schema
'surface:stage-mouse-down': c.object {required: ['onBackground', 'x', 'y', 'originalEvent']},
onBackground: {type: 'boolean'}
x: {type: 'number'}
y: {type: 'number'}
originalEvent: {type: 'object'}
worldPos: {type: ['object', 'null', 'undefined']}
'surface:mouse-out':
{} # TODO schema
'surface:stage-mouse-up': c.object {required: ['onBackground', 'x', 'y', 'originalEvent']},
onBackground: {type: 'boolean'}
x: {type: 'number'}
y: {type: 'number'}
originalEvent: {type: 'object'}
'self-wizard:target-changed':
{} # TODO schema
'surface:mouse-scrolled': c.object {required: ['deltaX', 'deltaY', 'screenPos', 'canvas']},
deltaX: {type: 'number'}
deltaY: {type: 'number'}
screenPos: c.object {required: ['x', 'y']},
x: {type: 'number'}
y: {type: 'number'}
canvas: {type: 'object'}
'echo-all-wizard-sprites':
{} # TODO schema
'surface:ticked': c.object {required: ['dt']},
dt: {type: 'number'}
'surface:flag-appeared':
type: 'object'
additionalProperties: false
required: ['sprite']
properties:
sprite:
type: 'object'
'surface:mouse-over': c.object {}
'surface:remove-selected-flag':
type: 'object'
additionalProperties: false
'surface:mouse-out': c.object {}
'sprite:echo-all-wizard-sprites': c.object {required: ['payload']},
payload: c.array {}, {type: 'object'}
'self-wizard:created': c.object {required: ['sprite']},
sprite: {type: 'object'}
'self-wizard:target-changed': c.object {required: ['sprite']},
sprite: {type: 'object'}
'surface:flag-appeared': c.object {required: ['sprite']},
sprite: {type: 'object'}
'surface:remove-selected-flag': c.object {}
'surface:remove-flag': c.object {required: 'color'},
color: {type: 'string'}

View file

@ -1,277 +1,109 @@
c = require 'schemas/schemas'
module.exports =
"tome:cast-spell":
title: "Cast Spell"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when a spell is cast"
type: ["object", "undefined"]
properties:
spell:
type: "object"
thang:
type: "object"
preload:
type: "boolean"
realTime:
type: "boolean"
required: []
additionalProperties: false
'tome:cast-spell': c.object {title: 'Cast Spell', description: 'Published when a spell is cast', required: ['spell', 'thang', 'preload', 'realTime']},
spell: {type: 'object'}
thang: {type: 'object'}
preload: {type: 'boolean'}
realTime: {type: 'boolean'}
"tome:cast-spells":
title: "Cast Spells"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when spells are cast"
type: ["object", "undefined"]
properties:
spells:
type: "object"
preload:
type: "boolean"
realTime:
type: "boolean"
required: []
additionalProperties: false
'tome:cast-spells': c.object {title: 'Cast Spells', description: 'Published when spells are cast', required: ['spells', 'preload', 'realTime']},
spells: [type: 'object']
preload: [type: 'boolean']
realTime: [type: 'boolean']
"tome:manual-cast":
title: "Manually Cast Spells"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you wish to manually recast all spells"
type: "object"
properties:
realTime:
type: "boolean"
required: []
additionalProperties: false
'tome:manual-cast': c.object {title: 'Manually Cast Spells', description: 'Published when you wish to manually recast all spells', required: []},
realTime: {type: 'boolean'}
"tome:spell-created":
title: "Spell Created"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published after a new spell has been created"
type: "object"
properties:
"spell": "object"
required: ["spell"]
additionalProperties: false
'tome:spell-created': c.object {title: 'Spell Created', description: 'Published after a new spell has been created', required: ['spell']},
spell: {type: 'object'}
"tome:spell-debug-property-hovered":
title: "Spell Debug Property Hovered"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you hover over a spell property"
type: "object"
properties:
"property": "string"
"owner": "string"
required: []
additionalProperties: false
'tome:spell-has-changed-significantly-calculation': c.object {title: 'Has Changed Significantly Calculation', description: 'Let anyone know that the spell has changed significantly.', required: ['hasChangedSignificantly']},
hasChangedSignificantly: {type: 'boolean'}
"tome:toggle-spell-list":
title: "Toggle Spell List"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you toggle the dropdown for a thang's spells"
type: "undefined"
additionalProperties: false
'tome:spell-debug-property-hovered': c.object {title: 'Spell Debug Property Hovered', description: 'Published when you hover over a spell property', required: []},
property: {type: 'string'}
owner: {type: 'string'}
"tome:reload-code":
title: "Reload Code"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you reset a spell to its original source"
type: "object"
properties:
"spell": "object"
required: ["spell"]
additionalProperties: false
'tome:spell-debug-value-request': c.object {title: 'Spell Debug Value Request', description: 'Published when the SpellDebugView wants to retrieve a debug value.', required: ['thangID', 'spellID', 'variableChain', 'frame']},
thangID: {type: 'string'}
spellID: {type: 'string'}
variableChain: c.array {}, {type: 'string'}
frame: {type: 'integer', minimum: 0}
"tome:palette-hovered":
title: "Palette Hovered"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you hover over a Thang in the spell palette"
type: "object"
properties:
"thang": "object"
"prop": "string"
"entry": "object"
required: ["thang", "prop", "entry"]
additionalProperties: false
'tome:toggle-spell-list': c.object {title: 'Toggle Spell List', description: 'Published when you toggle the dropdown for a thang\'s spells'}
"tome:palette-pin-toggled":
title: "Palette Pin Toggled"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you pin or unpin the spell palette"
type: "object"
properties:
"entry": "object"
"pinned": "boolean"
required: ["entry", "pinned"]
additionalProperties: false
'tome:reload-code': c.object {title: 'Reload Code', description: 'Published when you reset a spell to its original source', required: ['spell']},
spell: {type: 'object'}
"tome:palette-clicked":
title: "Palette Clicked"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you click on the spell palette"
type: "object"
properties:
"thang": "object"
"prop": "string"
"entry": "object"
required: ["thang", "prop", "entry"]
additionalProperties: false
'tome:palette-hovered': c.object {title: 'Palette Hovered', description: 'Published when you hover over a Thang in the spell palette', required: ['thang', 'prop', 'entry']},
thang: {type: 'object'}
prop: {type: 'string'}
entry: {type: 'object'}
"tome:spell-statement-index-updated":
title: "Spell Statement Index Updated"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when the spell index is updated"
type: "object"
properties:
"statementIndex": "object"
"ace": "object"
required: ["statementIndex", "ace"]
additionalProperties: false
'tome:palette-pin-toggled': c.object {title: 'Palette Pin Toggled', description: 'Published when you pin or unpin the spell palette', required: ['entry', 'pinned']},
entry: {type: 'object'}
pinned: {type: 'boolean'}
# TODO proposition: refactor 'tome' into spell events
"spell-beautify":
title: "Beautify"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you click the \"beautify\" button"
type: "object"
properties:
"spell": "object"
required: []
additionalProperties: false
'tome:palette-clicked': c.object {title: 'Palette Clicked', description: 'Published when you click on the spell palette', required: ['thang', 'prop', 'entry']},
thang: {type: 'object'}
prop: {type: 'string'}
entry: {type: 'object'}
"spell-step-forward":
title: "Step Forward"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you step forward in time"
type: "undefined"
additionalProperties: false
'tome:spell-statement-index-updated': c.object {title: 'Spell Statement Index Updated', description: 'Published when the spell index is updated', required: ['statementIndex', 'ace']},
statementIndex: {type: 'object'}
ace: {type: 'object'}
"spell-step-backward":
title: "Step Backward"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you step backward in time"
type: "undefined"
additionalProperties: false
'tome:spell-beautify': c.object {title: 'Beautify', description: 'Published when you click the \'beautify\' button', required: []},
spell: {type: 'object'}
"tome:spell-loaded":
title: "Spell Loaded"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when a spell is loaded"
type: "object"
properties:
"spell": "object"
required: ["spell"]
additionalProperties: false
'tome:spell-step-forward': c.object {title: 'Step Forward', description: 'Published when you step forward in time'}
"tome:spell-changed":
title: "Spell Changed"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when a spell is changed"
type: "object"
properties:
"spell": "object"
required: ["spell"]
additionalProperties: false
'tome:spell-step-backward': c.object {title: 'Step Backward', description: 'Published when you step backward in time'}
"tome:editing-began":
title: "Editing Began"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you have begun changing code"
type: "undefined"
additionalProperties: false
'tome:spell-loaded': c.object {title: 'Spell Loaded', description: 'Published when a spell is loaded', required: ['spell']},
spell: {type: 'object'}
"tome:editing-ended":
title: "Editing Ended"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you have stopped changing code"
type: "undefined"
additionalProperties: false
'tome:spell-changed': c.object {title: 'Spell Changed', description: 'Published when a spell is changed', required: ['spell']},
spell: {type: 'object'}
"tome:problems-updated":
title: "Problems Updated"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when problems have been updated"
type: "object"
properties:
"spell": "object"
"problems": "array"
"isCast": "boolean"
required: ["spell", "problems", "isCast"]
additionalProperties: false
'tome:editing-began': c.object {title: 'Editing Began', description: 'Published when you have begun changing code'}
"tome:thang-list-entry-popover-shown":
title: "Thang List Entry Popover Shown"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when we show the popover for a thang in the master list"
type: "object"
properties:
"entry": "object"
required: ["entry"]
additionalProperties: false
'tome:editing-ended': c.object {title: 'Editing Ended', description: 'Published when you have stopped changing code'}
"tome:spell-shown":
title: "Spell Shown"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when we show a spell"
type: "object"
properties:
"thang": "object"
"spell": "object"
required: ["thang", "spell"]
additionalProperties: false
'tome:problems-updated': c.object {title: 'Problems Updated', description: 'Published when problems have been updated', required: ['spell', 'problems', 'isCast']},
spell: {type: 'object'}
problems: {type: 'array'}
isCast: {type: 'boolean'}
'tome:change-language':
title: 'Tome Change Language'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when the Tome should update its programming language.'
type: 'object'
additionalProperties: false
properties:
language:
type: 'string'
required: ['language']
'tome:thang-list-entry-popover-shown': c.object {title: 'Thang List Entry Popover Shown', description: 'Published when we show the popover for a thang in the master list', required: ['entry']},
entry: {type: 'object'}
'tome:spell-changed-language':
title: 'Spell Changed Language'
$schema: 'http://json-schema.org/draft-04/schema#'
description: 'Published when an individual spell has updated its code language.'
type: 'object'
additionalProperties: false
properties:
spell:
type: 'object'
language:
type: 'string'
required: ['spell']
'tome:spell-shown': c.object {title: 'Spell Shown', description: 'Published when we show a spell', required: ['thang', 'spell']},
thang: {type: 'object'}
spell: {type: 'object'}
"tome:comment-my-code":
title: "Comment My Code"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when we comment out a chunk of your code"
type: "undefined"
additionalProperties: false
'tome:change-language': c.object {title: 'Tome Change Language', description: 'Published when the Tome should update its programming language', required: ['language']},
language: {type: 'string'}
"tome:change-config":
title: "Change Config"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when you change your tome settings"
type: "undefined"
additionalProperties: false
'tome:spell-changed-language': c.object {title: 'Spell Changed Language', description: 'Published when an individual spell has updated its code language', required: ['spell']},
spell: {type: 'object'}
language: {type: 'string'}
"tome:update-snippets":
title: "Update Snippets"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when we need to add Zatanna Snippets"
type: "object"
properties:
"propGroups": "object"
"allDocs": "object"
"language": "string"
required: ["propGroups", "allDocs"]
additionalProperties: false
'tome:comment-my-code': c.object {title: 'Comment My Code', description: 'Published when we comment out a chunk of your code'}
# TODO proposition: add tome to name
"focus-editor":
title: "Focus Editor"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published whenever we want to give focus back to the editor"
type: "undefined"
additionalProperties: false
'tome:change-config': c.object {title: 'Change Config', description: 'Published when you change your tome settings'}
'tome:update-snippets': c.object {title: 'Update Snippets', description: 'Published when we need to add Zatanna snippets', required: ['propGroups', 'allDocs']},
propGroups: {type: 'object'}
allDocs: {type: 'object'}
language: {type: 'string'}
'tome:insert-snippet': c.object {title: 'Insert Snippet', description: 'Published when we need to insert a Zatanna snippet', required: ['doc', 'language', 'formatted']},
doc: {type: 'object'}
language: {type: 'string'}
formatted: {type: 'object'}
'tome:focus-editor': c.object {title: 'Focus Editor', description: 'Published whenever we want to give focus back to the editor'}
'tome:fullscreen-view': c.object {title: 'Fullscreen View', description: 'Published when we want to make the Tome take up most of the screen'}

View file

@ -1,9 +0,0 @@
module.exports =
'me:synced':
{} # TODO schema
'user-fetched':
{} # TODO schema
'edit-wizard-settings':
{} # TODO schema

View file

@ -1,18 +0,0 @@
module.exports =
'god:user-code-problem':
{} # TODO schema
'god:infinite-loop':
{} # TODO schema
'god:user-code-problem':
{} # TODO schema
'god:new-world-created':
{} # TODO schema
'god:streaming-world-updated':
{} # TODO schema
'god:world-load-progress-changed':
{} # TODO schema

View file

@ -225,6 +225,14 @@ table.table
.ui-slider-handle
border: 1px solid black !important
// Override jQuery UI widget images that we don't use
.ui-widget-content, .ui-widget-header, .ui-widget-overlay, .ui-widget-shadow
background-image: none
.ui-widget-content, .ui-state-default, .ui-widget-header
.ui-state-default, .ui-state-focus, .ui-state-active, .ui-state-highlight, .ui-state-error
background-image: none
// Fonts
.header-font

View file

@ -15,7 +15,7 @@ module.exports = class ArticleEditView extends RootView
'click #save-button': 'openSaveModal'
subscriptions:
'save-new-version': 'saveNewArticle'
'editor:save-new-version': 'saveNewArticle'
constructor: (options, @articleID) ->
super options
@ -98,4 +98,4 @@ module.exports = class ArticleEditView extends RootView
showVersionHistory: (e) ->
versionHistoryView = new VersionHistoryView article: @article, @articleID
@openModalView versionHistoryView
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}

View file

@ -72,7 +72,7 @@ module.exports = class LevelEditView extends RootView
super()
return unless @supermodel.finished()
@$el.find('a[data-toggle="tab"]').on 'shown.bs.tab', (e) =>
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
@insertSubView new ThangsTabView world: @world, supermodel: @supermodel, level: @level
@insertSubView new SettingsTabView supermodel: @supermodel
@insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files
@ -81,7 +81,7 @@ module.exports = class LevelEditView extends RootView
@insertSubView new RelatedAchievementsView supermodel: @supermodel, level: @level
@insertSubView new ComponentDocsView # Don't give it the supermodel, it'll pollute it!
Backbone.Mediator.publish 'level-loaded', level: @level
Backbone.Mediator.publish 'editor:level-loaded', level: @level
@showReadOnly() if me.get('anonymous')
@patchesView = @insertSubView(new PatchesView(@level), @$el.find('.patches-view'))
@listenTo @patchesView, 'accepted-patch', -> location.reload()
@ -96,7 +96,7 @@ module.exports = class LevelEditView extends RootView
onPlayLevel: (e) ->
team = $(e.target).data('team')
sendLevel = =>
@childWindow.Backbone.Mediator.publish 'level-reload-from-data', level: @level, supermodel: @supermodel
@childWindow.Backbone.Mediator.publish 'level:reload-from-data', level: @level, supermodel: @supermodel
if @childWindow and not @childWindow.closed
# Reset the LevelView's world, but leave the rest of the state alone
sendLevel()
@ -134,20 +134,20 @@ module.exports = class LevelEditView extends RootView
startPatchingLevel: (e) ->
@openModalView new SaveVersionModal({model: @level})
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
startCommittingLevel: (e) ->
@openModalView new SaveLevelModal level: @level, supermodel: @supermodel
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
startForking: (e) ->
@openModalView new ForkModal model: @level, editorPath: 'level'
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
showVersionHistory: (e) ->
versionHistoryView = new VersionHistoryView level: @level, @levelID
@openModalView versionHistoryView
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
toggleWatchLevel: ->
button = @$el.find('#level-watch-button')

View file

@ -14,9 +14,7 @@ module.exports = class ComponentsTabView extends CocoView
className: 'tab-pane'
subscriptions:
'edit-level-component': 'editLevelComponent'
'level-component-edited': 'onLevelComponentEdited'
'level-component-editing-ended': 'onLevelComponentEditingEnded'
'editor:level-component-editing-ended': 'onLevelComponentEditingEnded'
events:
'click #create-new-component-button': 'createNewLevelComponent'
@ -66,14 +64,11 @@ module.exports = class ComponentsTabView extends CocoView
createNewLevelComponent: (e) ->
levelComponentNewView = new LevelComponentNewView supermodel: @supermodel
@openModalView levelComponentNewView
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
editLevelComponent: (e) ->
@levelComponentEditView = @insertSubView new LevelComponentEditView(original: e.original, majorVersion: e.majorVersion, supermodel: @supermodel)
onLevelComponentEdited: (e) ->
Backbone.Mediator.publish 'level-components-changed', {}
onLevelComponentEditingEnded: (e) ->
@removeSubView @levelComponentEditView
@levelComponentEditView = null
@ -90,6 +85,3 @@ class LevelComponentNode extends TreemaObjectNode
m.get('original') is @data.original and m.get('version').major is @data.majorVersion
name = "#{comp.get('system')}.#{comp.get('name')} v#{comp.get('version').major}"
@buildValueForDisplaySimply valEl, "#{name} (#{count})"
onEnterPressed: ->
Backbone.Mediator.publish 'edit-level-component', original: @data.original, majorVersion: @data.majorVersion

View file

@ -64,7 +64,6 @@ module.exports = class LevelComponentEditView extends CocoView
# Make sure it validates first?
for key, value of @componentSettingsTreema.data
@levelComponent.set key, value unless key is 'js' # will compile code if needed
Backbone.Mediator.publish 'level-component-edited', levelComponent: @levelComponent
null
buildConfigSchemaTreema: ->
@ -82,7 +81,6 @@ module.exports = class LevelComponentEditView extends CocoView
onConfigSchemaEdited: =>
@levelComponent.set 'configSchema', @configSchemaTreema.data
Backbone.Mediator.publish 'level-component-edited', levelComponent: @levelComponent
buildCodeEditor: ->
@editor?.destroy()
@ -100,21 +98,20 @@ module.exports = class LevelComponentEditView extends CocoView
onEditorChange: =>
return if @destroyed
@levelComponent.set 'code', @editor.getValue()
Backbone.Mediator.publish 'level-component-edited', levelComponent: @levelComponent
null
endEditing: (e) ->
Backbone.Mediator.publish 'level-component-editing-ended', levelComponent: @levelComponent
Backbone.Mediator.publish 'editor:level-component-editing-ended', component: @levelComponent
null
showVersionHistory: (e) ->
componentVersionsModal = new ComponentVersionsModal {}, @levelComponent.id
@openModalView componentVersionsModal
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
startPatchingComponent: (e) ->
@openModalView new SaveVersionModal({model: @levelComponent})
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
toggleWatchComponent: ->
button = @$el.find('#component-watch-button')

View file

@ -38,5 +38,4 @@ module.exports = class NewLevelComponentModal extends ModalView
forms.applyErrorsToForm(@$el, JSON.parse(res.responseText))
res.success =>
@supermodel.registerModel component
Backbone.Mediator.publish 'edit-level-component', original: component.get('_id'), majorVersion: 0
@hide()

View file

@ -215,9 +215,7 @@ module.exports = class TerrainRandomizeModal extends ModalView
presetType = target.attr 'data-preset-type'
presetSize = target.attr 'data-preset-size'
@randomizeThangs presetType, presetSize
Backbone.Mediator.publish('randomize:terrain-generated',
'thangs': @thangs
)
Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs
@hide()
randomizeThangs: (presetName, presetSize) ->

View file

@ -10,8 +10,8 @@ module.exports = class WorldSelectModal extends ModalView
cache: false
subscriptions:
'choose-region': 'selectionMade'
'choose-point': 'selectionMade'
'surface:choose-region': 'selectionMade'
'surface:choose-point': 'selectionMade'
events:
'click #done-button': 'done'

View file

@ -11,7 +11,7 @@ module.exports = class ScriptsTabView extends CocoView
className: 'tab-pane'
subscriptions:
'level-loaded': 'onLevelLoaded'
'editor:level-loaded': 'onLevelLoaded'
constructor: (options) ->
super options

View file

@ -17,7 +17,7 @@ module.exports = class SettingsTabView extends CocoView
]
subscriptions:
'level-loaded': 'onLevelLoaded'
'editor:level-loaded': 'onLevelLoaded'
constructor: (options) ->
super options

View file

@ -58,7 +58,6 @@ module.exports = class LevelSystemEditView extends CocoView
# Make sure it validates first?
for key, value of @systemSettingsTreema.data
@levelSystem.set key, value unless key is 'js' # will compile code if needed
Backbone.Mediator.publish 'level-system-edited', levelSystem: @levelSystem
null
buildConfigSchemaTreema: ->
@ -76,7 +75,6 @@ module.exports = class LevelSystemEditView extends CocoView
onConfigSchemaEdited: =>
@levelSystem.set 'configSchema', @configSchemaTreema.data
Backbone.Mediator.publish 'level-system-edited', levelSystem: @levelSystem
buildCodeEditor: ->
@editor?.destroy()
@ -93,21 +91,20 @@ module.exports = class LevelSystemEditView extends CocoView
onEditorChange: =>
@levelSystem.set 'code', @editor.getValue()
Backbone.Mediator.publish 'level-system-edited', levelSystem: @levelSystem
null
endEditing: (e) ->
Backbone.Mediator.publish 'level-system-editing-ended', levelSystem: @levelSystem
Backbone.Mediator.publish 'editor:level-system-editing-ended', system: @levelSystem
null
showVersionHistory: (e) ->
systemVersionsModal = new SystemVersionsModal {}, @levelSystem.id
@openModalView systemVersionsModal
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
startPatchingSystem: (e) ->
@openModalView new SaveVersionModal({model: @levelSystem})
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
toggleWatchSystem: ->
console.log 'toggle watch system?'

View file

@ -32,5 +32,5 @@ module.exports = class NewLevelSystemModal extends ModalView
forms.applyErrorsToForm(@$el, JSON.parse(res.responseText))
res.success =>
@supermodel.registerModel system
Backbone.Mediator.publish 'edit-level-system', original: system.get('_id'), majorVersion: 0
Backbone.Mediator.publish 'editor:edit-level-system', original: system.get('_id'), majorVersion: 0
@hide()

View file

@ -13,11 +13,10 @@ module.exports = class SystemsTabView extends CocoView
className: 'tab-pane'
subscriptions:
'level-system-added': 'onLevelSystemAdded'
'edit-level-system': 'editLevelSystem'
'level-system-edited': 'onLevelSystemEdited'
'level-system-editing-ended': 'onLevelSystemEditingEnded'
'level-loaded': 'onLevelLoaded'
'editor:level-system-added': 'onLevelSystemAdded'
'editor:edit-level-system': 'editLevelSystem'
'editor:level-system-editing-ended': 'onLevelSystemEditingEnded'
'editor:level-loaded': 'onLevelLoaded'
events:
'click #add-system-button': 'addLevelSystem'
@ -91,18 +90,15 @@ module.exports = class SystemsTabView extends CocoView
addLevelSystem: (e) ->
@openModalView new AddLevelSystemModal supermodel: @supermodel, extantSystems: _.cloneDeep @systemsTreema.data
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
createNewLevelSystem: (e) ->
@openModalView new NewLevelSystemModal supermodel: @supermodel
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
editLevelSystem: (e) ->
@levelSystemEditView = @insertSubView new LevelSystemEditView(original: e.original, majorVersion: e.majorVersion, supermodel: @supermodel)
onLevelSystemEdited: (e) ->
Backbone.Mediator.publish 'level-systems-changed', systemsData: @systemsTreema.data
onLevelSystemEditingEnded: (e) ->
@removeSubView @levelSystemEditView
@levelSystemEditView = null
@ -150,7 +146,7 @@ class LevelSystemNode extends TreemaObjectNode
onEnterPressed: (e) ->
super e
Backbone.Mediator.publish 'edit-level-system', original: @data.original, majorVersion: @data.majorVersion
Backbone.Mediator.publish 'editor:edit-level-system', original: @data.original, majorVersion: @data.majorVersion
open: (depth) ->
super depth

View file

@ -56,13 +56,10 @@ module.exports = class LevelThangEditView extends CocoView
saveThang: (e) ->
# Make sure it validates first?
event =
thangData: @thangData
id: @oldID
Backbone.Mediator.publish 'level-thang-edited', event
Backbone.Mediator.publish 'editor:level-thang-edited', thangData: @thangData, thangID: @oldID
navigateToAllThangs: ->
Backbone.Mediator.publish 'level-thang-done-editing'
Backbone.Mediator.publish 'editor:level-thang-done-editing', {}
toggleNameEdit: ->
link = @$el.find '#thang-name-link'

View file

@ -34,15 +34,15 @@ module.exports = class ThangsTabView extends CocoView
'surface:mouse-moved': 'onSurfaceMouseMoved'
'surface:mouse-over': 'onSurfaceMouseOver'
'surface:mouse-out': 'onSurfaceMouseOut'
'edit-level-thang': 'editThang'
'level-thang-edited': 'onLevelThangEdited'
'level-thang-done-editing': 'onLevelThangDoneEditing'
'level:view-switched': 'onViewSwitched'
'editor:edit-level-thang': 'editThang'
'editor:level-thang-edited': 'onLevelThangEdited'
'editor:level-thang-done-editing': 'onLevelThangDoneEditing'
'editor:view-switched': 'onViewSwitched'
'sprite:dragged': 'onSpriteDragged'
'sprite:mouse-up': 'onSpriteMouseUp'
'sprite:double-clicked': 'onSpriteDoubleClicked'
'surface:stage-mouse-up': 'onStageMouseUp'
'randomize:terrain-generated': 'onRandomizeTerrain'
'editor:random-terrain-generated': 'onRandomTerrainGenerated'
events:
'click #extant-thangs-filter button': 'onFilterExtantThangs'
@ -232,7 +232,7 @@ module.exports = class ThangsTabView extends CocoView
return unless e.thang
@editThang thangID: e.thang.id
onRandomizeTerrain: (e) ->
onRandomTerrainGenerated: (e) ->
@thangsBatch = []
nonRandomThangs = (thang for thang in @thangsTreema.get('') when not /Random/.test thang.id)
@thangsTreema.set '', nonRandomThangs
@ -402,7 +402,6 @@ module.exports = class ThangsTabView extends CocoView
thang.isSelectable = not thang.isLand for thang in @world.thangs # let us select walls and such
@surface?.setWorld @world
@selectAddThangType @addThangType, @cloneSourceThang if @addThangType # make another addThang sprite, since the World just refreshed
Backbone.Mediator.publish 'level-thangs-changed', thangsData: @thangsTreema.data
null
onTreemaThangSelected: (e, selectedTreemas) =>
@ -449,13 +448,13 @@ module.exports = class ThangsTabView extends CocoView
@editThangView = new LevelThangEditView thangData: thangData, level: @level, world: @world, supermodel: @supermodel # supermodel needed for checkForMissingSystems
@insertSubView @editThangView
@$el.find('.thangs-column').hide()
Backbone.Mediator.publish 'level:view-switched', e
Backbone.Mediator.publish 'editor:view-switched', {}
onLevelThangEdited: (e) ->
newThang = e.thangData
@thangsTreema.set "id=#{e.id}", newThang
@thangsTreema.set "id=#{e.thangID}", newThang
onLevelThangDoneEditing: ->
onLevelThangDoneEditing: (e) ->
@removeSubView @editThangView
@editThangView = null
@onThangsChanged()
@ -530,4 +529,4 @@ class ThangNode extends TreemaObjectNode
@buildValueForDisplaySimply valEl, s
onEnterPressed: ->
Backbone.Mediator.publish 'edit-level-thang', thangID: @data.id
Backbone.Mediator.publish 'editor:edit-level-thang', thangID: @data.id

View file

@ -44,7 +44,7 @@ module.exports = class ThangTypeEditView extends RootView
'keyup .play-with-level-input': 'onPlayLevelKeyUp'
subscriptions:
'save-new-version': 'saveNewThangType'
'editor:save-new-version': 'saveNewThangType'
# init / render
@ -438,7 +438,7 @@ module.exports = class ThangTypeEditView extends RootView
level = _.string.slugify level
if @childWindow and not @childWindow.closed
# Reset the LevelView's world, but leave the rest of the state alone
@childWindow.Backbone.Mediator.publish 'level-reload-thang-type', thangType: @thangType
@childWindow.Backbone.Mediator.publish 'level:reload-thang-type', thangType: @thangType
else
# Create a new Window with a blank LevelView
scratchLevelID = level + '?dev=true'

View file

@ -9,7 +9,7 @@ module.exports = class ChooseHeroView extends CocoView
template: template
events:
'click #restart-level-confirm-button': -> Backbone.Mediator.publish 'restart-level'
'click #restart-level-confirm-button': -> Backbone.Mediator.publish 'level:restart-level', {}
getRenderData: (context={}) ->
context = super(context)

View file

@ -61,7 +61,7 @@ module.exports = class OptionsView extends CocoView
volume = @volumeSlider.slider('value')
me.set 'volume', volume
@$el.find('#option-volume-value').text (volume * 100).toFixed(0) + '%'
Backbone.Mediator.publish 'level-set-volume', volume: volume
Backbone.Mediator.publish 'level:set-volume', volume: volume
onHidden: ->
if @playerName and @playerName isnt me.get('name')
@ -72,7 +72,7 @@ module.exports = class OptionsView extends CocoView
@aceConfig.behaviors = @$el.find('#option-behaviors').prop('checked')
@aceConfig.liveCompletion = @$el.find('#option-live-completion').prop('checked')
me.set 'aceConfig', @aceConfig
Backbone.Mediator.publish 'tome:change-config'
Backbone.Mediator.publish 'tome:change-config', {}
updateMusic: ->
me.set 'music', @$el.find('#option-music').prop('checked')

View file

@ -179,7 +179,7 @@ module.exports = class CocoView extends Backbone.View
$('#modal-wrapper .modal').modal(modalOptions).on 'hidden.bs.modal', @modalClosed
window.currentModal = modalView
@getRootView().stopListeningToShortcuts(true)
Backbone.Mediator.publish 'modal-opened', {}
Backbone.Mediator.publish 'modal:opened', {}
modalClosed: =>
visibleModal.willDisappear() if visibleModal
@ -193,7 +193,7 @@ module.exports = class CocoView extends Backbone.View
@openModalView(wm)
else
@getRootView().listenToShortcuts(true)
Backbone.Mediator.publish 'modal-closed', {}
Backbone.Mediator.publish 'modal:closed', {}
# Loading RootViews

View file

@ -36,8 +36,8 @@ module.exports = class RootView extends CocoView
showNewAchievement: (achievement, earnedAchievement) ->
popup = new AchievementPopup achievement: achievement, earnedAchievement: earnedAchievement
handleNewAchievements: (earnedAchievements) ->
_.each earnedAchievements.models, (earnedAchievement) =>
handleNewAchievements: (e) ->
_.each e.earnedAchievements.models, (earnedAchievement) =>
achievement = new Achievement(_id: earnedAchievement.get('achievement'))
achievement.fetch
success: (achievement) => @showNewAchievement(achievement, earnedAchievement)

View file

@ -19,8 +19,8 @@ module.exports = class AuthModal extends ModalView
'keyup #name': 'onNameChange'
subscriptions:
'server-error': 'onServerError'
'logging-in-with-facebook': 'onLoggingInWithFacebook'
'errors:server-error': 'onServerError'
'auth:logging-in-with-facebook': 'onLoggingInWithFacebook'
constructor: (options) ->
@onNameChange = _.debounce @checkNameExists, 500
@ -104,4 +104,4 @@ module.exports = class AuthModal extends ModalView
forms.setErrorToProperty @$el, 'name', "That name is taken! How about #{newName}?", true
onGitHubLoginClicked: ->
Backbone.Mediator.publish 'github-login'
Backbone.Mediator.publish 'auth:log-in-with-github', {}

View file

@ -11,8 +11,8 @@ module.exports = class EmployerSignupModal extends ModalView
closeButton: true
subscriptions:
'server-error': 'onServerError'
'linkedin-loaded': 'onLinkedInLoaded'
'errors:server-error': 'onServerError'
'auth:linkedin-api-loaded': 'onLinkedInLoaded'
'created-user-without-reload': 'createdAccount'
events:

View file

@ -18,7 +18,7 @@ module.exports = class RecoverModal extends ModalView
'keydown input': 'recoverAccount'
subscriptions:
'server-error': 'onServerError'
'errors:server-error': 'onServerError'
onServerError: (e) -> # TODO: work error handling into a separate forms system
@disableModalInProgress(@$el)

View file

@ -45,7 +45,7 @@ module.exports = class SaveVersionModal extends ModalView
if @isPatch then @submitPatch() else @saveChanges()
saveChanges: ->
Backbone.Mediator.publish 'save-new-version', {
Backbone.Mediator.publish 'editor:save-new-version', {
major: @$el.find('#major-version').prop('checked')
commitMessage: @$el.find('#commit-message').val()
}

View file

@ -37,38 +37,21 @@ module.exports = class SpectateLevelView extends RootView
id: 'spectate-level-view'
template: template
cache: false
shortcutsEnabled: true
isEditorPreview: false
subscriptions:
'level-set-volume': (e) -> createjs.Sound.setVolume(e.volume)
'level-highlight-dom': 'onHighlightDom'
'end-level-highlight-dom': 'onEndHighlight'
'level-focus-dom': 'onFocusDom'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:set-volume': (e) -> createjs.Sound.setVolume(e.volume)
'god:new-world-created': 'onNewWorld'
'god:streaming-world-updated': 'onNewWorld'
'god:infinite-loop': 'onInfiniteLoop'
'level-reload-from-data': 'onLevelReloadFromData'
'play-next-level': 'onPlayNextLevel'
'surface:world-set-up': 'onSurfaceSetUpNewWorld'
'level:set-team': 'setTeam'
'god:new-world-created': 'loadSoundsForWorld'
'god:streaming-world-updated': 'loadSoundsForWorld'
'next-game-pressed': 'onNextGamePressed'
'level:next-game-pressed': 'onNextGamePressed'
'level:started': 'onLevelStarted'
'level:loading-view-unveiled': 'onLoadingViewUnveiled'
events:
'click #level-done-button': 'onDonePressed'
shortcuts:
'ctrl+s': 'onCtrlS'
constructor: (options, @levelID) ->
console.profile?() if PROFILE_ME
super options
$(window).on('resize', @onWindowResize)
@sessionOne = @getQueryVariable 'session-one'
@sessionTwo = @getQueryVariable 'session-two'
@ -207,143 +190,16 @@ module.exports = class SpectateLevelView extends RootView
@insertSubView new HUDView {}
worldName = utils.i18n @level.attributes, 'name'
@controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel, playableTeams: @world.playableTeams, spectateGame: true}
#Backbone.Mediator.publish('level-set-debug', debug: true) if me.displayName() is 'Nick'
afterInsert: ->
super()
# callbacks
onCtrlS: (e) ->
e.preventDefault()
onLevelReloadFromData: (e) ->
isReload = Boolean @world
@setLevel e.level, e.supermodel
if isReload
@scriptManager.setScripts(e.level.get('scripts'))
Backbone.Mediator.publish 'tome:cast-spell' # a bit hacky
onWindowResize: (s...) ->
$('#pointer').css('opacity', 0.0)
onDisableControls: (e) ->
return if e.controls and not ('level' in e.controls)
@shortcutsEnabled = false
@wasFocusedOn = document.activeElement
$('body').focus()
onEnableControls: (e) ->
return if e.controls? and not ('level' in e.controls)
@shortcutsEnabled = true
$(@wasFocusedOn).focus() if @wasFocusedOn
@wasFocusedOn = null
onDonePressed: -> return
onNewWorld: (e) ->
@world = e.world
onInfiniteLoop: (e) ->
return unless e.firstWorld
@openModalView new InfiniteLoopModal()
window.tracker?.trackEvent 'Saw Initial Infinite Loop', level: @world.name, label: @world.name
onPlayNextLevel: ->
nextLevel = @getNextLevel()
nextLevelID = nextLevel.get('slug') or nextLevel.id
url = "/play/level/#{nextLevelID}"
Backbone.Mediator.publish 'router:navigate', {
route: url,
viewClass: PlayLevelView,
viewArgs: [{supermodel:@supermodel}, nextLevelID]}
getNextLevel: ->
nextLevelOriginal = @level.get('nextLevel')?.original
levels = @supermodel.getModels(Level)
return l for l in levels when l.get('original') is nextLevelOriginal
onHighlightDom: (e) ->
if e.delay
delay = e.delay
delete e.delay
@pointerInterval = _.delay((=> @onHighlightDom e), delay)
return
@addPointer()
selector = e.selector + ':visible'
dom = $(selector)
return if parseFloat(dom.css('opacity')) is 0.0
offset = dom.offset()
return if not offset
target_left = offset.left + dom.outerWidth() * 0.5
target_top = offset.top + dom.outerHeight() * 0.5
body = $('#level-view')
if e.sides
if 'left' in e.sides then target_left = offset.left
if 'right' in e.sides then target_left = offset.left + dom.outerWidth()
if 'top' in e.sides then target_top = offset.top
if 'bottom' in e.sides then target_top = offset.top + dom.outerHeight()
else
# aim to hit the side if the target is entirely on one side of the screen
if offset.left > body.outerWidth()*0.5
target_left = offset.left
else if offset.left + dom.outerWidth() < body.outerWidth()*0.5
target_left = offset.left + dom.outerWidth()
# aim to hit the bottom or top if the target is entirely on the top or bottom of the screen
if offset.top > body.outerWidth()*0.5
target_top = offset.top
else if offset.top + dom.outerHeight() < body.outerHeight()*0.5
target_top = offset.top + dom.outerHeight()
if e.offset
target_left += e.offset.x
target_top += e.offset.y
@pointerRadialDistance = -47 # - Math.sqrt(Math.pow(dom.outerHeight()*0.5, 2), Math.pow(dom.outerWidth()*0.5))
@pointerRotation = e.rotation ? Math.atan2(body.outerWidth()*0.5 - target_left, target_top - body.outerHeight()*0.5)
pointer = $('#pointer')
pointer
.css('opacity', 1.0)
.css('transition', 'none')
.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance}px)")
.css('top', target_top - 50)
.css('left', target_left - 50)
setTimeout((=>
@animatePointer()
clearInterval(@pointerInterval)
@pointerInterval = setInterval(@animatePointer, 1200)
), 1)
animatePointer: ->
pointer = $('#pointer')
pointer.css('transition', 'all 0.6s ease-out')
pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance-50}px)")
setTimeout((=>
pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance}px)").css('transition', 'all 0.4s ease-in')), 800)
onFocusDom: (e) -> $(e.selector).focus()
onEndHighlight: ->
$('#pointer').css('opacity', 0.0)
clearInterval(@pointerInterval)
onMultiplayerChanged: (e) ->
if @session.get('multiplayer')
@bus.connect()
else
@bus.removeFirebaseData =>
@bus.disconnect()
# initialization
addPointer: ->
p = $('#pointer')
return if p.length
@$el.append($('<img src="/images/level/pointer.png" id="pointer">'))
initSurface: ->
surfaceCanvas = $('canvas#surface', @$el)
@surface = new Surface(@world, surfaceCanvas, thangTypes: @supermodel.getModels(ThangType), playJingle: not @isEditorPreview, spectateGame: true)
@ -372,14 +228,14 @@ module.exports = class SpectateLevelView extends RootView
initVolume: ->
volume = me.get('volume')
volume = 1.0 unless volume?
Backbone.Mediator.publish 'level-set-volume', volume: volume
Backbone.Mediator.publish 'level:set-volume', volume: volume
onSurfaceSetUpNewWorld: ->
return if @alreadyLoadedState
@alreadyLoadedState = true
state = @originalSessionState
if state.playing?
Backbone.Mediator.publish 'level-set-playing', { playing: state.playing }
Backbone.Mediator.publish 'level:set-playing', playing: state.playing
register: -> return
@ -400,17 +256,22 @@ module.exports = class SpectateLevelView extends RootView
# Dynamic sound loading
loadSoundsForWorld: (e) ->
onNewWorld: (e) ->
return if @headless
world = e.world
scripts = @world.scripts # Since these worlds don't have scripts, preserve them.
@world = e.world
thangTypes = @supermodel.getModels(ThangType)
for [spriteName, message] in world.thangDialogueSounds()
startFrame = @lastWorldFramesLoaded ? 0
if @world.frames.length is @world.totalFrames # Finished loading
@lastWorldFramesLoaded = 0
else
@lastWorldFramesLoaded = @world.frames.length
for [spriteName, message] in @world.thangDialogueSounds startFrame
continue unless thangType = _.find thangTypes, (m) -> m.get('name') is spriteName
continue unless sound = AudioPlayer.soundForDialogue message, thangType.get('soundTriggers')
AudioPlayer.preloadSoundReference sound
onNextGamePressed: (e) ->
console.log 'You want to see the next game!'
@fetchRandomSessionPair (err, data) =>
if err? then return console.log "There was an error fetching the random session pair: #{data}"
@sessionOne = data[0]._id
@ -445,10 +306,8 @@ module.exports = class SpectateLevelView extends RootView
@levelLoader?.destroy()
@surface?.destroy()
@god?.destroy()
$(window).off('resize', @onWindowResize)
@goalManager?.destroy()
@scriptManager?.destroy()
delete window.world # not sure where this is set, but this is one way to clean it up
clearInterval(@pointerInterval)
console.profileEnd?() if PROFILE_ME
super()

View file

@ -21,10 +21,10 @@ module.exports = class LadderTabView extends CocoView
'click .load-more-ladder-entries': 'onLoadMoreLadderEntries'
subscriptions:
'fbapi-loaded': 'checkFriends'
'gapi-loaded': 'checkFriends'
'facebook-logged-in': 'onConnectedWithFacebook'
'gplus-logged-in': 'onConnectedWithGPlus'
'auth:facebook-api-loaded': 'checkFriends'
'auth:gplus-api-loaded': 'checkFriends'
'auth:logged-in-with-facebook': 'onConnectedWithFacebook'
'auth:logged-in-with-gplus': 'onConnectedWithGPlus'
constructor: (options, @level, @sessions) ->
super(options)

View file

@ -61,7 +61,7 @@ module.exports = class MyMatchesTabView extends CocoView
state = 'tie' if match.metrics.rank is opponent.metrics.rank
fresh = match.date > (new Date(new Date() - 20 * 1000)).toISOString()
if fresh
Backbone.Mediator.publish 'play-sound', trigger: 'chat_received'
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'chat_received'
{
state: state
opponentName: @nameMap[opponent.userID]
@ -88,7 +88,7 @@ module.exports = class MyMatchesTabView extends CocoView
team.scoreHistory = scoreHistory
if not team.isRanking and @previouslyRankingTeams[team.id]
Backbone.Mediator.publish 'play-sound', trigger: 'cast-end'
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'cast-end'
@previouslyRankingTeams[team.id] = team.isRanking
ctx

View file

@ -16,7 +16,7 @@ module.exports = class ControlBarView extends CocoView
window.tracker?.trackEvent 'Clicked Docs', level: @level.get('name'), label: @level.get('name')
@showGuideModal()
'click #next-game-button': -> Backbone.Mediator.publish 'next-game-pressed', {}
'click #next-game-button': -> Backbone.Mediator.publish 'level:next-game-pressed', {}
'click #game-menu-button': 'showGameMenuModal'

View file

@ -51,7 +51,7 @@ module.exports = class LevelChatView extends CocoView
@playNoise() if e.message.authorID isnt me.id
playNoise: ->
Backbone.Mediator.publish 'play-sound', trigger: 'chat_received'
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'chat_received'
messageObjectToJQuery: (message) ->
td = $('<td></td>')

View file

@ -14,7 +14,7 @@ module.exports = class LevelGoalsView extends CocoView
subscriptions:
'goal-manager:new-goal-states': 'onNewGoalStates'
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
'surface:playback-restarted': 'onSurfacePlaybackRestarted'
'surface:playback-ended': 'onSurfacePlaybackEnded'

View file

@ -8,7 +8,7 @@ module.exports = class LevelGoldView extends CocoView
subscriptions:
'surface:gold-changed': 'onGoldChanged'
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
constructor: (options) ->
super options

View file

@ -11,16 +11,16 @@ module.exports = class LevelHUDView extends CocoView
subscriptions:
'surface:frame-changed': 'onFrameChanged'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'surface:sprite-selected': 'onSpriteSelected'
'sprite:speech-updated': 'onSpriteDialogue'
'level-sprite-clear-dialogue': 'onSpriteClearDialogue'
'level:sprite-clear-dialogue': 'onSpriteClearDialogue'
'level:shift-space-pressed': 'onShiftSpacePressed'
'level:escape-pressed': 'onEscapePressed'
'dialogue-sound-completed': 'onDialogueSoundCompleted'
'thang-began-talking': 'onThangBeganTalking'
'thang-finished-talking': 'onThangFinishedTalking'
'sprite:dialogue-sound-completed': 'onDialogueSoundCompleted'
'sprite:thang-began-talking': 'onThangBeganTalking'
'sprite:thang-finished-talking': 'onThangFinishedTalking'
'god:new-world-created': 'onNewWorld'
events:
@ -210,13 +210,13 @@ module.exports = class LevelHUDView extends CocoView
f = (r) => => setTimeout((-> Backbone.Mediator.publish(r.channel, r.event)), 10)
$(buttons[i]).click(f(response))
else
$('.enter', @bubble).click(-> Backbone.Mediator.publish('end-current-script'))
$('.enter', @bubble).click(-> Backbone.Mediator.publish('script:end-current-script'))
return
@animator.tick()
onShiftSpacePressed: (e) ->
@shiftSpacePressed = (@shiftSpacePressed || 0) + 1
# We don't need to handle end-current-script--that's done--but if we do have
# We don't need to handle script:end-current-script--that's done--but if we do have
# custom buttons, then we need to trigger the one that should fire (the last one).
# If we decide that always having the last one fire is bad, we should make it smarter.
return unless @lastResponses?.length

View file

@ -18,7 +18,7 @@ module.exports = class LevelLoadingView extends CocoView
@shownReady = true
ready = $.i18n.t('play_level.loading_ready', defaultValue: 'Ready!')
@$el.find('#tip-wrapper .tip').addClass('ready').text ready
Backbone.Mediator.publish 'play-sound', trigger: 'level_loaded', volume: 0.75 # old: loading_ready
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'level_loaded', volume: 0.75 # old: loading_ready
unveil: ->
_.delay @reallyUnveil, 1000

View file

@ -10,18 +10,18 @@ module.exports = class LevelPlaybackView extends CocoView
template: template
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level-set-playing': 'onSetPlaying'
'level-toggle-playing': 'onTogglePlay'
'level-scrub-forward': 'onScrubForward'
'level-scrub-back': 'onScrubBack'
'level-set-volume': 'onSetVolume'
'level-set-debug': 'onSetDebug'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'level:set-playing': 'onSetPlaying'
'level:toggle-playing': 'onTogglePlay'
'level:scrub-forward': 'onScrubForward'
'level:scrub-back': 'onScrubBack'
'level:set-volume': 'onSetVolume'
'level:set-debug': 'onSetDebug'
'surface:frame-changed': 'onFrameChanged'
'god:new-world-created': 'onNewWorld'
'god:streaming-world-updated': 'onNewWorld'
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
'tome:cast-spells': 'onTomeCast'
'playback:real-time-playback-ended': 'onRealTimePlaybackEnded'
'playback:stop-real-time-playback': 'onStopRealTimePlayback'
@ -32,8 +32,8 @@ module.exports = class LevelPlaybackView extends CocoView
'click #edit-editor-config': 'onEditEditorConfig'
'click #view-keyboard-shortcuts': 'onViewKeyboardShortcuts'
'click #music-button': 'onToggleMusic'
'click #zoom-in-button': -> Backbone.Mediator.publish('camera-zoom-in', {}) unless @shouldIgnore()
'click #zoom-out-button': -> Backbone.Mediator.publish('camera-zoom-out', {}) unless @shouldIgnore()
'click #zoom-in-button': -> Backbone.Mediator.publish 'camera:zoom-in', {} unless @shouldIgnore()
'click #zoom-out-button': -> Backbone.Mediator.publish 'camera:zoom-out', {} unless @shouldIgnore()
'click #volume-button': 'onToggleVolume'
'click #play-button': 'onTogglePlay'
'click': -> Backbone.Mediator.publish 'tome:focus-editor', {} unless @realTime
@ -183,10 +183,10 @@ module.exports = class LevelPlaybackView extends CocoView
onToggleDebug: ->
return if @shouldIgnore()
flag = $('#debug-toggle i.icon-ok')
Backbone.Mediator.publish('level-set-debug', {debug: flag.hasClass('invisible')})
Backbone.Mediator.publish('level:set-debug', {debug: flag.hasClass('invisible')})
onEditWizardSettings: ->
Backbone.Mediator.publish 'edit-wizard-settings'
Backbone.Mediator.publish 'level:edit-wizard-settings', {}
onEditEditorConfig: ->
@openModalView new EditorConfigModal session: @options.session
@ -236,7 +236,7 @@ module.exports = class LevelPlaybackView extends CocoView
onScrub: (e, options) ->
e?.preventDefault()
options.scrubDuration = 500
Backbone.Mediator.publish('level-set-time', options)
Backbone.Mediator.publish('level:set-time', options)
onScrubForward: (e) ->
@onScrub e, ratioOffset: 0.05
@ -324,16 +324,16 @@ module.exports = class LevelPlaybackView extends CocoView
return if @shouldIgnore()
@slideCount = 0
@wasPlaying = @playing
Backbone.Mediator.publish 'level-set-playing', {playing: false}
Backbone.Mediator.publish 'level:set-playing', {playing: false}
stop: (event, ui) =>
return if @shouldIgnore()
@actualProgress = ui.value / @sliderIncrements
Backbone.Mediator.publish 'playback:manually-scrubbed', ratio: @actualProgress
Backbone.Mediator.publish 'level-set-playing', {playing: @wasPlaying}
Backbone.Mediator.publish 'playback:manually-scrubbed', ratio: @actualProgress # For scripts
Backbone.Mediator.publish 'level:set-playing', {playing: @wasPlaying}
if @slideCount < 3
@wasPlaying = false
Backbone.Mediator.publish 'level-set-playing', {playing: false}
Backbone.Mediator.publish 'level:set-playing', {playing: false}
@$el.find('.scrubber-handle').effect('bounce', {times: 2})
)
@ -342,7 +342,7 @@ module.exports = class LevelPlaybackView extends CocoView
scrubTo: (ratio, duration=0) ->
return if @shouldIgnore()
Backbone.Mediator.publish 'level-set-time', ratio: ratio, scrubDuration: duration
Backbone.Mediator.publish 'level:set-time', ratio: ratio, scrubDuration: duration
shouldIgnore: -> return @disabled or @realTime
@ -351,7 +351,7 @@ module.exports = class LevelPlaybackView extends CocoView
return if @shouldIgnore()
button = $('#play-button')
willPlay = button.hasClass('paused') or button.hasClass('ended')
Backbone.Mediator.publish 'level-set-playing', playing: willPlay
Backbone.Mediator.publish 'level:set-playing', playing: willPlay
$(document.activeElement).blur()
onToggleVolume: (e) ->
@ -364,7 +364,7 @@ module.exports = class LevelPlaybackView extends CocoView
break
else if i is classes.length - 1 # no oldClass
newI = 2
Backbone.Mediator.publish 'level-set-volume', volume: volumes[newI]
Backbone.Mediator.publish 'level:set-volume', volume: volumes[newI]
$(document.activeElement).blur()
onToggleMusic: (e) ->

View file

@ -44,24 +44,23 @@ module.exports = class PlayLevelView extends RootView
isEditorPreview: false
subscriptions:
'level-set-volume': (e) -> createjs.Sound.setVolume(e.volume)
'level-show-victory': 'onShowVictory'
'restart-level': 'onRestartLevel'
'level-highlight-dom': 'onHighlightDom'
'end-level-highlight-dom': 'onEndHighlight'
'level-focus-dom': 'onFocusDom'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:set-volume': (e) -> createjs.Sound.setVolume(e.volume)
'level:show-victory': 'onShowVictory'
'level:restart': 'onRestartLevel'
'level:highlight-dom': 'onHighlightDom'
'level:end-highlight-dom': 'onEndHighlight'
'level:focus-dom': 'onFocusDom'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'god:new-world-created': 'onNewWorld'
'god:streaming-world-updated': 'onNewWorld'
'god:infinite-loop': 'onInfiniteLoop'
'level-reload-from-data': 'onLevelReloadFromData'
'level-reload-thang-type': 'onLevelReloadThangType'
'play-next-level': 'onPlayNextLevel'
'edit-wizard-settings': 'showWizardSettingsModal'
'level:reload-from-data': 'onLevelReloadFromData'
'level:reload-thang-type': 'onLevelReloadThangType'
'level:play-next-level': 'onPlayNextLevel'
'level:edit-wizard-settings': 'showWizardSettingsModal'
'surface:world-set-up': 'onSurfaceSetUpNewWorld'
'level:session-will-save': 'onSessionWillSave'
'level:set-team': 'setTeam'
'level:started': 'onLevelStarted'
'level:loading-view-unveiled': 'onLoadingViewUnveiled'
'playback:real-time-playback-started': 'onRealTimePlaybackStarted'
@ -143,13 +142,13 @@ module.exports = class PlayLevelView extends RootView
supermodel: @supermodel
firstOnly: true
@openModalView(new LevelGuideModal(options), true)
onGuideOpened = ->
onGuideOpened = (e) ->
@guideOpenTime = new Date()
onGuideClosed = ->
onGuideClosed = (e) ->
application.tracker?.trackTiming new Date() - @guideOpenTime, 'Intro Guide Time', @levelID, @levelID, 100
@onLevelStarted()
Backbone.Mediator.subscribeOnce 'modal-opened', onGuideOpened, @
Backbone.Mediator.subscribeOnce 'modal-closed', onGuideClosed, @
Backbone.Mediator.subscribeOnce 'modal:opened', onGuideOpened, @
Backbone.Mediator.subscribeOnce 'modal:closed', onGuideClosed, @
return true
getRenderData: ->
@ -224,7 +223,7 @@ module.exports = class PlayLevelView extends RootView
team = team?.team unless _.isString team
team ?= 'humans'
me.team = team
Backbone.Mediator.publish 'level:team-set', team: team
Backbone.Mediator.publish 'level:team-set', team: team # Needed for scripts
@team = team
initGoalManager: ->
@ -241,12 +240,12 @@ module.exports = class PlayLevelView extends RootView
@insertSubView new ChatView levelID: @levelID, sessionID: @session.id, session: @session
worldName = utils.i18n @level.attributes, 'name'
@controlBar = @insertSubView new ControlBarView {worldName: worldName, session: @session, level: @level, supermodel: @supermodel, playableTeams: @world.playableTeams}
#Backbone.Mediator.publish('level-set-debug', debug: true) if me.displayName() is 'Nick'
#Backbone.Mediator.publish('level:set-debug', debug: true) if me.displayName() is 'Nick'
initVolume: ->
volume = me.get('volume')
volume = 1.0 unless volume?
Backbone.Mediator.publish 'level-set-volume', volume: volume
Backbone.Mediator.publish 'level:set-volume', volume: volume
initScriptManager: ->
@scriptManager = new ScriptManager({scripts: @world.scripts or [], view: @, session: @session})
@ -289,7 +288,7 @@ module.exports = class PlayLevelView extends RootView
return unless @surface?
@loadingView.showReady()
if window.currentModal and not window.currentModal.destroyed
return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelStarted, @
return Backbone.Mediator.subscribeOnce 'modal:closed', @onLevelStarted, @
@surface.showLevel()
if @otherSession
# TODO: colorize name and cloud by team, colorize wizard by user's color config
@ -312,12 +311,12 @@ module.exports = class PlayLevelView extends RootView
@alreadyLoadedState = true
state = @originalSessionState
if state.frame and @level.get('type') isnt 'ladder' # https://github.com/codecombat/codecombat/issues/714
Backbone.Mediator.publish 'level-set-time', { time: 0, frameOffset: state.frame }
Backbone.Mediator.publish 'level:set-time', time: 0, frameOffset: state.frame
if state.selected
# TODO: Should also restore selected spell here by saving spellName
Backbone.Mediator.publish 'level-select-sprite', { thangID: state.selected, spellName: null }
Backbone.Mediator.publish 'level:select-sprite', thangID: state.selected, spellName: null
if state.playing?
Backbone.Mediator.publish 'level-set-playing', { playing: state.playing }
Backbone.Mediator.publish 'level:set-playing', playing: state.playing
# callbacks
@ -377,7 +376,7 @@ module.exports = class PlayLevelView extends RootView
onRestartLevel: ->
@tome.reloadAllCode()
Backbone.Mediator.publish 'level:restarted'
Backbone.Mediator.publish 'level:restarted', {}
$('#level-done-button', @$el).hide()
application.tracker?.trackEvent 'Confirmed Restart', level: @level.get('name'), label: @level.get('name')
@ -421,7 +420,6 @@ module.exports = class PlayLevelView extends RootView
return if not offset
target_left = offset.left + dom.outerWidth() * 0.5
target_top = offset.top + dom.outerHeight() * 0.5
body = $('#level-view')
if e.sides
if 'left' in e.sides then target_left = offset.left
@ -430,15 +428,15 @@ module.exports = class PlayLevelView extends RootView
if 'bottom' in e.sides then target_top = offset.top + dom.outerHeight()
else
# aim to hit the side if the target is entirely on one side of the screen
if offset.left > body.outerWidth()*0.5
if offset.left > @$el.outerWidth()*0.5
target_left = offset.left
else if offset.left + dom.outerWidth() < body.outerWidth()*0.5
else if offset.left + dom.outerWidth() < @$el.outerWidth()*0.5
target_left = offset.left + dom.outerWidth()
# aim to hit the bottom or top if the target is entirely on the top or bottom of the screen
if offset.top > body.outerWidth()*0.5
if offset.top > @$el.outerWidth()*0.5
target_top = offset.top
else if offset.top + dom.outerHeight() < body.outerHeight()*0.5
else if offset.top + dom.outerHeight() < @$el.outerHeight()*0.5
target_top = offset.top + dom.outerHeight()
if e.offset
@ -446,7 +444,7 @@ module.exports = class PlayLevelView extends RootView
target_top += e.offset.y
@pointerRadialDistance = -47 # - Math.sqrt(Math.pow(dom.outerHeight()*0.5, 2), Math.pow(dom.outerWidth()*0.5))
@pointerRotation = e.rotation ? Math.atan2(body.outerWidth()*0.5 - target_left, target_top - body.outerHeight()*0.5)
@pointerRotation = e.rotation ? Math.atan2(@$el.outerWidth()*0.5 - target_left, target_top - @$el.outerHeight()*0.5)
pointer = $('#pointer')
pointer
.css('opacity', 1.0)
@ -465,7 +463,7 @@ module.exports = class PlayLevelView extends RootView
pointer = $('#pointer')
pointer.css('transition', 'all 0.6s ease-out')
pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance-50}px)")
Backbone.Mediator.publish 'play-sound', trigger: 'dom_highlight', volume: 0.75
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'dom_highlight', volume: 0.75
setTimeout((=>
pointer.css('transform', "rotate(#{@pointerRotation}rad) translate(-3px, #{@pointerRadialDistance}px)").css('transition', 'all 0.4s ease-in')), 800)

View file

@ -6,6 +6,6 @@ module.exports = class InfiniteLoopModal extends ModalView
template: template
events:
'click #restart-level-infinite-loop-retry-button': -> Backbone.Mediator.publish 'tome:cast-spell'
'click #restart-level-infinite-loop-confirm-button': -> Backbone.Mediator.publish 'restart-level'
'click #restart-level-infinite-loop-comment-button': -> Backbone.Mediator.publish 'tome:comment-my-code'
'click #restart-level-infinite-loop-retry-button': -> Backbone.Mediator.publish 'tome:cast-spell', {}
'click #restart-level-infinite-loop-confirm-button': -> Backbone.Mediator.publish 'level:restart', {}
'click #restart-level-infinite-loop-comment-button': -> Backbone.Mediator.publish 'tome:comment-my-code', {}

View file

@ -52,7 +52,7 @@ module.exports = class LevelGuideModal extends ModalView
afterInsert: ->
super()
Backbone.Mediator.publish 'level:docs-shown'
Backbone.Mediator.publish 'level:docs-shown', {}
onHidden: ->
Backbone.Mediator.publish 'level:docs-hidden'
Backbone.Mediator.publish 'level:docs-hidden', {}

View file

@ -59,7 +59,7 @@ module.exports = class VictoryModal extends ModalView
onPlayNextLevel: ->
@saveReview() if @$el.find('.review textarea').val()
Backbone.Mediator.publish('play-next-level')
Backbone.Mediator.publish 'level:play-next-level', {}
onGameSubmitted: (e) ->
ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
@ -95,14 +95,11 @@ module.exports = class VictoryModal extends ModalView
afterInsert: ->
super()
Backbone.Mediator.publish 'play-sound', trigger: 'victory'
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
gapi?.plusone?.go? @$el[0]
FB?.XFBML?.parse? @$el[0]
twttr?.widgets?.load?()
onHidden: ->
Backbone.Mediator.publish 'level:victory-hidden'
destroy: ->
@saveReview() if @$el.find('.review textarea').val()
@feedback.off()

View file

@ -51,7 +51,7 @@ module.exports = class CastButtonView extends CocoView
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
onCastOptionsClick: (e) =>
Backbone.Mediator.publish 'tome:focus-editor'
Backbone.Mediator.publish 'tome:focus-editor', {}
@castButtonGroup.removeClass 'open'
@setAutocastDelay $(e.target).attr 'data-delay'
false
@ -63,7 +63,7 @@ module.exports = class CastButtonView extends CocoView
return if e.preload
@casting = true
if @hasStartedCastingOnce # Don't play this sound the first time
Backbone.Mediator.publish 'play-sound', trigger: 'cast', volume: 0.5
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'cast', volume: 0.5
@hasStartedCastingOnce = true
@updateCastButton()
@onWorldLoadProgressChanged progress: 0
@ -76,7 +76,7 @@ module.exports = class CastButtonView extends CocoView
onNewWorld: (e) ->
@casting = false
if @hasCastOnce # Don't play this sound the first time
Backbone.Mediator.publish 'play-sound', trigger: 'cast-end', volume: 0.5
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'cast-end', volume: 0.5
@hasCastOnce = true
@updateCastButton()

View file

@ -33,7 +33,7 @@ module.exports = class ProblemAlertView extends CocoView
super()
@$el.addClass('alert').addClass("alert-#{@problem.aetherProblem.level}").hide().fadeIn('slow')
@$el.addClass('no-hint') unless @problem.aetherProblem.hint
Backbone.Mediator.publish 'play-sound', trigger: 'error_appear', volume: 1.0
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'error_appear', volume: 1.0
onRemoveClicked: ->
@$el.remove()

View file

@ -102,15 +102,15 @@ module.exports = class SpellDebugView extends CocoView
@thang = thangAndSpellObject.thang
@spell = thangAndSpellObject.spell
handleDebugValue: (returnObject) ->
handleDebugValue: (e) ->
{key, value} = e
@workerIsSimulating = false
{key, value} = returnObject
@updateCache(@thang.id, @spell.name, key.split('.'), @lastFrameRequested, value)
if @variableChain and not key is @variableChain.join('.') then return
@setTooltipKeyAndValue(key, value)
handleWorldLoadProgressChanged: (data) ->
@progress = data.progress
handleWorldLoadProgressChanged: (e) ->
@progress = e.progress
afterRender: ->
super()

View file

@ -30,7 +30,7 @@ module.exports = class SpellListEntryThangsView extends CocoView
avatar.render()
avatar.setSelected thang is @thang
avatar.$el.data('thang-id', thang.id).click (e) ->
Backbone.Mediator.publish 'level-select-sprite', thangID: $(@).data('thang-id'), spellName: spellName
Backbone.Mediator.publish 'level:select-sprite', thangID: $(@).data('thang-id'), spellName: spellName
avatar.onProblemsUpdated spell: @spell
@avatars.push avatar

View file

@ -14,8 +14,8 @@ module.exports = class SpellListEntryView extends CocoView
subscriptions:
'tome:problems-updated': 'onProblemsUpdated'
'tome:spell-changed-language': 'onSpellChangedLanguage'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'god:new-world-created': 'onNewWorld'
events:
@ -88,7 +88,7 @@ module.exports = class SpellListEntryView extends CocoView
onClick: (e) ->
spellThang = @getPrimarySpellThang()
Backbone.Mediator.publish 'level-select-sprite', thangID: spellThang.thang.id, spellName: @spell.name
Backbone.Mediator.publish 'level:select-sprite', thangID: spellThang.thang.id, spellName: @spell.name
onMouseEnterAvatar: (e) ->
return unless @controlsEnabled and _.size(@spell.thangs) > 1

View file

@ -10,8 +10,8 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
id: 'spell-list-tab-entry-view'
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'tome:spell-loaded': 'onSpellLoaded'
'tome:spell-changed': 'onSpellChanged'
'god:new-world-created': 'onNewWorld'
@ -84,7 +84,7 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
onDropdownClick: (e) ->
return unless @controlsEnabled
Backbone.Mediator.publish 'tome:toggle-spell-list'
Backbone.Mediator.publish 'tome:toggle-spell-list', {}
onCodeReload: ->
return unless @controlsEnabled
@ -92,7 +92,7 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
onBeautifyClick: ->
return unless @controlsEnabled
Backbone.Mediator.publish 'spell-beautify', spell: @spell
Backbone.Mediator.publish 'tome:spell-beautify', spell: @spell
onFullscreenClick: ->
$codearea = $('html')

View file

@ -14,8 +14,8 @@ module.exports = class SpellPaletteView extends CocoView
controlsEnabled: true
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'surface:frame-changed': 'onFrameChanged'
'tome:change-language': 'onTomeChangedLanguage'

View file

@ -7,8 +7,8 @@ module.exports = class SpellToolbarView extends CocoView
progressHoverDelay: 500
subscriptions:
'spell-step-backward': 'onStepBackward'
'spell-step-forward': 'onStepForward'
'tome:spell-step-backward': 'onStepBackward'
'tome:spell-step-forward': 'onStepForward'
events:
'mousemove .spell-progress': 'onProgressHover'
@ -100,7 +100,7 @@ module.exports = class SpellToolbarView extends CocoView
@maintainIndexScrub = true
clearTimeout @maintainIndexScrubTimeout if @maintainIndexScrubTimeout
@maintainIndexScrubTimeout = _.delay (=> @maintainIndexScrub = false), 500
Backbone.Mediator.publish 'level-set-time', time: @statementTime, scrubDuration: 500
Backbone.Mediator.publish 'level:set-time', time: @statementTime, scrubDuration: 500
updateScroll: ->
return unless statementStart = @callState?.statements?[@statementIndex]?.range[0]

View file

@ -31,8 +31,8 @@ module.exports = class SpellView extends CocoView
'emacs': 'ace/keyboard/emacs'
subscriptions:
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'surface:frame-changed': 'onFrameChanged'
'surface:coordinate-selected': 'onCoordinateSelected'
'god:new-world-created': 'onNewWorld'
@ -42,14 +42,14 @@ module.exports = class SpellView extends CocoView
'tome:reload-code': 'onCodeReload'
'tome:spell-changed': 'onSpellChanged'
'level:session-will-save': 'onSessionWillSave'
'modal-closed': 'focus'
'modal:closed': 'focus'
'tome:focus-editor': 'focus'
'tome:spell-statement-index-updated': 'onStatementIndexUpdated'
'tome:change-language': 'onChangeLanguage'
'tome:change-config': 'onChangeEditorConfig'
'tome:update-snippets': 'addZatannaSnippets'
'tome:insert-snippet': 'onInsertSnippet'
'spell-beautify': 'onSpellBeautify'
'tome:spell-beautify': 'onSpellBeautify'
'script:state-changed': 'onScriptStateChange'
events:
@ -125,7 +125,7 @@ module.exports = class SpellView extends CocoView
addCommand
name: 'toggle-playing'
bindKey: {win: 'Ctrl-P', mac: 'Command-P|Ctrl-P'}
exec: -> Backbone.Mediator.publish 'level-toggle-playing'
exec: -> Backbone.Mediator.publish 'level:toggle-playing', {}
addCommand
name: 'end-current-script'
bindKey: {win: 'Shift-Space', mac: 'Shift-Space'}
@ -134,46 +134,46 @@ module.exports = class SpellView extends CocoView
# Maybe we could temporarily set ourselves to read-only if we somehow know that a script is active?
exec: =>
if @scriptRunning
Backbone.Mediator.publish 'level:shift-space-pressed'
Backbone.Mediator.publish 'level:shift-space-pressed', {}
else
@ace.insert ' '
addCommand
name: 'end-all-scripts'
bindKey: {win: 'Escape', mac: 'Escape'}
exec: -> Backbone.Mediator.publish 'level:escape-pressed'
exec: -> Backbone.Mediator.publish 'level:escape-pressed', {}
addCommand
name: 'toggle-grid'
bindKey: {win: 'Ctrl-G', mac: 'Command-G|Ctrl-G'}
exec: -> Backbone.Mediator.publish 'level-toggle-grid'
exec: -> Backbone.Mediator.publish 'level:toggle-grid', {}
addCommand
name: 'toggle-debug'
bindKey: {win: 'Ctrl-\\', mac: 'Command-\\|Ctrl-\\'}
exec: -> Backbone.Mediator.publish 'level-toggle-debug'
exec: -> Backbone.Mediator.publish 'level:toggle-debug', {}
addCommand
name: 'toggle-pathfinding'
bindKey: {win: 'Ctrl-O', mac: 'Command-O|Ctrl-O'}
exec: -> Backbone.Mediator.publish 'level-toggle-pathfinding'
exec: -> Backbone.Mediator.publish 'level:toggle-pathfinding', {}
addCommand
name: 'level-scrub-forward'
bindKey: {win: 'Ctrl-]', mac: 'Command-]|Ctrl-]'}
exec: -> Backbone.Mediator.publish 'level-scrub-forward'
exec: -> Backbone.Mediator.publish 'level:scrub-forward', {}
addCommand
name: 'level-scrub-back'
bindKey: {win: 'Ctrl-[', mac: 'Command-[|Ctrl-]'}
exec: -> Backbone.Mediator.publish 'level-scrub-back'
exec: -> Backbone.Mediator.publish 'level:scrub-back', {}
addCommand
name: 'spell-step-forward'
bindKey: {win: 'Ctrl-Alt-]', mac: 'Command-Alt-]|Ctrl-Alt-]'}
exec: -> Backbone.Mediator.publish 'spell-step-forward'
exec: -> Backbone.Mediator.publish 'tome:spell-step-forward', {}
addCommand
name: 'spell-step-backward'
bindKey: {win: 'Ctrl-Alt-[', mac: 'Command-Alt-[|Ctrl-Alt-]'}
exec: -> Backbone.Mediator.publish 'spell-step-backward'
exec: -> Backbone.Mediator.publish 'tome:spell-step-backward', {}
addCommand
name: 'spell-beautify'
bindKey: {win: 'Ctrl-Shift-B', mac: 'Command-Shift-B|Ctrl-Shift-B'}
exec: -> Backbone.Mediator.publish 'spell-beautify'
exec: -> Backbone.Mediator.publish 'tome:spell-beautify', {}
addCommand
name: 'prevent-line-jump'
bindKey: {win: 'Ctrl-L', mac: 'Command-L'}
@ -182,7 +182,7 @@ module.exports = class SpellView extends CocoView
addCommand
name: 'open-fullscreen-editor'
bindKey: {win: 'Alt-Shift-F', mac: 'Ctrl-Shift-F'}
exec: -> Backbone.Mediator.publish 'tome:fullscreen-view'
exec: -> Backbone.Mediator.publish 'tome:fullscreen-view', {}
fillACE: ->
@ace.setValue @spell.source
@ -281,11 +281,11 @@ module.exports = class SpellView extends CocoView
notifyEditingEnded: =>
return if @aceDoc.undergoingFirepadOperation # from my Firepad ACE adapter
Backbone.Mediator.publish('tome:editing-ended')
Backbone.Mediator.publish 'tome:editing-ended', {}
notifyEditingBegan: =>
return if @aceDoc.undergoingFirepadOperation # from my Firepad ACE adapter
Backbone.Mediator.publish('tome:editing-began')
Backbone.Mediator.publish 'tome:editing-began', {}
onManualCast: (e) ->
cast = @$el.parent().length

View file

@ -16,10 +16,10 @@ module.exports = class ThangListEntryView extends CocoView
subscriptions:
'tome:problems-updated': 'onProblemsUpdated'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'level:disable-controls': 'onDisableControls'
'level:enable-controls': 'onEnableControls'
'surface:frame-changed': 'onFrameChanged'
'level-set-letterbox': 'onSetLetterbox'
'level:set-letterbox': 'onSetLetterbox'
'tome:thang-list-entry-popover-shown': 'onThangListEntryPopoverShown'
'surface:coordinates-shown': 'onSurfaceCoordinatesShown'
@ -83,7 +83,7 @@ module.exports = class ThangListEntryView extends CocoView
onClick: (e) ->
return unless @controlsEnabled
@sortSpells()
Backbone.Mediator.publish 'level-select-sprite', thangID: @thang.id, spellName: @spells[0]?.name
Backbone.Mediator.publish 'level:select-sprite', thangID: @thang.id, spellName: @spells[0]?.name
onMouseEnter: (e) ->
return unless @controlsEnabled and @spells.length
@ -122,7 +122,7 @@ module.exports = class ThangListEntryView extends CocoView
@popover.mouseleave (e) => @hideSpells()
thangID = @thang.id
@popover.find('code').click (e) ->
Backbone.Mediator.publish 'level-select-sprite', thangID: thangID, spellName: $(@).data 'spell-name'
Backbone.Mediator.publish 'level:select-sprite', thangID: thangID, spellName: $(@).data 'spell-name'
Backbone.Mediator.publish 'tome:thang-list-entry-popover-shown', entry: @
hideSpells: =>

Some files were not shown because too many files have changed in this diff Show more