summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles')
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/_walls.js51
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/undo.js75
-rw-r--r--public/assets/javascripts/rectangles/models/wall.js99
-rw-r--r--public/assets/javascripts/rectangles/util/minotaur.js2
-rw-r--r--public/assets/javascripts/rectangles/util/undostack.js13
5 files changed, 125 insertions, 115 deletions
diff --git a/public/assets/javascripts/rectangles/engine/rooms/_walls.js b/public/assets/javascripts/rectangles/engine/rooms/_walls.js
index f5ef6be..f2f395b 100644
--- a/public/assets/javascripts/rectangles/engine/rooms/_walls.js
+++ b/public/assets/javascripts/rectangles/engine/rooms/_walls.js
@@ -73,13 +73,56 @@
}
base.serialize = function(){
- return []
+ var data = []
+ base.list.forEach(function(wall){
+ data.push(wall.serialize())
+ })
+ return data
}
base.deserialize = function(walls_data){
- return []
- }
-
+ walls_data.forEach(function(wall_data){
+ if (! wall_data) { return }
+ var wall = base.lookup[ wall_data.id ]
+ wall.deserialize( wall_data )
+ })
+ },
+
+ base.setColor = {
+
+ wall: function(rgb){
+ var rgbaColor = rgba_string(rgb, app.defaults.wallOpacity)
+ Walls.colors.wall = rgb
+ Walls.forEach(function(wall){
+ wall.outline(rgbaColor, null)
+ })
+ },
+
+ outline: function(rgb){
+ var rgbColor = rgb_string(rgb)
+ Walls.colors.outline = rgb
+ Walls.forEach(function(wall){
+ wall.outline(null, rgbColor)
+ })
+ },
+
+ floor: function(rgb){
+ var rgbColor = rgb_string(rgb)
+ Walls.colors.floor = rgb
+ Rooms.forEach(function(room){
+ room.setFloorColor(rgbColor)
+ })
+ },
+
+ ceiling: function(rgb){
+ var rgbColor = rgb_string(rgb)
+ Walls.colors.ceiling = rgb
+ Rooms.forEach(function(room){
+ room.setCeilingColor(rgbColor)
+ })
+ },
+
+ }
}
if ('window' in this) {
diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js
index a7e7d61..ac9fdc0 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/undo.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js
@@ -1,7 +1,7 @@
(function(){
- UndoStack.register([
- {
- type: "create-scenery",
+ UndoStack.register([
+ {
+ type: "create-scenery",
undo: function(state){
Scenery.remove(state.id)
@@ -14,9 +14,9 @@
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
- },
- {
- type: "update-scenery",
+ },
+ {
+ type: "update-scenery",
undo: function(state){
var scenery = Scenery.find(state.id)
scenery.deserialize(state)
@@ -43,9 +43,9 @@
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
- },
- {
- type: "destroy-scenery",
+ },
+ {
+ type: "destroy-scenery",
undo: function(state){
Scenery.deserialize([ state ])
@@ -58,12 +58,12 @@
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
- },
-
- //
-
- {
- type: "create-room",
+ },
+
+ //
+
+ {
+ type: "create-room",
undo: function(room){
Rooms.remove(room)
Rooms.clipper.update()
@@ -71,48 +71,55 @@
redo: function(room){
Rooms.add(new Room(room))
Rooms.clipper.update()
- app.tube("builder-pick-room", room)
+ app.tube("builder-pick-room", room)
},
- },
- {
- type: "update-room",
+ },
+ {
+ type: "update-room",
undo: function(state){
var room = Rooms.list[state.id]
room.rect.assign( state.rect )
room.height = state.height
Rooms.clipper.update()
- app.tube("builder-pick-room", room)
+ app.tube("builder-pick-room", room)
},
redo: function(state){
var room = Rooms.list[state.id]
room.rect.assign( state.rect )
room.height = state.height
Rooms.clipper.update()
- app.tube("builder-pick-room", room)
+ app.tube("builder-pick-room", room)
},
- },
- {
- type: "destroy-room",
+ },
+ {
+ type: "destroy-room",
undo: function(room){
Rooms.add(new Room(room))
Rooms.clipper.update()
- app.tube("builder-pick-room", room)
+ app.tube("builder-pick-room", room)
},
redo: function(room){
Rooms.remove(room)
Rooms.clipper.update()
},
- },
-
- //
+ },
+
+ //
- {
- type: "update-wallpaper",
+ {
+ type: "update-wallpaper",
undo: function(state){
+ var wall = Walls.lookup[state.id]
+ wall.deserialize(state)
},
- redo: function(state){
+ },
+ {
+ type: "update-colors",
+ undo: function(state){
+ Walls.setColor[ state.mode ]( state.rgb )
+ app.router.editorView.lightControl.setSwatchColor( state.mode, state.rgb )
},
- },
-
- ])
+ },
+
+ ])
})()
diff --git a/public/assets/javascripts/rectangles/models/wall.js b/public/assets/javascripts/rectangles/models/wall.js
index d606fac..05a78f7 100644
--- a/public/assets/javascripts/rectangles/models/wall.js
+++ b/public/assets/javascripts/rectangles/models/wall.js
@@ -19,6 +19,7 @@
this.side = opt.side
this.surface = opt.surface
this.mx = opt.mx
+ this.background = ""
}
Wall.prototype.toString = function(){
@@ -63,7 +64,7 @@
e.stopPropagation()
return
}
-
+
UndoStack.push({
type: 'create-scenery',
undo: { id: scenery.id },
@@ -74,7 +75,17 @@
Minotaur.watch( app.router.editorView.settings )
}
else if (Scenery.nextWallpaper) {
- base.wallpaper()
+ var oldState = base.serialize()
+ base.wallpaper(Scenery.nextWallpaper)
+ Scenery.nextWallpaper = null
+
+ UndoStack.push({
+ type: 'update-wallpaper',
+ undo: oldState,
+ redo: base.serialize(),
+ })
+
+ Minotaur.watch( app.router.editorView.settings )
}
else {
app.controller.hideExtras()
@@ -91,6 +102,17 @@
// this.outline(wallColor, outlineColor)
}
+
+ Wall.prototype.serialize = function(){
+ return {
+ id: this.id,
+ background: this.background,
+ }
+ }
+
+ Wall.prototype.deserialize = function(data){
+ this.wallpaper( data.background )
+ }
// wall
@@ -147,69 +169,26 @@
position.a -= dimension.a / 2
position.b -= dimension.b / 2
}
-// if (mx.width) { position.a -= mx.width / 2 }
-// if (mx.height) { position.b -= mx.height / 2 }
return position
}
- Wall.prototype.bounds_for = function(img, scale) {
- scale = scale || 1
- var coord = this.side & FRONT_BACK ? this.rect.x : this.rect.y
- var halfWidth = img.width/2 * scale
- var halfHeight = img.height/2 * scale
-
- return new Rect( new vec2( coord.a + halfWidth, coord.b - halfWidth ),
- new vec2( halfHeight, Rooms.list[this.room].height - halfHeight ) )
- }
-
- Wall.prototype.fits = function(img, scale){
- if (this.side & FRONT_BACK && this.rect.x.length() < img.width * scale) {
- return false
- }
- if (this.side & LEFT_RIGHT && this.rect.y.length() < img.width * scale) {
- return false
- }
- return true
- }
-
- Wall.prototype.center = function(offset){
-
- switch (this.side) {
- case FRONT:
- x = this.vec.midpoint()
- z = this.edge + painting_distance_from_wall
- break
- case BACK:
- x = this.vec.midpoint()
- z = this.edge - painting_distance_from_wall
- break
- case LEFT:
- x = this.edge + painting_distance_from_wall
- z = this.vec.midpoint()
- break
- case RIGHT:
- x = this.edge - painting_distance_from_wall
- z = this.vec.midpoint()
- break
- }
-
- return new vec2 (x, z)
- }
-
Wall.prototype.color = function(color){
this.$walls.css("background-color", color)
}
- Wall.prototype.wallpaper = function(){
+ Wall.prototype.wallpaper = function(background){
var useX = this.side & FRONT_BACK
var shouldFlip = this.side & (LEFT | BACK)
+
+ this.background = background || "none"
+
this.mx.forEach(function(mx){
var partitionOffset = useX ? mx.x : mx.z
if (shouldFlip) partitionOffset *= -1
partitionOffset += mx.width/2
var floorOffset = mx.y + mx.height/2
- mx.el.style.backgroundImage = Scenery.nextWallpaper
+ mx.el.style.backgroundImage = background
mx.el.style.backgroundPosition = (~~partitionOffset) + "px " + (~~floorOffset) + "px"
})
}
@@ -250,26 +229,6 @@
})
}
- Wall.prototype.siblings = function(){
- return this
- }
-
- Wall.prototype.stroke_colors = function(){
- var color = "#fff"
- var len = this.mx.length-1
- this.mx.forEach(function(mx, i){
- w.color(color)
- if (i == 0) {
- mx.el.css("border-left", "1px solid #000")
- }
- if (i == len) {
- mx.el.css("border-right", "1px solid #000")
- }
- mx.el.css("border-top", "1px solid #000")
- mx.el.css("border-bottom", "1px solid #000")
- })
- }
-
if ('window' in this) {
window.Wall = Wall
}
diff --git a/public/assets/javascripts/rectangles/util/minotaur.js b/public/assets/javascripts/rectangles/util/minotaur.js
index 039a053..e6a37e0 100644
--- a/public/assets/javascripts/rectangles/util/minotaur.js
+++ b/public/assets/javascripts/rectangles/util/minotaur.js
@@ -4,7 +4,7 @@
var base = this
base.$el = $("#minotaur")
base.timeout = null
- base.delay = 500
+ base.delay = 1000
base.objects = {}
base.init = function () {
diff --git a/public/assets/javascripts/rectangles/util/undostack.js b/public/assets/javascripts/rectangles/util/undostack.js
index b93c79e..959e3d1 100644
--- a/public/assets/javascripts/rectangles/util/undostack.js
+++ b/public/assets/javascripts/rectangles/util/undostack.js
@@ -31,16 +31,17 @@
this.types[ action.type ].redo(action.redo)
return this.pointer < this.stack.length-1
}
- UndoStack.prototype.register = function(actionType){
- if (actionType.length) {
- actionType.forEach(this.registerOne.bind(this))
+ UndoStack.prototype.register = function(actions){
+ if (actions.length) {
+ actions.forEach(this.registerOne.bind(this))
}
else {
- this.registerOne(actionType)
+ this.registerOne(actions)
}
}
- UndoStack.prototype.registerOne = function(actionType){
- this.types[ actionType.type ] = actionType
+ UndoStack.prototype.registerOne = function(action){
+ if (! action.redo) { action.redo = action.undo }
+ this.types[ action.type ] = action
}
if ('window' in this) {
window.UndoStack = new UndoStack