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;
}