2014-07-17 20:20:11 -04:00
|
|
|
CocoView = require 'views/kinds/CocoView'
|
2014-01-03 13:32:13 -05:00
|
|
|
template = require 'templates/play/level/tome/cast_button'
|
|
|
|
{me} = require 'lib/auth'
|
|
|
|
|
2014-07-17 20:20:11 -04:00
|
|
|
module.exports = class CastButtonView extends CocoView
|
2014-01-03 13:32:13 -05:00
|
|
|
id: 'cast-button-view'
|
|
|
|
template: template
|
|
|
|
|
2014-03-24 13:11:27 -04:00
|
|
|
events:
|
|
|
|
'click .cast-button': 'onCastButtonClick'
|
2014-08-23 17:31:38 -04:00
|
|
|
'click .cast-real-time-button': 'onCastRealTimeButtonClick'
|
2014-03-24 13:11:27 -04:00
|
|
|
|
2014-01-03 13:32:13 -05:00
|
|
|
subscriptions:
|
2014-06-30 22:16:26 -04:00
|
|
|
'tome:spell-changed': 'onSpellChanged'
|
2014-01-03 13:32:13 -05:00
|
|
|
'tome:cast-spells': 'onCastSpells'
|
|
|
|
'god:world-load-progress-changed': 'onWorldLoadProgressChanged'
|
|
|
|
'god:new-world-created': 'onNewWorld'
|
|
|
|
|
|
|
|
constructor: (options) ->
|
|
|
|
super options
|
|
|
|
@spells = options.spells
|
2014-02-19 17:00:54 -05:00
|
|
|
@levelID = options.levelID
|
2014-06-30 22:16:26 -04:00
|
|
|
@castShortcut = '⇧↵'
|
|
|
|
@castShortcutVerbose = 'Shift+Enter'
|
2014-08-23 17:31:38 -04:00
|
|
|
@castRealTimeShortcutVerbose = 'Ctrl+Shift+Enter'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
2014-02-11 17:58:45 -05:00
|
|
|
getRenderData: (context={}) ->
|
2014-01-03 13:32:13 -05:00
|
|
|
context = super context
|
|
|
|
context.castShortcutVerbose = @castShortcutVerbose
|
2014-08-23 17:31:38 -04:00
|
|
|
context.castRealTimeShortcutVerbose = @castRealTimeShortcutVerbose
|
2014-01-03 13:32:13 -05:00
|
|
|
context
|
|
|
|
|
|
|
|
afterRender: ->
|
|
|
|
super()
|
2014-02-12 15:41:41 -05:00
|
|
|
@castButton = $('.cast-button', @$el)
|
|
|
|
@castButtonGroup = $('.cast-button-group', @$el)
|
|
|
|
@castOptions = $('.autocast-delays', @$el)
|
2014-03-21 16:04:16 -04:00
|
|
|
delay = me.get('autocastDelay')
|
2014-08-23 17:31:38 -04:00
|
|
|
delay ?= 90019001
|
2014-01-03 13:32:13 -05:00
|
|
|
@setAutocastDelay delay
|
|
|
|
|
2014-01-25 18:11:29 -05:00
|
|
|
attachTo: (spellView) ->
|
|
|
|
@$el.detach().prependTo(spellView.toolbarView.$el).show()
|
|
|
|
|
2014-02-12 23:45:29 -05:00
|
|
|
onCastButtonClick: (e) ->
|
|
|
|
Backbone.Mediator.publish 'tome:manual-cast', {}
|
|
|
|
|
2014-08-23 17:31:38 -04:00
|
|
|
onCastRealTimeButtonClick: (e) ->
|
|
|
|
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
|
|
|
|
|
2014-02-13 20:43:42 -05:00
|
|
|
onCastOptionsClick: (e) =>
|
2014-06-25 00:07:36 -04:00
|
|
|
Backbone.Mediator.publish 'tome:focus-editor'
|
2014-02-12 15:41:41 -05:00
|
|
|
@castButtonGroup.removeClass 'open'
|
|
|
|
@setAutocastDelay $(e.target).attr 'data-delay'
|
|
|
|
false
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
onSpellChanged: (e) ->
|
|
|
|
@updateCastButton()
|
|
|
|
|
|
|
|
onCastSpells: (e) ->
|
2014-05-11 20:42:32 -04:00
|
|
|
return if e.preload
|
2014-01-03 13:32:13 -05:00
|
|
|
@casting = true
|
2014-05-20 00:53:14 -04:00
|
|
|
if @hasStartedCastingOnce # Don't play this sound the first time
|
|
|
|
Backbone.Mediator.publish 'play-sound', trigger: 'cast', volume: 0.5
|
|
|
|
@hasStartedCastingOnce = true
|
2014-01-03 13:32:13 -05:00
|
|
|
@updateCastButton()
|
2014-02-19 21:04:37 -05:00
|
|
|
@onWorldLoadProgressChanged progress: 0
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
onWorldLoadProgressChanged: (e) ->
|
2014-02-28 14:05:41 -05:00
|
|
|
return # trying out showing progress on the canvas instead
|
2014-01-03 13:32:13 -05:00
|
|
|
overlay = @castButtonGroup.find '.button-progress-overlay'
|
2014-02-22 20:50:45 -05:00
|
|
|
overlay.css 'width', e.progress * @castButton.outerWidth() + 1
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
onNewWorld: (e) ->
|
|
|
|
@casting = false
|
2014-05-20 00:53:14 -04:00
|
|
|
if @hasCastOnce # Don't play this sound the first time
|
|
|
|
Backbone.Mediator.publish 'play-sound', trigger: 'cast-end', volume: 0.5
|
|
|
|
@hasCastOnce = true
|
2014-01-03 13:32:13 -05:00
|
|
|
@updateCastButton()
|
|
|
|
|
|
|
|
updateCastButton: ->
|
|
|
|
return if _.some @spells, (spell) => not spell.loaded
|
2014-04-22 14:04:56 -04:00
|
|
|
|
2014-04-22 11:54:35 -04:00
|
|
|
async.some _.values(@spells), (spell, callback) =>
|
|
|
|
spell.hasChangedSignificantly spell.getSource(), null, callback
|
|
|
|
, (castable) =>
|
2014-05-19 13:08:12 -04:00
|
|
|
Backbone.Mediator.publish 'tome:spell-has-changed-significantly-calculation', hasChangedSignificantly: castable
|
2014-04-22 11:54:35 -04:00
|
|
|
@castButtonGroup.toggleClass('castable', castable).toggleClass('casting', @casting)
|
|
|
|
if @casting
|
2014-06-30 22:16:26 -04:00
|
|
|
s = $.i18n.t('play_level.tome_cast_button_casting', defaultValue: 'Casting')
|
2014-04-22 11:54:35 -04:00
|
|
|
else if castable
|
2014-06-30 22:16:26 -04:00
|
|
|
s = $.i18n.t('play_level.tome_cast_button_castable', defaultValue: 'Cast Spell') + ' ' + @castShortcut
|
2014-04-22 11:54:35 -04:00
|
|
|
else
|
2014-06-30 22:16:26 -04:00
|
|
|
s = $.i18n.t('play_level.tome_cast_button_cast', defaultValue: 'Spell Cast')
|
2014-04-22 11:54:35 -04:00
|
|
|
@castButton.text s
|
|
|
|
@castButton.prop 'disabled', not castable
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
setAutocastDelay: (delay) ->
|
2014-06-30 22:16:26 -04:00
|
|
|
#console.log 'Set autocast delay to', delay
|
2014-01-03 13:32:13 -05:00
|
|
|
return unless delay
|
|
|
|
@autocastDelay = delay = parseInt delay
|
2014-03-21 16:04:16 -04:00
|
|
|
me.set('autocastDelay', delay)
|
2014-06-11 17:17:31 -04:00
|
|
|
me.patch()
|
2014-01-03 13:32:13 -05:00
|
|
|
spell.view.setAutocastDelay delay for spellKey, spell of @spells
|
|
|
|
@castOptions.find('a').each ->
|
|
|
|
$(@).toggleClass('selected', parseInt($(@).attr('data-delay')) is delay)
|