public static List <object> Serialize( GameEntity levelEntity, EntityState?state, LevelSnapshot snapshot, SerializationContext context) { var manager = context.Manager; var level = levelEntity.Level; List <object> properties; switch (state) { case null: case EntityState.Added: var knownTerrain = new List <short>(); for (short j = 0; j < level.KnownTerrain.Length; j++) { var feature = level.KnownTerrain[j]; if (feature != (byte)MapFeature.Unexplored) { knownTerrain.Add(j); knownTerrain.Add(feature); } } var wallNeighbours = new List <short>(); for (short j = 0; j < level.WallNeighbours.Length; j++) { if (level.KnownTerrain[j] == (byte)MapFeature.Unexplored) { continue; } var neighbours = level.WallNeighbours[j] & (byte)DirectionFlags.Cross; if (neighbours != (byte)DirectionFlags.None) { wallNeighbours.Add(j); wallNeighbours.Add((byte)neighbours); } } var visibleTerrain = new List <short>(); for (short j = 0; j < level.VisibleTerrain.Length; j++) { var visibility = level.VisibleTerrain[j]; if (visibility != 0) { visibleTerrain.Add(j); visibleTerrain.Add(visibility); } } properties = state == null ? new List <object>(10) : new List <object>(11) { (int)state }; properties.Add(GetActors(levelEntity, manager) .Select(a => LevelActorSnapshot.Serialize(a, null, context)).ToList()); properties.Add(GetItems(levelEntity, manager) .Select(t => LevelItemSnapshot.Serialize(t, null, null, context)).ToList()); properties.Add(GetConnections(levelEntity, manager) .Select(c => ConnectionSnapshot.Serialize(c, null, context)).ToList()); properties.Add(knownTerrain); properties.Add(wallNeighbours); properties.Add(visibleTerrain); properties.Add(level.BranchName); properties.Add(level.Depth); properties.Add(level.Width); properties.Add(level.Height); return(properties); default: var levelEntry = context.DbContext.Entry(level); properties = new List <object> { (int)state }; var i = 2; var serializedActors = GameTransmissionProtocol.Serialize( GetActors(levelEntity, manager), snapshot.ActorsSnapshot, LevelActorSnapshot.Serialize, context); if (serializedActors.Count > 0) { properties.Add(i); properties.Add(serializedActors); } i++; var serializedItems = GameTransmissionProtocol.Serialize( GetItems(levelEntity, manager), snapshot.ItemsSnapshot, LevelItemSnapshot.Serialize, context); if (serializedItems.Count > 0) { properties.Add(i); properties.Add(serializedItems); } i++; var serializedConnections = GameTransmissionProtocol.Serialize( GetConnections(levelEntity, manager), snapshot.ConnectionsSnapshot, ConnectionSnapshot.Serialize, context); if (serializedConnections.Count > 0) { properties.Add(i); properties.Add(serializedConnections); } if (levelEntry.State != EntityState.Unchanged) { i++; var wallNeighboursChanges = new List <object>(); var knownTerrainChanges = new List <object>(level.KnownTerrainChanges.Count * 2); if (level.KnownTerrainChanges.Count > 0) { foreach (var terrainChange in level.KnownTerrainChanges) { knownTerrainChanges.Add(terrainChange.Key); knownTerrainChanges.Add(terrainChange.Value); wallNeighboursChanges.Add(terrainChange.Key); wallNeighboursChanges.Add(level.WallNeighbours[terrainChange.Key] & (byte)DirectionFlags.Cross); } } if (level.TerrainChanges.Count > 0) { foreach (var terrainChange in level.TerrainChanges) { if (level.VisibleTerrain[terrainChange.Key] == 0) { continue; } knownTerrainChanges.Add(terrainChange.Key); knownTerrainChanges.Add(terrainChange.Value); } } if (knownTerrainChanges.Count > 0) { properties.Add(i); properties.Add(knownTerrainChanges); } i++; if (level.WallNeighboursChanges.Count > 0) { foreach (var wallNeighboursChange in level.WallNeighboursChanges) { if (level.VisibleTerrain[wallNeighboursChange.Key] == 0) { continue; } wallNeighboursChanges.Add(wallNeighboursChange.Key); wallNeighboursChanges.Add(wallNeighboursChange.Value & (byte)DirectionFlags.Cross); } } if (wallNeighboursChanges.Count > 0) { properties.Add(i); properties.Add(wallNeighboursChanges); } i++; if (level.VisibleTerrainChanges.Count > 0) { properties.Add(i); var changes = new object[level.VisibleTerrainChanges.Count * 2]; var j = 0; foreach (var visibleTerrainChange in level.VisibleTerrainChanges) { changes[j++] = visibleTerrainChange.Key; changes[j++] = visibleTerrainChange.Value; } properties.Add(changes); } } return(properties.Count > 1 ? properties : null); } }
public static List <object> Serialize( GameEntity knowledgeEntity, EntityState?state, LevelItemSnapshot snapshot, SerializationContext context) { List <object> properties; switch (state) { case null: case EntityState.Added: { var manager = context.Manager; var itemKnowledge = knowledgeEntity.Knowledge; var item = itemKnowledge.KnownEntity.Item; var position = knowledgeEntity.Position; properties = state == null ? new List <object>(6) : new List <object>(7) { (int)state }; properties.Add(knowledgeEntity.Id); if (itemKnowledge.SensedType.CanIdentify()) { properties.Add((int)item.Type); properties.Add(item.TemplateName); properties.Add( context.Services.Language.GetString(item, item.GetQuantity(manager), itemKnowledge.SensedType)); } else { properties.Add((int)ItemType.None); properties.Add(null); properties.Add(null); } properties.Add(position.LevelX); properties.Add(position.LevelY); return(properties); } case EntityState.Deleted: return(new List <object> { (int)state, knowledgeEntity.Id }); default: { var manager = context.Manager; var itemKnowledge = knowledgeEntity.Knowledge; var item = itemKnowledge.KnownEntity.Item; var position = knowledgeEntity.Position; properties = new List <object>(2) { (int)state, knowledgeEntity.Id }; var i = 1; var knowledgeEntry = context.DbContext.Entry(itemKnowledge); var sensedType = knowledgeEntry.Property(nameof(KnowledgeComponent.SensedType)); if (sensedType.IsModified) { var canIdentify = itemKnowledge.SensedType.CanIdentify(); properties.Add(i); properties.Add(!canIdentify ? (int)ItemType.None : item.Type); i++; properties.Add(i); properties.Add(!canIdentify ? null : item.TemplateName); } else { i++; } i++; var newName = itemKnowledge.SensedType.CanIdentify() ? context.Services.Language.GetString(item, item.GetQuantity(manager), itemKnowledge.SensedType) : null; if (snapshot.NameSnapshot != newName) { properties.Add(i); properties.Add(newName); } var positionEntry = context.DbContext.Entry(position); if (positionEntry.State != EntityState.Unchanged) { i++; var levelX = positionEntry.Property(nameof(PositionComponent.LevelX)); if (levelX.IsModified) { properties.Add(i); properties.Add(position.LevelX); } i++; var levelY = positionEntry.Property(nameof(PositionComponent.LevelY)); if (levelY.IsModified) { properties.Add(i); properties.Add(position.LevelY); } } return(properties.Count > 2 ? properties : null); } } }