mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-26 14:03:28 -04:00
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.updateFlags = function updateFlags(flags) {
|
||||
self.addFlagEvent = function addFlagEvent(flagEvent) {
|
||||
if(!self.world || self.world.framesSerializedSoFar == self.world.frames.length) return;
|
||||
self.world.updateFlags(flags);
|
||||
self.world.addFlagEvent(flagEvent);
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
subscriptions:
|
||||
'self-wizard:target-changed': 'onSelfWizardTargetChanged'
|
||||
'level:flag-updated': 'onFlagEvent'
|
||||
|
||||
constructor: (@shared) ->
|
||||
super()
|
||||
|
@ -208,10 +208,9 @@ module.exports = class Angel extends CocoClass
|
|||
@worker.addEventListener 'message', @onWorkerMessage
|
||||
@worker.creationTime = new Date()
|
||||
|
||||
onSelfWizardTargetChanged: (e) ->
|
||||
onFlagEvent: (e) ->
|
||||
return unless @running and @work.realTime
|
||||
targetPos = e.sender.targetPos
|
||||
@worker.postMessage func: 'updateFlags', args: [{type: 'wizard', targetPos: targetPos}]
|
||||
@worker.postMessage func: 'addFlagEvent', args: e
|
||||
|
||||
|
||||
#### 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
|
||||
|
||||
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.x = Math.round(wop.x)
|
||||
wop.y = Math.round(wop.y)
|
||||
|
|
|
@ -37,6 +37,8 @@ module.exports = class Label extends CocoClass
|
|||
build: ->
|
||||
@layer.removeChild @background if @background
|
||||
@layer.removeChild @label if @label
|
||||
@label = null
|
||||
@background = null
|
||||
return unless @text # null or '' should both be skipped
|
||||
o = @buildLabelOptions()
|
||||
@layer.addChild @label = @buildLabel o
|
||||
|
@ -53,6 +55,17 @@ module.exports = class Label extends CocoClass
|
|||
@label.y = @background.y = @sprite.imageObject.y + offset.y
|
||||
null
|
||||
|
||||
show: ->
|
||||
return unless @label
|
||||
@layer.addChild @label
|
||||
@layer.addChild @background
|
||||
@layer.updateLayerOrder()
|
||||
|
||||
hide: ->
|
||||
return unless @label
|
||||
@layer.removeChild @background
|
||||
@layer.removeChild @label
|
||||
|
||||
buildLabelOptions: ->
|
||||
o = {}
|
||||
st = {dialogue: 'D', say: 'S', name: 'N'}[@style]
|
||||
|
|
|
@ -69,6 +69,7 @@ module.exports = Surface = class Surface extends CocoClass
|
|||
'camera:zoom-updated': 'onZoomUpdated'
|
||||
'playback:real-time-playback-started': 'onRealTimePlaybackStarted'
|
||||
'playback:real-time-playback-ended': 'onRealTimePlaybackEnded'
|
||||
'level:flag-selected': 'onFlagSelected'
|
||||
|
||||
shortcuts:
|
||||
'ctrl+\\, ⌘+\\': 'onToggleDebug'
|
||||
|
@ -526,7 +527,9 @@ module.exports = Surface = class Surface extends CocoClass
|
|||
onMouseDown: (e) =>
|
||||
return if @disabled
|
||||
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) =>
|
||||
return if @disabled
|
||||
|
@ -616,10 +619,35 @@ module.exports = Surface = class Surface extends CocoClass
|
|||
onRealTimePlaybackStarted: (e) ->
|
||||
@realTime = true
|
||||
@onResize()
|
||||
@spriteBoss.selfWizardSprite?.imageObject.visible = false
|
||||
@flags = {}
|
||||
@flagHistory = []
|
||||
|
||||
onRealTimePlaybackEnded: (e) ->
|
||||
@realTime = false
|
||||
@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?
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ module.exports = class WizardSprite extends IndieSprite
|
|||
@targetPos = @thang.pos
|
||||
if @isSelf
|
||||
@setNameLabel me.displayName()
|
||||
@setColorHue me.get('wizardColor1')
|
||||
else if 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
|
||||
@setNameLabel state.name
|
||||
continue unless state.wizard?
|
||||
@setColorHue state.wizard.wizardColor1
|
||||
if targetID = state.wizard.targetSprite
|
||||
return console.warn 'Wizard Sprite couldn\'t find target sprite', targetID unless targetID of @options.sprites
|
||||
@setTarget @options.sprites[targetID]
|
||||
|
@ -91,17 +89,13 @@ module.exports = class WizardSprite extends IndieSprite
|
|||
@imageObject.scaleX = @imageObject.scaleY = @imageObject.alpha = 0
|
||||
createjs.Tween.get(@imageObject)
|
||||
.to({scaleX: 1, scaleY: 1, alpha: 1}, 1000, createjs.Ease.getPowInOut(2.2))
|
||||
@labels.name?.show()
|
||||
|
||||
animateOut: (callback) ->
|
||||
tween = createjs.Tween.get(@imageObject)
|
||||
.to({scaleX: 0, scaleY: 0, alpha: 0}, 1000, createjs.Ease.getPowInOut(2.2))
|
||||
tween.call(callback) if callback
|
||||
|
||||
setColorHue: (newColorHue) ->
|
||||
# TODO: is this needed any more?
|
||||
return if @colorHue is newColorHue
|
||||
@colorHue = newColorHue
|
||||
#@updateColorFilters()
|
||||
@labels.name?.hide()
|
||||
|
||||
setEditing: (@editing) ->
|
||||
if @editing
|
||||
|
|
|
@ -36,6 +36,7 @@ module.exports = class World
|
|||
@systems = []
|
||||
@systemMap = {}
|
||||
@scriptNotes = []
|
||||
@flagHistory = []
|
||||
@rand = new Rand 0 # Existence System may change this seed
|
||||
@frames = [new WorldFrame(@, 0)]
|
||||
|
||||
|
@ -169,8 +170,8 @@ module.exports = class World
|
|||
abort: ->
|
||||
@aborted = true
|
||||
|
||||
updateFlags: (@flags) ->
|
||||
console.log "updated flags", @flags
|
||||
addFlagEvent: (flagEvent) ->
|
||||
@flagHistory.push flagEvent
|
||||
|
||||
loadFromLevel: (level, willSimulate=true) ->
|
||||
@levelComponents = level.levelComponents
|
||||
|
|
|
@ -57,6 +57,39 @@ module.exports =
|
|||
'level:victory-hidden':
|
||||
{} # 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':
|
||||
{} # TODO schema
|
||||
|
||||
|
|
|
@ -225,10 +225,6 @@ table.table
|
|||
.ui-slider-handle
|
||||
border: 1px solid black !important
|
||||
|
||||
.flag-cursor
|
||||
cursor: crosshair
|
||||
|
||||
|
||||
// Fonts
|
||||
|
||||
.header-font
|
||||
|
|
|
@ -46,7 +46,10 @@ body.is-playing
|
|||
display: block
|
||||
z-index: 1
|
||||
@include transition(0.5s ease-out)
|
||||
|
||||
|
||||
&.flag-selected
|
||||
cursor: crosshair
|
||||
|
||||
min-width: 1024px
|
||||
position: relative
|
||||
|
||||
|
|
|
@ -72,6 +72,9 @@ module.exports = class PlayLevelView extends RootView
|
|||
|
||||
shortcuts:
|
||||
'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 #############################################################
|
||||
|
||||
|
@ -517,7 +520,7 @@ module.exports = class PlayLevelView extends RootView
|
|||
|
||||
# Real-time playback
|
||||
onRealTimePlaybackStarted: (e) ->
|
||||
@$el.addClass 'real-time'
|
||||
@$el.addClass('real-time').focus()
|
||||
@onWindowResize()
|
||||
|
||||
onRealTimePlaybackEnded: (e) ->
|
||||
|
|
|
@ -43,11 +43,9 @@ module.exports = class CastButtonView extends CocoView
|
|||
@$el.detach().prependTo(spellView.toolbarView.$el).show()
|
||||
|
||||
onCastButtonClick: (e) ->
|
||||
console.log "cas fast yo"
|
||||
Backbone.Mediator.publish 'tome:manual-cast', {}
|
||||
|
||||
onCastRealTimeButtonClick: (e) ->
|
||||
console.log "cas real time yo"
|
||||
Backbone.Mediator.publish 'tome:manual-cast', {realTime: true}
|
||||
|
||||
onCastOptionsClick: (e) =>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue