/// <summary> /// Creates a test section. /// </summary> /// <param name="owner">The level that will own this section.</param> /// <returns> /// A section consisting of randomly placed and sized rows of concrete /// blocks with a TestPlayer. /// </returns> public static Section GenerateSection(Level owner) { // Create a section of randomly placed stretches of stone tiles. Section result = new Section(owner); result.Bounds = new Physics.BoundingRectangle(0, 0, 3200, 1920); result.AutoscrollSettings = new Physics.SectionAutoscrollSettings(CameraScrollType.FreelyMoving, Vector2.Zero, null); result.Background = GenerateBackground(result); Layer mainLayer = new Layer(result, false); result.Layers.Add(mainLayer); mainLayer.SetMainLayer(); Random random = new Random(); float tilePlacerX = 0f; float tilePlacerY = 200f; // really temporary // AssemblyManager.LoadAssembly(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), // "TestPackage", "SmlSample.dll")); hey it actually was temporary // TODO: have ContentPackageManager ignore multiple attempts to add // the same package Tile testTile3 = AssemblyManager.GetTileByFullName("SmlSample.TestTile3"); testTile3.GraphicsResourceName = "smw_concrete_block"; while (tilePlacerX < 1008f) { int runDistance = random.Next(3, 8); tilePlacerY += (random.Next(1, 3) * 16f) * ((random.Next(0, 2) != 0) ? 1 : -1); tilePlacerY -= (tilePlacerY % 16); tilePlacerY = MathHelper.Clamp(tilePlacerY, 0, 1920); for (int i = 0; i < runDistance; i++) { Tile newTile = testTile3.Clone(); newTile.Position = new Vector2(tilePlacerX, tilePlacerY); result.AddTile(newTile); tilePlacerX += 16f; } } Sprite player = AssemblyManager.GetSpriteByFullName("SmlSample.SimplePlayer"); player.Position = Vector2.Zero; player.IsActive = true; player.State = (SpriteState)0; player.TileCollisionMode = SpriteCollisionMode.OffsetNotify; result.AddSprite(player); Sprite painter = AssemblyManager.GetSpriteByFullName("SmlSample.PainterSprite"); painter.Position = new Vector2(16f, 0f); painter.IsActive = true; painter.State = (SpriteState)0; painter.TileCollisionMode = SpriteCollisionMode.NoCollision; result.AddSprite(painter); return result; }
/// <summary> /// Initializes this screen. /// </summary> /// <param name="owner">The screen that is creating this one.</param> /// <param name="parameters"> /// Parameters to specify how the screen should be initialized. /// Contains a path to the level file to load. /// </param> public override void Initialize(Screen owner, string parameters) { // level = new Level(); //level.Sections.Add(new Section(level)); // temporary level.ContentFolderPaths = new List<string>() { // System.IO.Directory.GetCurrentDirectory() + @"\TestPackage" }; level = new IO.LevelSerializers.Serializer003().Deserialize(System.IO.File.ReadAllText(parameters)); level.Path = parameters; level.Initialize(); }
public Level Deserialize(string json) { JObject obj = null; Level result = new Level(); try { obj = JObject.Parse(json); } catch (Exception ex) { throw new ArgumentException("The deserialization process encountered an error.", ex); } if ((string)obj["header"]["version"] != SerializerVersion) { throw new ArgumentException($"This level was created with a different version of the serializer. Expected {SerializerVersion}, got {(string)obj["header"]["version"]}."); } result.Name = (string)obj["header"]["name"]; result.Author = (string)obj["header"]["author"]; result.EventScript.Script = (string)obj["script"]; JArray contentObjects = (JArray)obj["contentPackages"]; JArray sectionObjects = (JArray)obj["sections"]; JArray levelExitObjects = (JArray)obj["levelExits"]; result.ContentFolderPaths = contentObjects.ToObject<List<string>>(); Content.ContentPackageManager.AddPackageFromFolder(result.ContentFolderPaths[0]); // TODO: make this not hardcoded result.Sections = DeserializeSections(sectionObjects, result); result.LevelExits = DeserializeLevelExits(levelExitObjects); result.ActiveSection = result.Sections.First(s => s.Index == 0); return result; }
public string Serialize(Level level) => JObject.FromObject(GetSerializableObjects(level)).ToString();
internal object GetSerializableObjects(Level level) { return new { header = new { version = SerializerVersion, name = level.Name, author = level.Author }, contentPackages = level.ContentFolderPaths, levelExits = GetLevelExitObjects(level), sections = GetSectionObjects(level), script = level.EventScript.Script }; }
internal object GetSectionObjects(Level level) { var result = new List<object>(level.Sections.Count); foreach (var section in level.Sections) { result.Add(new { index = section.Index, name = section.Name, bounds = section.Bounds.Serialize(), scrollSettings = GetAutoscrollSettingsObject(section), background = GetBackgroundObject(section), layers = GetLayerObjects(section), sprites = GetSpriteObjects(section), paths = GetPathObjects(section) }); } return result; }
internal object GetLevelExitObjects(Level level) { var result = new List<object>(level.LevelExits.Count); foreach (var levelExit in level.LevelExits) { result.Add(new { exitIndex = levelExit.ExitIndex, exitDirection = (int)levelExit.ExitDirection, objectName = levelExit.ObjectName }); } return result; }
internal List<Section> DeserializeSections(JArray sectionObjects, Level ownerLevel) { List<Section> result = new List<Section>(); foreach (var entry in sectionObjects) { Section section = new Section(ownerLevel); section.Index = (int)entry["index"]; section.Name = (string)entry["name"]; section.Bounds = BoundingRectangle.FromSimpleString((string)entry["bounds"]); section.AutoscrollSettings = DeserializeAutoscrollSettings((JObject)entry["scrollSettings"]); section.Background = DeserializeBackground((JObject)entry["background"], section); JArray layersData = (JArray)entry["layers"]; JArray spritesData = (JArray)entry["sprites"]; JArray pathsData = (JArray)entry["paths"]; List<Sprite> sectionSprites; SparseCellGrid<Sprite> sectionSpriteGrid = DeserializeSprites(spritesData, out sectionSprites); section.Layers = DeserializeLayers(layersData, section); section.SpritesGrid = sectionSpriteGrid; section.Sprites = sectionSprites; section.Players.AddRange(section.Sprites.Where(s => s.IsPlayer)); section.Paths = DeserializePaths(pathsData); section.IsLoaded = true; result.Add(section); } return result; }