Sending flag history to the World for to make flag Thangs during simulation.
This commit is contained in:
parent
2e23247521
commit
f59084e651
12 changed files with 93 additions and 29 deletions
app
|
@ -459,9 +459,9 @@ self.finalizePreload = function finalizePreload() {
|
||||||
self.world.finalizePreload(self.onWorldLoaded);
|
self.world.finalizePreload(self.onWorldLoaded);
|
||||||
};
|
};
|
||||||
|
|
||||||
self.updateFlags = function updateFlags(flags) {
|
self.addFlagEvent = function addFlagEvent(flagEvent) {
|
||||||
if(!self.world || self.world.framesSerializedSoFar == self.world.frames.length) return;
|
if(!self.world || self.world.framesSerializedSoFar == self.world.frames.length) return;
|
||||||
self.world.updateFlags(flags);
|
self.world.addFlagEvent(flagEvent);
|
||||||
};
|
};
|
||||||
|
|
||||||
self.addEventListener('message', function(event) {
|
self.addEventListener('message', function(event) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ module.exports = class Angel extends CocoClass
|
||||||
abortTimeoutDuration: 500 # give in-process or dying workers this long to give up
|
abortTimeoutDuration: 500 # give in-process or dying workers this long to give up
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
|
'level:flag-updated': 'onFlagEvent'
|
||||||
|
|
||||||
constructor: (@shared) ->
|
constructor: (@shared) ->
|
||||||
super()
|
super()
|
||||||
|
@ -208,10 +208,9 @@ module.exports = class Angel extends CocoClass
|
||||||
@worker.addEventListener 'message', @onWorkerMessage
|
@worker.addEventListener 'message', @onWorkerMessage
|
||||||
@worker.creationTime = new Date()
|
@worker.creationTime = new Date()
|
||||||
|
|
||||||
onSelfWizardTargetChanged: (e) ->
|
onFlagEvent: (e) ->
|
||||||
return unless @running and @work.realTime
|
return unless @running and @work.realTime
|
||||||
targetPos = e.sender.targetPos
|
@worker.postMessage func: 'addFlagEvent', args: e
|
||||||
@worker.postMessage func: 'updateFlags', args: [{type: 'wizard', targetPos: targetPos}]
|
|
||||||
|
|
||||||
|
|
||||||
#### Synchronous code for running worlds on main thread (profiling / IE9) ####
|
#### Synchronous code for running worlds on main thread (profiling / IE9) ####
|
||||||
|
|
|
@ -35,10 +35,6 @@ module.exports = class CoordinateDisplay extends createjs.Container
|
||||||
onMouseOut: (e) -> @mouseInBounds = false
|
onMouseOut: (e) -> @mouseInBounds = false
|
||||||
|
|
||||||
onMouseMove: (e) ->
|
onMouseMove: (e) ->
|
||||||
if @mouseInBounds and key.shift
|
|
||||||
$('#surface').addClass('flag-cursor') unless $('#surface').hasClass('flag-cursor')
|
|
||||||
else if @mouseInBounds
|
|
||||||
$('#surface').removeClass('flag-cursor') if $('#surface').hasClass('flag-cursor')
|
|
||||||
wop = @camera.screenToWorld x: e.x, y: e.y
|
wop = @camera.screenToWorld x: e.x, y: e.y
|
||||||
wop.x = Math.round(wop.x)
|
wop.x = Math.round(wop.x)
|
||||||
wop.y = Math.round(wop.y)
|
wop.y = Math.round(wop.y)
|
||||||
|
|
|
@ -37,6 +37,8 @@ module.exports = class Label extends CocoClass
|
||||||
build: ->
|
build: ->
|
||||||
@layer.removeChild @background if @background
|
@layer.removeChild @background if @background
|
||||||
@layer.removeChild @label if @label
|
@layer.removeChild @label if @label
|
||||||
|
@label = null
|
||||||
|
@background = null
|
||||||
return unless @text # null or '' should both be skipped
|
return unless @text # null or '' should both be skipped
|
||||||
o = @buildLabelOptions()
|
o = @buildLabelOptions()
|
||||||
@layer.addChild @label = @buildLabel o
|
@layer.addChild @label = @buildLabel o
|
||||||
|
@ -53,6 +55,17 @@ module.exports = class Label extends CocoClass
|
||||||
@label.y = @background.y = @sprite.imageObject.y + offset.y
|
@label.y = @background.y = @sprite.imageObject.y + offset.y
|
||||||
null
|
null
|
||||||
|
|
||||||
|
show: ->
|
||||||
|
return unless @label
|
||||||
|
@layer.addChild @label
|
||||||
|
@layer.addChild @background
|
||||||
|
@layer.updateLayerOrder()
|
||||||
|
|
||||||
|
hide: ->
|
||||||
|
return unless @label
|
||||||
|
@layer.removeChild @background
|
||||||
|
@layer.removeChild @label
|
||||||
|
|
||||||
buildLabelOptions: ->
|
buildLabelOptions: ->
|
||||||
o = {}
|
o = {}
|
||||||
st = {dialogue: 'D', say: 'S', name: 'N'}[@style]
|
st = {dialogue: 'D', say: 'S', name: 'N'}[@style]
|
||||||
|
|
|
@ -69,6 +69,7 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
'camera:zoom-updated': 'onZoomUpdated'
|
'camera:zoom-updated': 'onZoomUpdated'
|
||||||
'playback:real-time-playback-started': 'onRealTimePlaybackStarted'
|
'playback:real-time-playback-started': 'onRealTimePlaybackStarted'
|
||||||
'playback:real-time-playback-ended': 'onRealTimePlaybackEnded'
|
'playback:real-time-playback-ended': 'onRealTimePlaybackEnded'
|
||||||
|
'level:flag-selected': 'onFlagSelected'
|
||||||
|
|
||||||
shortcuts:
|
shortcuts:
|
||||||
'ctrl+\\, ⌘+\\': 'onToggleDebug'
|
'ctrl+\\, ⌘+\\': 'onToggleDebug'
|
||||||
|
@ -526,7 +527,9 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
onMouseDown: (e) =>
|
onMouseDown: (e) =>
|
||||||
return if @disabled
|
return if @disabled
|
||||||
onBackground = not @stage.hitTest e.stageX, e.stageY
|
onBackground = not @stage.hitTest e.stageX, e.stageY
|
||||||
Backbone.Mediator.publish 'surface:stage-mouse-down', onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e
|
event = onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e
|
||||||
|
Backbone.Mediator.publish 'surface:stage-mouse-down', event
|
||||||
|
@placeFlag event if @realTime
|
||||||
|
|
||||||
onMouseUp: (e) =>
|
onMouseUp: (e) =>
|
||||||
return if @disabled
|
return if @disabled
|
||||||
|
@ -616,10 +619,35 @@ module.exports = Surface = class Surface extends CocoClass
|
||||||
onRealTimePlaybackStarted: (e) ->
|
onRealTimePlaybackStarted: (e) ->
|
||||||
@realTime = true
|
@realTime = true
|
||||||
@onResize()
|
@onResize()
|
||||||
|
@spriteBoss.selfWizardSprite?.imageObject.visible = false
|
||||||
|
@flags = {}
|
||||||
|
@flagHistory = []
|
||||||
|
|
||||||
onRealTimePlaybackEnded: (e) ->
|
onRealTimePlaybackEnded: (e) ->
|
||||||
@realTime = false
|
@realTime = false
|
||||||
@onResize()
|
@onResize()
|
||||||
|
@spriteBoss.selfWizardSprite?.imageObject.visible = true
|
||||||
|
|
||||||
|
onFlagSelected: (e) ->
|
||||||
|
@canvas.addClass("flag-selected")
|
||||||
|
@flagColor = e.color
|
||||||
|
|
||||||
|
placeFlag: (e) ->
|
||||||
|
return unless @flagColor
|
||||||
|
wop = @camera.screenToWorld x: e.x, y: e.y
|
||||||
|
targetPos = x: wop.x, y: wop.y
|
||||||
|
flag = player: me.id, team: me.team, color: @flagColor, targetPos: targetPos, time: @world.dt * @world.frames.length + 1, active: true
|
||||||
|
@flags[@flagColor] = flag
|
||||||
|
@flagHistory.push flag
|
||||||
|
Backbone.Mediator.publish 'level:flag-updated', flag
|
||||||
|
console.log 'trying to place flag at', @world.dt * @currentFrame, 'and think it will happen by', flag.time
|
||||||
|
|
||||||
|
removeFlag: (e) ->
|
||||||
|
delete @flags[e.color]
|
||||||
|
console.log e.color, 'deleted'
|
||||||
|
flag = player: me.id, team: me.team, color: e.color, time: @world.dt * @world.frames.length + 1, active: false
|
||||||
|
@flagHistory.push flag
|
||||||
|
Backbone.Mediator.publish 'level:flag-updated', flag
|
||||||
|
|
||||||
# paths - TODO: move to SpriteBoss? but only update on frame drawing instead of on every frame update?
|
# paths - TODO: move to SpriteBoss? but only update on frame drawing instead of on every frame update?
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,6 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
@targetPos = @thang.pos
|
@targetPos = @thang.pos
|
||||||
if @isSelf
|
if @isSelf
|
||||||
@setNameLabel me.displayName()
|
@setNameLabel me.displayName()
|
||||||
@setColorHue me.get('wizardColor1')
|
|
||||||
else if options.name
|
else if options.name
|
||||||
@setNameLabel options.name
|
@setNameLabel options.name
|
||||||
|
|
||||||
|
@ -66,7 +65,6 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
continue if playerID is me.id # ignore changes for self wizard sprite
|
continue if playerID is me.id # ignore changes for self wizard sprite
|
||||||
@setNameLabel state.name
|
@setNameLabel state.name
|
||||||
continue unless state.wizard?
|
continue unless state.wizard?
|
||||||
@setColorHue state.wizard.wizardColor1
|
|
||||||
if targetID = state.wizard.targetSprite
|
if targetID = state.wizard.targetSprite
|
||||||
return console.warn 'Wizard Sprite couldn\'t find target sprite', targetID unless targetID of @options.sprites
|
return console.warn 'Wizard Sprite couldn\'t find target sprite', targetID unless targetID of @options.sprites
|
||||||
@setTarget @options.sprites[targetID]
|
@setTarget @options.sprites[targetID]
|
||||||
|
@ -91,17 +89,13 @@ module.exports = class WizardSprite extends IndieSprite
|
||||||
@imageObject.scaleX = @imageObject.scaleY = @imageObject.alpha = 0
|
@imageObject.scaleX = @imageObject.scaleY = @imageObject.alpha = 0
|
||||||
createjs.Tween.get(@imageObject)
|
createjs.Tween.get(@imageObject)
|
||||||
.to({scaleX: 1, scaleY: 1, alpha: 1}, 1000, createjs.Ease.getPowInOut(2.2))
|
.to({scaleX: 1, scaleY: 1, alpha: 1}, 1000, createjs.Ease.getPowInOut(2.2))
|
||||||
|
@labels.name?.show()
|
||||||
|
|
||||||
animateOut: (callback) ->
|
animateOut: (callback) ->
|
||||||
tween = createjs.Tween.get(@imageObject)
|
tween = createjs.Tween.get(@imageObject)
|
||||||
.to({scaleX: 0, scaleY: 0, alpha: 0}, 1000, createjs.Ease.getPowInOut(2.2))
|
.to({scaleX: 0, scaleY: 0, alpha: 0}, 1000, createjs.Ease.getPowInOut(2.2))
|
||||||
tween.call(callback) if callback
|
tween.call(callback) if callback
|
||||||
|
@labels.name?.hide()
|
||||||
setColorHue: (newColorHue) ->
|
|
||||||
# TODO: is this needed any more?
|
|
||||||
return if @colorHue is newColorHue
|
|
||||||
@colorHue = newColorHue
|
|
||||||
#@updateColorFilters()
|
|
||||||
|
|
||||||
setEditing: (@editing) ->
|
setEditing: (@editing) ->
|
||||||
if @editing
|
if @editing
|
||||||
|
|
|
@ -36,6 +36,7 @@ module.exports = class World
|
||||||
@systems = []
|
@systems = []
|
||||||
@systemMap = {}
|
@systemMap = {}
|
||||||
@scriptNotes = []
|
@scriptNotes = []
|
||||||
|
@flagHistory = []
|
||||||
@rand = new Rand 0 # Existence System may change this seed
|
@rand = new Rand 0 # Existence System may change this seed
|
||||||
@frames = [new WorldFrame(@, 0)]
|
@frames = [new WorldFrame(@, 0)]
|
||||||
|
|
||||||
|
@ -169,8 +170,8 @@ module.exports = class World
|
||||||
abort: ->
|
abort: ->
|
||||||
@aborted = true
|
@aborted = true
|
||||||
|
|
||||||
updateFlags: (@flags) ->
|
addFlagEvent: (flagEvent) ->
|
||||||
console.log "updated flags", @flags
|
@flagHistory.push flagEvent
|
||||||
|
|
||||||
loadFromLevel: (level, willSimulate=true) ->
|
loadFromLevel: (level, willSimulate=true) ->
|
||||||
@levelComponents = level.levelComponents
|
@levelComponents = level.levelComponents
|
||||||
|
|
|
@ -57,6 +57,39 @@ module.exports =
|
||||||
'level:victory-hidden':
|
'level:victory-hidden':
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
|
'level:flag-selected':
|
||||||
|
type: 'object'
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
color:
|
||||||
|
type: 'string'
|
||||||
|
enum: ['red', 'green', 'blue']
|
||||||
|
|
||||||
|
'level:flag-updated':
|
||||||
|
type: 'object'
|
||||||
|
additionalProperties: false
|
||||||
|
required: ['player', 'color', 'time', 'active']
|
||||||
|
properties:
|
||||||
|
player:
|
||||||
|
type: 'string'
|
||||||
|
team:
|
||||||
|
type: 'string'
|
||||||
|
color:
|
||||||
|
type: 'string'
|
||||||
|
enum: ['red', 'green', 'blue']
|
||||||
|
time:
|
||||||
|
type: 'number'
|
||||||
|
minimum: 0
|
||||||
|
active:
|
||||||
|
type: 'boolean'
|
||||||
|
targetPos:
|
||||||
|
type: 'object'
|
||||||
|
additionalProperties: false
|
||||||
|
required: ['x', 'y']
|
||||||
|
properties:
|
||||||
|
x: {type: 'number'}
|
||||||
|
y: {type: 'number'}
|
||||||
|
|
||||||
'next-game-pressed':
|
'next-game-pressed':
|
||||||
{} # TODO schema
|
{} # TODO schema
|
||||||
|
|
||||||
|
|
|
@ -225,10 +225,6 @@ table.table
|
||||||
.ui-slider-handle
|
.ui-slider-handle
|
||||||
border: 1px solid black !important
|
border: 1px solid black !important
|
||||||
|
|
||||||
.flag-cursor
|
|
||||||
cursor: crosshair
|
|
||||||
|
|
||||||
|
|
||||||
// Fonts
|
// Fonts
|
||||||
|
|
||||||
.header-font
|
.header-font
|
||||||
|
|
|
@ -46,7 +46,10 @@ body.is-playing
|
||||||
display: block
|
display: block
|
||||||
z-index: 1
|
z-index: 1
|
||||||
@include transition(0.5s ease-out)
|
@include transition(0.5s ease-out)
|
||||||
|
|
||||||
|
&.flag-selected
|
||||||
|
cursor: crosshair
|
||||||
|
|
||||||
min-width: 1024px
|
min-width: 1024px
|
||||||
position: relative
|
position: relative
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,9 @@ module.exports = class PlayLevelView extends RootView
|
||||||
|
|
||||||
shortcuts:
|
shortcuts:
|
||||||
'ctrl+s': 'onCtrlS'
|
'ctrl+s': 'onCtrlS'
|
||||||
|
'r': -> Backbone.Mediator.publish 'level:flag-selected', color: 'red'
|
||||||
|
'g': -> Backbone.Mediator.publish 'level:flag-selected', color: 'green'
|
||||||
|
'b': -> Backbone.Mediator.publish 'level:flag-selected', color: 'blue'
|
||||||
|
|
||||||
# Initial Setup #############################################################
|
# Initial Setup #############################################################
|
||||||
|
|
||||||
|
@ -517,7 +520,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
|
|
||||||
# Real-time playback
|
# Real-time playback
|
||||||
onRealTimePlaybackStarted: (e) ->
|
onRealTimePlaybackStarted: (e) ->
|
||||||
@$el.addClass 'real-time'
|
@$el.addClass('real-time').focus()
|
||||||
@onWindowResize()
|
@onWindowResize()
|
||||||
|
|
||||||
onRealTimePlaybackEnded: (e) ->
|
onRealTimePlaybackEnded: (e) ->
|
||||||
|
|
|
@ -43,11 +43,9 @@ module.exports = class CastButtonView extends CocoView
|
||||||
@$el.detach().prependTo(spellView.toolbarView.$el).show()
|
@$el.detach().prependTo(spellView.toolbarView.$el).show()
|
||||||
|
|
||||||
onCastButtonClick: (e) ->
|
onCastButtonClick: (e) ->
|
||||||
console.log "cas fast yo"
|
|
||||||
Backbone.Mediator.publish 'tome:manual-cast', {}
|
Backbone.Mediator.publish 'tome:manual-cast', {}
|
||||||
|
|
||||||
onCastRealTimeButtonClick: (e) ->
|
onCastRealTimeButtonClick: (e) ->
|
||||||
console.log "cas real time yo"
|
|
||||||
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
|
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
|
||||||
|
|
||||||
onCastOptionsClick: (e) =>
|
onCastOptionsClick: (e) =>
|
||||||
|
|
Reference in a new issue