Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
            }
            }
        }