/// <summary> /// Creates variation of given region info. /// </summary> /// <param name="baseRegionInfoData"></param> /// <param name="newRegionId"></param> /// <param name="variationFile"></param> /// <returns></returns> private static RegionInfoData CreateVariation(RegionInfoData baseRegionInfoData, int newRegionId, string variationFile) { var result = new RegionInfoData(); result.Id = newRegionId; result.GroupId = baseRegionInfoData.GroupId; result.X1 = baseRegionInfoData.X1; result.Y1 = baseRegionInfoData.Y1; result.X2 = baseRegionInfoData.X2; result.Y2 = baseRegionInfoData.Y2; // TODO: Filter areas, props, and events to create, based on variation file. result.Areas = new List <AreaData>(baseRegionInfoData.Areas.Count); var i = 1; foreach (var originalArea in baseRegionInfoData.Areas) { var area = originalArea.Copy(false, false); area.Id = i++; // Add props foreach (var originalProp in originalArea.Props.Values) { var prop = originalProp.Copy(); var id = (ulong)prop.EntityId; id &= ~0x0000FFFFFFFF0000U; id |= ((ulong)result.Id << 32); id |= ((ulong)baseRegionInfoData.GetAreaIndex(originalArea.Id) << 16); prop.EntityId = (long)id; area.Props.Add(prop.EntityId, prop); } // Add events foreach (var originalEvent in originalArea.Events.Values) { var ev = originalEvent.Copy(); ev.RegionId = result.Id; var id = (ulong)ev.Id; id &= ~0x0000FFFFFFFF0000U; id |= ((ulong)result.Id << 32); id |= ((ulong)baseRegionInfoData.GetAreaIndex(originalArea.Id) << 16); ev.Id = (long)id; area.Events.Add(ev.Id, ev); } result.Areas.Add(area); } return(result); }
/// <summary> /// Creates variation of given region info. /// </summary> /// <param name="baseRegionInfoData"></param> /// <param name="newRegionId"></param> /// <param name="variationFile"></param> /// <returns></returns> private static RegionInfoData CreateVariation(RegionInfoData baseRegionInfoData, int newRegionId, string variationFile) { var result = new RegionInfoData(); result.Id = newRegionId; result.GroupId = baseRegionInfoData.GroupId; result.X1 = baseRegionInfoData.X1; result.Y1 = baseRegionInfoData.Y1; result.X2 = baseRegionInfoData.X2; result.Y2 = baseRegionInfoData.Y2; // TODO: Filter areas, props, and events to create, based on variation file. result.Areas = new List<AreaData>(baseRegionInfoData.Areas.Count); var i = 1; foreach (var originalArea in baseRegionInfoData.Areas) { var area = originalArea.Copy(false, false); area.Id = i++; // Add props foreach (var originalProp in originalArea.Props.Values) { var prop = originalProp.Copy(); var id = (ulong)prop.EntityId; id &= ~0x0000FFFFFFFF0000U; id |= ((ulong)result.Id << 32); id |= ((ulong)baseRegionInfoData.GetAreaIndex(originalArea.Id) << 16); prop.EntityId = (long)id; area.Props.Add(prop.EntityId, prop); } // Add events foreach (var originalEvent in originalArea.Events.Values) { var ev = originalEvent.Copy(); ev.RegionId = result.Id; var id = (ulong)ev.Id; id &= ~0x0000FFFFFFFF0000U; id |= ((ulong)result.Id << 32); id |= ((ulong)baseRegionInfoData.GetAreaIndex(originalArea.Id) << 16); ev.Id = (long)id; area.Events.Add(ev.Id, ev); } result.Areas.Add(area); } return result; }
/// <summary> /// Fixes the region data's entity ids. /// </summary> /// <param name="data"></param> /// <param name="regionId"></param> private static void FixIds(RegionInfoData data, int regionId) { var areaId = 1; foreach (var areaData in data.Areas) { areaData.Id = areaId++; foreach (var propData in areaData.Props.Values) { var entityId = (propData.EntityId & ~0x0000FFFF00000000) | ((long)regionId << 32) | ((long)areaData.Id << 16); propData.EntityId = entityId; } foreach (var eventData in areaData.Events.Values) { var entityId = (eventData.Id & ~0x0000FFFF00000000) | ((long)regionId << 32) | ((long)areaData.Id << 16); eventData.Id = entityId; eventData.RegionId = regionId; } } }
/// <summary> /// Loads collision objects from region data. /// </summary> /// <param name="data"></param> public void Init(RegionInfoData data) { foreach (var area in data.Areas) { // Add props foreach (var prop in area.Props.Values) { foreach (var shape in prop.Shapes) { this.Add(shape); } } // Add collision events foreach (var ev in area.Events.Values.Where(a => a.Type == EventType.Collision)) { foreach (var shape in ev.Shapes) { this.Add(shape); } } } }
/// <summary> /// Loads collision objects from region data. /// </summary> /// <param name="data"></param> public void Init(RegionInfoData data) { foreach (var area in data.Areas) { foreach (var prop in area.Props.Values) { foreach (var shape in prop.Shapes) { var p1 = new Point(shape.X1, shape.Y1); var p2 = new Point(shape.X2, shape.Y2); var p3 = new Point(shape.X3, shape.Y3); var p4 = new Point(shape.X4, shape.Y4); _tree.Insert(new LinePath(p1, p2)); _tree.Insert(new LinePath(p2, p3)); _tree.Insert(new LinePath(p3, p4)); _tree.Insert(new LinePath(p4, p1)); } } foreach (var ev in area.Events.Values.Where(a => a.Type == EventType.Collision)) { foreach (var shape in ev.Shapes) { var p1 = new Point(shape.X1, shape.Y1); var p2 = new Point(shape.X2, shape.Y2); var p3 = new Point(shape.X3, shape.Y3); var p4 = new Point(shape.X4, shape.Y4); _tree.Insert(new LinePath(p1, p2)); _tree.Insert(new LinePath(p2, p3)); _tree.Insert(new LinePath(p3, p4)); _tree.Insert(new LinePath(p4, p1)); } } } }