Daniele Bartolini 9 년 전
부모
커밋
c9110304af
2개의 변경된 파일318개의 추가작업 그리고 317개의 파일을 삭제
  1. 316 311
      tools/level_editor/level.vala
  2. 2 6
      tools/level_editor/level_editor.vala

+ 316 - 311
tools/level_editor/level.vala

@@ -44,6 +44,7 @@ namespace Crown
 			_selection = new Gee.ArrayList<Guid?>();
 		}
 
+		/// Resets the level
 		public void reset()
 		{
 			_db.reset();
@@ -56,26 +57,318 @@ namespace Crown
 			_client.send_script(LevelEditorApi.reset());
 		}
 
-		public void new_level()
-		{
-			load(_toolchain_dir + "core/editors/levels/empty.level");
-		}
-
+		/// Loads the level from @a path.
 		public void load(string path)
 		{
 			reset();
 			_db.load(path);
+			send_level();
 		}
 
+		/// Saves the level to @a path.
 		public void save(string path)
 		{
 			_db.save(path);
 		}
 
+		/// Loads the empty level template.
+		public void load_empty_level()
+		{
+			load(_toolchain_dir + "core/editors/levels/empty.level");
+		}
+
+		public void spawn_unit(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
+		{
+			on_unit_spawned(id, name, pos, rot, scl);
+			send_spawn_units(new Guid[] { id });
+		}
+
+		public void destroy_objects(Guid[] ids)
+		{
+			Guid[] units = {};
+			Guid[] sounds = {};
+
+			foreach (Guid id in ids)
+			{
+				if (is_unit(id))
+					units += id;
+				else if (is_sound(id))
+					sounds += id;
+			}
+
+			if (units.length > 0)
+			{
+				_db.add_restore_point((int)ActionType.DESTROY_UNIT, units);
+				foreach (Guid id in units)
+				{
+					_db.remove_from_set(GUID_ZERO, "units", id);
+					_db.destroy(id);
+				}
+			}
+
+			if (sounds.length > 0)
+			{
+				_db.add_restore_point((int)ActionType.DESTROY_SOUND, sounds);
+				foreach (Guid id in sounds)
+				{
+					_db.remove_from_set(GUID_ZERO, "sounds", id);
+					_db.destroy(id);
+				}
+			}
+
+			send_destroy_objects(ids);
+		}
+
+		public void move_selected_objects(Vector3 pos, Quaternion rot, Vector3 scl)
+		{
+			if (_selection.size == 0)
+				return;
+
+			Guid id = _selection.last();
+			on_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
+			send_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
+		}
+
+		public void duplicate_selected_objects()
+		{
+			if (_selection.size > 0)
+			{
+				Guid[] ids = new Guid[_selection.size];
+				// FIXME
+				{
+					Guid?[] tmp = _selection.to_array();
+					for (int i = 0; i < tmp.length; ++i)
+						ids[i] = tmp[i];
+				}
+				Guid[] new_ids = new Guid[ids.length];
+
+				for (int i = 0; i < new_ids.length; ++i)
+					new_ids[i] = Guid.new_guid();
+
+				duplicate_objects(ids, new_ids);
+			}
+		}
+
+		public void destroy_selected_objects()
+		{
+			Guid[] ids = new Guid[_selection.size];
+			// FIXME
+			{
+				Guid?[] tmp = _selection.to_array();
+				for (int i = 0; i < tmp.length; ++i)
+					ids[i] = tmp[i];
+			}
+			_selection.clear();
+
+			destroy_objects(ids);
+		}
+
+		public void duplicate_objects(Guid[] ids, Guid[] new_ids)
+		{
+			_db.add_restore_point((int)ActionType.DUPLICATE_OBJECTS, new_ids);
+			for (int i = 0; i < ids.length; ++i)
+			{
+				_db.duplicate(ids[i], new_ids[i]);
+
+				if (is_unit(ids[i]))
+				{
+					_db.add_to_set(GUID_ZERO, "units", new_ids[i]);
+				}
+				else if (is_sound(ids[i]))
+				{
+					_db.add_to_set(GUID_ZERO, "sounds", new_ids[i]);
+				}
+			}
+			send_spawn_objects(new_ids);
+		}
+
+		public void on_unit_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
+		{
+			load_prefab(name);
+
+			_db.add_restore_point((int)ActionType.SPAWN_UNIT, new Guid[] { id });
+			_db.create(id);
+			_db.set_property(id, "prefab", name);
+
+			Guid transform_id = GUID_ZERO;
+			if (has_component(id, "transform", ref transform_id))
+			{
+				set_component_property(id, transform_id, "data.position", pos);
+				set_component_property(id, transform_id, "data.rotation", rot);
+				set_component_property(id, transform_id, "data.scale", scl);
+				set_component_property(id, transform_id, "type", "transform");
+			}
+			else
+			{
+				_db.set_property(id, "position", pos);
+				_db.set_property(id, "rotation", rot);
+				_db.set_property(id, "scale", scl);
+			}
+			_db.add_to_set(GUID_ZERO, "units", id);
+		}
+
+		public void on_sound_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl, double range, double volume, bool loop)
+		{
+			_db.add_restore_point((int)ActionType.SPAWN_SOUND, new Guid[] { id });
+			_db.create(id);
+			_db.set_property(id, "position", pos);
+			_db.set_property(id, "rotation", rot);
+			_db.set_property(id, "name", name);
+			_db.set_property(id, "range", range);
+			_db.set_property(id, "volume", volume);
+			_db.set_property(id, "loop", loop);
+			_db.add_to_set(GUID_ZERO, "sounds", id);
+		}
+
+		public void on_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
+		{
+			_db.add_restore_point((int)ActionType.MOVE_OBJECTS, ids);
+
+			for (int i = 0; i < ids.length; ++i)
+			{
+				Guid id = ids[i];
+				Vector3 pos = positions[i];
+				Quaternion rot = rotations[i];
+				Vector3 scl = scales[i];
+
+				if (is_unit(id))
+				{
+					Guid transform_id = GUID_ZERO;
+
+					if (has_component(id, "transform", ref transform_id))
+					{
+						set_component_property(id, transform_id, "data.position", pos);
+						set_component_property(id, transform_id, "data.rotation", rot);
+						set_component_property(id, transform_id, "data.scale", scl);
+					}
+					else
+					{
+						_db.set_property(id, "position", pos);
+						_db.set_property(id, "rotation", rot);
+						_db.set_property(id, "scale", scl);
+					}
+				}
+				else if (is_sound(id))
+				{
+					_db.set_property(id, "position", pos);
+					_db.set_property(id, "rotation", rot);
+				}
+			}
+			// FIXME: Hack to force update the component view
+			selection_changed(_selection);
+		}
+
+		public void on_selection(Guid[] ids)
+		{
+			_selection.clear();
+			foreach (Guid id in ids)
+				_selection.add(id);
+
+			selection_changed(_selection);
+		}
+
+		public void selection_set(Guid[] ids)
+		{
+			_selection.clear();
+			for (int i = 0; i < ids.length; ++i)
+				_selection.add(ids[i]);
+			_client.send_script(LevelEditorApi.selection_set(ids));
+
+			selection_changed(_selection);
+		}
+
+		public void set_light(Guid unit_id, Guid component_id, string type, double range, double intensity, double spot_angle, Vector3 color)
+		{
+			set_component_property(unit_id, component_id, "data.type",       type);
+			set_component_property(unit_id, component_id, "data.range",      range);
+			set_component_property(unit_id, component_id, "data.intensity",  intensity);
+			set_component_property(unit_id, component_id, "data.spot_angle", spot_angle);
+			set_component_property(unit_id, component_id, "data.color",      color);
+			set_component_property(unit_id, component_id, "type", "light");
+
+			_client.send_script(LevelEditorApi.set_light(unit_id, type, range, intensity, spot_angle, color));
+		}
+
+		private void send_spawn_units(Guid[] ids)
+		{
+			StringBuilder sb = new StringBuilder();
+			generate_spawn_unit_commands(ids, sb);
+			_client.send_script(sb.str);
+		}
+
+		private void send_spawn_sounds(Guid[] ids)
+		{
+			StringBuilder sb = new StringBuilder();
+			generate_spawn_sound_commands(ids, sb);
+			_client.send_script(sb.str);
+		}
+
+		private void send_spawn_objects(Guid[] ids)
+		{
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < ids.length; ++i)
+			{
+				if (is_unit(ids[i]))
+				{
+					generate_spawn_unit_commands(new Guid[] { ids[i] }, sb);
+				}
+				else if (is_sound(ids[i]))
+				{
+					generate_spawn_sound_commands(new Guid[] { ids[i] }, sb);
+				}
+			}
+			_client.send_script(sb.str);
+		}
+
+		private void send_destroy_objects(Guid[] ids)
+		{
+			StringBuilder sb = new StringBuilder();
+			foreach (Guid id in ids)
+				sb.append(LevelEditorApi.destroy(id));
+
+			_client.send_script(sb.str);
+		}
+
+		private void send_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
+		{
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < ids.length; ++i)
+				sb.append(LevelEditorApi.move_object(ids[i], positions[i], rotations[i], scales[i]));
+
+			_client.send_script(sb.str);
+		}
+
+		private void send_level()
+		{
+			HashSet<Guid?> units = _db.get_property(GUID_ZERO, "units") as HashSet<Guid?>;
+			HashSet<Guid?> sounds = _db.get_property(GUID_ZERO, "sounds") as HashSet<Guid?>;
+
+			Guid[] unit_ids = new Guid[units.size];
+			Guid[] sound_ids = new Guid[sounds.size];
+
+			// FIXME
+			{
+				Guid?[] tmp = units.to_array();
+				for (int i = 0; i < tmp.length; ++i)
+					unit_ids[i] = tmp[i];
+			}
+			// FIXME
+			{
+				Guid?[] tmp = sounds.to_array();
+				for (int i = 0; i < tmp.length; ++i)
+					sound_ids[i] = tmp[i];
+			}
+
+			StringBuilder sb = new StringBuilder();
+			generate_spawn_unit_commands(unit_ids, sb);
+			generate_spawn_sound_commands(sound_ids, sb);
+			_client.send_script(sb.str);
+		}
+
 		/// <summary>
 		/// Loads the prefab name into the database of prefabs.
 		/// </summary>
-		public void load_prefab(string name)
+		private void load_prefab(string name)
 		{
 			if (_loaded_prefabs.contains(name))
 				return;
@@ -96,7 +389,7 @@ namespace Crown
 			_loaded_prefabs.add(name);
 		}
 
-		public void generate_spawn_unit_commands(Guid[] unit_ids, StringBuilder sb)
+		private void generate_spawn_unit_commands(Guid[] unit_ids, StringBuilder sb)
 		{
 			foreach (Guid unit_id in unit_ids)
 			{
@@ -164,7 +457,7 @@ namespace Crown
 			}
 		}
 
-		public void generate_spawn_sound_commands(Guid[] sound_ids, StringBuilder sb)
+		private void generate_spawn_sound_commands(Guid[] sound_ids, StringBuilder sb)
 		{
 			foreach (Guid sound_id in sound_ids)
 			{
@@ -173,37 +466,10 @@ namespace Crown
 					, (Quaternion)_db.get_property(sound_id, "rotation")
 					, (double)    _db.get_property(sound_id, "range")
 					, (double)    _db.get_property(sound_id, "volume")
-					, (bool)      _db.get_property(sound_id, "loop")
-					);
-				sb.append(s);
-			}
-		}
-
-		public void send()
-		{
-			HashSet<Guid?> units = _db.get_property(GUID_ZERO, "units") as HashSet<Guid?>;
-			HashSet<Guid?> sounds = _db.get_property(GUID_ZERO, "sounds") as HashSet<Guid?>;
-
-			Guid[] unit_ids = new Guid[units.size];
-			Guid[] sound_ids = new Guid[sounds.size];
-
-			// FIXME
-			{
-				Guid?[] tmp = units.to_array();
-				for (int i = 0; i < tmp.length; ++i)
-					unit_ids[i] = tmp[i];
-			}
-			// FIXME
-			{
-				Guid?[] tmp = sounds.to_array();
-				for (int i = 0; i < tmp.length; ++i)
-					sound_ids[i] = tmp[i];
-			}
-
-			StringBuilder sb = new StringBuilder();
-			generate_spawn_unit_commands(unit_ids, sb);
-			generate_spawn_sound_commands(sound_ids, sb);
-			_client.send_script(sb.str);
+					, (bool)      _db.get_property(sound_id, "loop")
+					);
+				sb.append(s);
+			}
 		}
 
 		private void undo_redo_action(bool undo, int id, Guid[] data)
@@ -213,36 +479,36 @@ namespace Crown
 			case (int)ActionType.SPAWN_UNIT:
 				{
 					if (undo)
-						do_destroy_objects(data);
+						send_destroy_objects(data);
 					else
-						do_spawn_units(data);
+						send_spawn_units(data);
 				}
 				break;
 
 			case (int)ActionType.DESTROY_UNIT:
 				{
 					if (undo)
-						do_spawn_units(data);
+						send_spawn_units(data);
 					else
-						do_destroy_objects(data);
+						send_destroy_objects(data);
 				}
 				break;
 
 			case (int)ActionType.SPAWN_SOUND:
 				{
 					if (undo)
-						do_destroy_objects(data);
+						send_destroy_objects(data);
 					else
-						do_spawn_sounds(data);
+						send_spawn_sounds(data);
 				}
 				break;
 
 			case (int)ActionType.DESTROY_SOUND:
 				{
 					if (undo)
-						do_spawn_sounds(data);
+						send_spawn_sounds(data);
 					else
-						do_destroy_objects(data);
+						send_destroy_objects(data);
 				}
 				break;
 
@@ -287,7 +553,7 @@ namespace Crown
 						}
 					}
 
-					do_move_objects(ids, positions, rotations, scales);
+					send_move_objects(ids, positions, rotations, scales);
 					// FIXME: Hack to force update the component view
 					selection_changed(_selection);
 				}
@@ -297,9 +563,9 @@ namespace Crown
 				{
 					Guid[] new_ids = data;
 					if (undo)
-						do_destroy_objects(new_ids);
+						send_destroy_objects(new_ids);
 					else
-						do_spawn_objects(new_ids);
+						send_spawn_objects(new_ids);
 				}
 				break;
 
@@ -309,267 +575,6 @@ namespace Crown
 			}
 		}
 
-		private void do_spawn_objects(Guid[] ids)
-		{
-			StringBuilder sb = new StringBuilder();
-			for (int i = 0; i < ids.length; ++i)
-			{
-				if (is_unit(ids[i]))
-				{
-					generate_spawn_unit_commands(new Guid[] { ids[i] }, sb);
-				}
-				else if (is_sound(ids[i]))
-				{
-					generate_spawn_sound_commands(new Guid[] { ids[i] }, sb);
-				}
-			}
-			_client.send_script(sb.str);
-		}
-
-		private void do_spawn_units(Guid[] ids)
-		{
-			StringBuilder sb = new StringBuilder();
-			generate_spawn_unit_commands(ids, sb);
-			_client.send_script(sb.str);
-		}
-
-		private void do_spawn_sounds(Guid[] ids)
-		{
-			StringBuilder sb = new StringBuilder();
-			generate_spawn_sound_commands(ids, sb);
-			_client.send_script(sb.str);
-		}
-
-		private void do_destroy_objects(Guid[] ids)
-		{
-			StringBuilder sb = new StringBuilder();
-			foreach (Guid id in ids)
-				sb.append(LevelEditorApi.destroy(id));
-
-			_client.send_script(sb.str);
-		}
-
-		private void do_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
-		{
-			StringBuilder sb = new StringBuilder();
-			for (int i = 0; i < ids.length; ++i)
-				sb.append(LevelEditorApi.move_object(ids[i], positions[i], rotations[i], scales[i]));
-
-			_client.send_script(sb.str);
-		}
-
-		public void move_selected_objects(Vector3 pos, Quaternion rot, Vector3 scl)
-		{
-			if (_selection.size == 0)
-				return;
-
-			Guid id = _selection.last();
-			on_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
-			do_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
-		}
-
-		public void set_light(Guid unit_id, Guid component_id, string type, double range, double intensity, double spot_angle, Vector3 color)
-		{
-			set_component_property(unit_id, component_id, "data.type",       type);
-			set_component_property(unit_id, component_id, "data.range",      range);
-			set_component_property(unit_id, component_id, "data.intensity",  intensity);
-			set_component_property(unit_id, component_id, "data.spot_angle", spot_angle);
-			set_component_property(unit_id, component_id, "data.color",      color);
-			set_component_property(unit_id, component_id, "type", "light");
-
-			_client.send_script(LevelEditorApi.set_light(unit_id, type, range, intensity, spot_angle, color));
-		}
-
-		public void duplicate_selected_objects()
-		{
-			if (_selection.size > 0)
-			{
-				Guid[] ids = new Guid[_selection.size];
-				// FIXME
-				{
-					Guid?[] tmp = _selection.to_array();
-					for (int i = 0; i < tmp.length; ++i)
-						ids[i] = tmp[i];
-				}
-				Guid[] new_ids = new Guid[ids.length];
-
-				for (int i = 0; i < new_ids.length; ++i)
-					new_ids[i] = Guid.new_guid();
-
-				duplicate_objects(ids, new_ids);
-			}
-		}
-
-		public void destroy_selected_objects()
-		{
-			Guid[] ids = new Guid[_selection.size];
-			// FIXME
-			{
-				Guid?[] tmp = _selection.to_array();
-				for (int i = 0; i < tmp.length; ++i)
-					ids[i] = tmp[i];
-			}
-			_selection.clear();
-
-			destroy_objects(ids);
-		}
-
-		public void duplicate_objects(Guid[] ids, Guid[] new_ids)
-		{
-			_db.add_restore_point((int)ActionType.DUPLICATE_OBJECTS, new_ids);
-			for (int i = 0; i < ids.length; ++i)
-			{
-				_db.duplicate(ids[i], new_ids[i]);
-
-				if (is_unit(ids[i]))
-				{
-					_db.add_to_set(GUID_ZERO, "units", new_ids[i]);
-				}
-				else if (is_sound(ids[i]))
-				{
-					_db.add_to_set(GUID_ZERO, "sounds", new_ids[i]);
-				}
-			}
-			do_spawn_objects(new_ids);
-		}
-
-		public void spawn_unit(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
-		{
-			on_unit_spawned(id, name, pos, rot, scl);
-			do_spawn_units(new Guid[] { id });
-		}
-
-		public void on_unit_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
-		{
-			load_prefab(name);
-
-			_db.add_restore_point((int)ActionType.SPAWN_UNIT, new Guid[] { id });
-			_db.create(id);
-			_db.set_property(id, "prefab", name);
-
-			Guid transform_id = GUID_ZERO;
-			if (has_component(id, "transform", ref transform_id))
-			{
-				set_component_property(id, transform_id, "data.position", pos);
-				set_component_property(id, transform_id, "data.rotation", rot);
-				set_component_property(id, transform_id, "data.scale", scl);
-				set_component_property(id, transform_id, "type", "transform");
-			}
-			else
-			{
-				_db.set_property(id, "position", pos);
-				_db.set_property(id, "rotation", rot);
-				_db.set_property(id, "scale", scl);
-			}
-			_db.add_to_set(GUID_ZERO, "units", id);
-		}
-
-		public void on_sound_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl, double range, double volume, bool loop)
-		{
-			_db.add_restore_point((int)ActionType.SPAWN_SOUND, new Guid[] { id });
-			_db.create(id);
-			_db.set_property(id, "position", pos);
-			_db.set_property(id, "rotation", rot);
-			_db.set_property(id, "name", name);
-			_db.set_property(id, "range", range);
-			_db.set_property(id, "volume", volume);
-			_db.set_property(id, "loop", loop);
-			_db.add_to_set(GUID_ZERO, "sounds", id);
-		}
-
-		public void on_selection(Guid[] ids)
-		{
-			_selection.clear();
-			foreach (Guid id in ids)
-				_selection.add(id);
-
-			selection_changed(_selection);
-		}
-
-		public void destroy_objects(Guid[] ids)
-		{
-			Guid[] units = {};
-			Guid[] sounds = {};
-
-			foreach (Guid id in ids)
-			{
-				if (is_unit(id))
-					units += id;
-				else if (is_sound(id))
-					sounds += id;
-			}
-
-			if (units.length > 0)
-			{
-				_db.add_restore_point((int)ActionType.DESTROY_UNIT, units);
-				foreach (Guid id in units)
-				{
-					_db.remove_from_set(GUID_ZERO, "units", id);
-					_db.destroy(id);
-				}
-			}
-
-			if (sounds.length > 0)
-			{
-				_db.add_restore_point((int)ActionType.DESTROY_SOUND, sounds);
-				foreach (Guid id in sounds)
-				{
-					_db.remove_from_set(GUID_ZERO, "sounds", id);
-					_db.destroy(id);
-				}
-			}
-
-			do_destroy_objects(ids);
-		}
-
-		public void selection_set(Guid[] ids)
-		{
-			_selection.clear();
-			for (int i = 0; i < ids.length; ++i)
-				_selection.add(ids[i]);
-			_client.send_script(LevelEditorApi.selection_set(ids));
-
-			selection_changed(_selection);
-		}
-
-		public void on_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
-		{
-			_db.add_restore_point((int)ActionType.MOVE_OBJECTS, ids);
-
-			for (int i = 0; i < ids.length; ++i)
-			{
-				Guid id = ids[i];
-				Vector3 pos = positions[i];
-				Quaternion rot = rotations[i];
-				Vector3 scl = scales[i];
-
-				if (is_unit(id))
-				{
-					Guid transform_id = GUID_ZERO;
-
-					if (has_component(id, "transform", ref transform_id))
-					{
-						set_component_property(id, transform_id, "data.position", pos);
-						set_component_property(id, transform_id, "data.rotation", rot);
-						set_component_property(id, transform_id, "data.scale", scl);
-					}
-					else
-					{
-						_db.set_property(id, "position", pos);
-						_db.set_property(id, "rotation", rot);
-						_db.set_property(id, "scale", scl);
-					}
-				}
-				else if (is_sound(id))
-				{
-					_db.set_property(id, "position", pos);
-					_db.set_property(id, "rotation", rot);
-				}
-			}
-			// FIXME: Hack to force update the component view
-			selection_changed(_selection);
-		}
-
 		public Value? get_property(Guid id, string key)
 		{
 			return _db.get_property(id, key);

+ 2 - 6
tools/level_editor/level_editor.vala

@@ -250,7 +250,6 @@ namespace Crown
 			_alignment_properties_view.add(_starting_compiler);
 
 			start_compiler();
-			new_level();
 
 			try
 			{
@@ -621,7 +620,7 @@ namespace Crown
 			while (!_engine.is_connected())
 				_engine.connect("127.0.0.1", 10001);
 
-			_level.send();
+			new_level();
 			send_state();
 		}
 
@@ -719,7 +718,7 @@ namespace Crown
 		private void new_level()
 		{
 			_level_filename = null;
-			_level.new_level();
+			_level.load_empty_level();
 		}
 
 		private void load()
@@ -742,7 +741,6 @@ namespace Crown
 				{
 					_level_filename = filename;
 					_level.load(_level_filename);
-					_level.send();
 					send_state();
 				}
 			}
@@ -845,7 +843,6 @@ namespace Crown
 			if (!_db.changed())
 			{
 				new_level();
-				_level.send();
 				send_state();
 				return;
 			}
@@ -866,7 +863,6 @@ namespace Crown
 			if (rt == (int)ResponseType.YES && save() || rt == (int)ResponseType.NO)
 			{
 				new_level();
-				_level.send();
 				send_state();
 			}
 		}