summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2014-12-01 13:46:57 -0500
committerJules Laplace <jules@okfoc.us>2014-12-01 13:46:57 -0500
commit15058f6c83da00b54f676b9fafbb758ddef0be84 (patch)
tree322a665434d83d78a2335e053591aab00a9c2060
parentdc4cd71e3a0585a419898c834360f42f5bd09bd4 (diff)
undo random scenery placement
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/_scenery.js3
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/randomize.js18
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/undo.js30
3 files changed, 47 insertions, 4 deletions
diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
index d03e0e1..d52fe21 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -99,6 +99,7 @@ var Scenery = new function(){
}
base.deserialize = function(scenery_data){
+ var added = []
scenery_data.forEach(function(data){
var wall = Walls.lookup[data.wall_id] || Walls.first()
var scene_media = base.add({
@@ -107,7 +108,9 @@ var Scenery = new function(){
media: data.media,
id: data.id
})
+ added.push(scene_media)
})
+ return added
}
return base
diff --git a/public/assets/javascripts/rectangles/engine/scenery/randomize.js b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
index 1c2eb56..6581f38 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/randomize.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
@@ -33,7 +33,7 @@ Scenery.randomize.get_dimensions = function (media_objs){
// Returns a lookup of walls to use, keyed by wall ID.
Scenery.randomize.get_empty_walls = function(wall_list){
// get a list of all walls
- var walls = {};
+ var walls = {}, removed = [];
(wall_list || Walls.list).forEach(function(wall){
walls[wall.id] = wall
@@ -44,6 +44,7 @@ Scenery.randomize.get_empty_walls = function(wall_list){
Scenery.forEach(function(scenery){
if (scenery.was_randomly_placed) {
// remove it and reuse this wall?
+ removed.push( scenery.serialize() )
Scenery.remove( scenery.id )
}
else {
@@ -52,7 +53,7 @@ Scenery.randomize.get_empty_walls = function(wall_list){
})
}
- return walls
+ return { walls: walls, removed: removed }
}
// Randomly place a set of media objects on empty walls.
@@ -60,7 +61,10 @@ Scenery.randomize.get_empty_walls = function(wall_list){
// Optionally takes a list of walls to use.
Scenery.randomize.add = function (media_objs, wall_list) {
var media_list = Scenery.randomize.get_dimensions(media_objs)
- var walls = Scenery.randomize.get_empty_walls(wall_list)
+ var empty_data = Scenery.randomize.get_empty_walls(wall_list)
+ var walls = empty_data.walls
+ var removed = empty_data.removed
+ var added = []
var wall_ids = _.keys(walls)
if (! wall_ids.length) { return }
@@ -93,6 +97,7 @@ Scenery.randomize.add = function (media_objs, wall_list) {
index: 0,
})
scenery.was_randomly_placed = true
+ added.push(scenery.serialize())
}
else {
// artwork won't fit anywhere??
@@ -100,4 +105,11 @@ Scenery.randomize.add = function (media_objs, wall_list) {
return false
})
+
+ UndoStack.push({
+ type: "randomize-scenery",
+ undo: { added: added, removed: removed },
+ redo: { added: added, removed: removed },
+ })
+
} \ No newline at end of file
diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js
index 8b85d02..1232780 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/undo.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js
@@ -121,7 +121,7 @@
})
},
},
-
+
//
{
@@ -166,6 +166,34 @@
Minotaur.watch( app.router.editorView.settings )
},
},
+ {
+ type: "randomize-scenery",
+ undo: function(state){
+ state.added.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.removed)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+ Scenery.resize.hide()
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ state.removed.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.added)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
])
})()