コード例 #1
0
        public virtual object GetEntity(
            IEntityType entityType,
            EntityKey entityKey,
            EntityLoadInfo entityLoadInfo,
            bool queryStateManager)
        {
            // hot path
            Debug.Assert(entityType != null);
            Debug.Assert(entityKey != null);

            if (entityKey == EntityKey.InvalidEntityKey)
            {
                throw new InvalidOperationException(
                          CoreStrings.InvalidEntityKeyOnQuery(entityType.DisplayName()));
            }

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(entityKey);

                if (entry != null)
                {
                    return(entry.Entity);
                }
            }

            object entity;

            WeakReference <object> weakReference;

            if (!_identityMap.TryGetValue(entityKey, out weakReference) ||
                !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    GarbageCollectIdentityMap();

                    _identityMap.Add(entityKey, new WeakReference <object>(entity));
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return(entity);
        }
コード例 #2
0
        public virtual object GetEntity(
            IKey key, EntityLoadInfo entityLoadInfo, bool queryStateManager, bool throwOnNullKey)
        {
            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(key, entityLoadInfo.ValueBuffer, throwOnNullKey);

                if (entry != null)
                {
                    return(entry.Entity);
                }
            }

            var identityMap = GetOrCreateIdentityMap(key);

            bool hasNullKey;
            var  weakReference = identityMap.TryGetEntity(entityLoadInfo.ValueBuffer, out hasNullKey);

            if (hasNullKey)
            {
                if (throwOnNullKey)
                {
                    throw new InvalidOperationException(CoreStrings.InvalidKeyValue(key.DeclaringEntityType.DisplayName()));
                }
                return(null);
            }

            object entity;

            if (weakReference == null ||
                !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    identityMap.CollectGarbage();

                    identityMap.Add(entityLoadInfo.ValueBuffer, entity);
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return(entity);
        }
コード例 #3
0
        public virtual object GetEntity(
            IEntityType entityType,
            EntityKey entityKey,
            EntityLoadInfo entityLoadInfo,
            bool queryStateManager)
        {
            // hot path
            Debug.Assert(entityType != null);
            Debug.Assert(entityKey != null);

            if (entityKey == EntityKey.InvalidEntityKey)
            {
                throw new InvalidOperationException(
                    CoreStrings.InvalidEntityKeyOnQuery(entityType.DisplayName()));
            }

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(entityKey);

                if (entry != null)
                {
                    return entry.Entity;
                }
            }

            object entity;

            WeakReference<object> weakReference;
            if (!_identityMap.TryGetValue(entityKey, out weakReference)
                || !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    GarbageCollectIdentityMap();

                    _identityMap.Add(entityKey, new WeakReference<object>(entity));
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return entity;
        }
コード例 #4
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used 
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual object GetEntity(
            IKey key, EntityLoadInfo entityLoadInfo, bool queryStateManager, bool throwOnNullKey)
        {
            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(key, entityLoadInfo.ValueBuffer, throwOnNullKey);

                if (entry != null)
                {
                    return entry.Entity;
                }
            }

            var identityMap = GetOrCreateIdentityMap(key);

            bool hasNullKey;
            var weakReference = identityMap.TryGetEntity(entityLoadInfo.ValueBuffer, out hasNullKey);
            if (hasNullKey)
            {
                if (throwOnNullKey)
                {
                    throw new InvalidOperationException(CoreStrings.InvalidKeyValue(key.DeclaringEntityType.DisplayName()));
                }
                return null;
            }

            object entity;
            if (weakReference == null
                || !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    identityMap.CollectGarbage();

                    identityMap.Add(entityLoadInfo.ValueBuffer, entity);
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return entity;
        }
コード例 #5
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual object GetEntity(
            IKey key, EntityLoadInfo entityLoadInfo, bool queryStateManager, bool throwOnNullKey)
        {
            if (queryStateManager)
            {
                var entry = _stateManager.Value.TryGetEntry(key, entityLoadInfo.ValueBuffer, throwOnNullKey);

                if (entry != null)
                {
                    return(entry.Entity);
                }
            }

            var identityMap = GetOrCreateIdentityMap(key);

            bool hasNullKey;
            var  weakReference = identityMap.TryGetEntity(entityLoadInfo.ValueBuffer, throwOnNullKey, out hasNullKey);

            if (hasNullKey)
            {
                return(null);
            }

            object entity;

            if (weakReference == null ||
                !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    identityMap.CollectGarbage();

                    identityMap.Add(entityLoadInfo.ValueBuffer, entity);
                }

                _valueBuffers.Add(entity, entityLoadInfo.ForType(entity.GetType()));
            }

            return(entity);
        }
コード例 #6
0
        public virtual object GetEntity(
            IKeyValue keyValue, EntityLoadInfo entityLoadInfo, bool queryStateManager)
        {
            // hot path
            Debug.Assert(keyValue != null);

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(keyValue);

                if (entry != null)
                {
                    return(entry.Entity);
                }
            }

            object entity;

            WeakReference <object> weakReference;

            if (!_identityMap.TryGetValue(keyValue, out weakReference) ||
                !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    GarbageCollectIdentityMap();

                    _identityMap.Add(keyValue, new WeakReference <object>(entity));
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return(entity);
        }
コード例 #7
0
        public virtual object GetEntity(
            IKeyValue keyValue, EntityLoadInfo entityLoadInfo, bool queryStateManager)
        {
            // hot path
            Debug.Assert(keyValue != null);

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(keyValue);

                if (entry != null)
                {
                    return entry.Entity;
                }
            }

            object entity;

            WeakReference<object> weakReference;
            if (!_identityMap.TryGetValue(keyValue, out weakReference)
                || !weakReference.TryGetTarget(out entity))
            {
                entity = entityLoadInfo.Materialize();

                if (weakReference != null)
                {
                    weakReference.SetTarget(entity);
                }
                else
                {
                    GarbageCollectIdentityMap();

                    _identityMap.Add(keyValue, new WeakReference<object>(entity));
                }

                _valueBuffers.Add(entity, entityLoadInfo.ValueBuffer);
            }

            return entity;
        }
コード例 #8
0
 public override string SelectFragment(IJoinable rhs, string rhsAlias, string lhsAlias, string collectionSuffix, bool includeCollectionColumns, EntityLoadInfo entityInfo)
 {
     // we need to determine the best way to know that two joinables
     // represent a single many-to-many...
     if (rhs != null && IsManyToMany && !rhs.IsCollection)
     {
         IAssociationType elementType = (IAssociationType)ElementType;
         if (rhs.Equals(elementType.GetAssociatedJoinable(Factory)))
         {
             return(ManyToManySelectFragment(rhs, rhsAlias, lhsAlias, collectionSuffix, elementType));
         }
     }
     return(includeCollectionColumns ? SelectFragment(lhsAlias, collectionSuffix) : string.Empty);
 }
コード例 #9
0
        public override string SelectFragment(IJoinable rhs, string rhsAlias, string lhsAlias, string collectionSuffix, bool includeCollectionColumns, EntityLoadInfo entityInfo)
        {
            var buf = new StringBuilder();

            if (includeCollectionColumns)
            {
                buf.Append(SelectFragment(lhsAlias, collectionSuffix)).Append(StringHelper.CommaSpace);
            }

            //6.0 TODO: Remove
#pragma warning disable 618
            if (entityInfo.IncludeLazyProps)
            {
                var selectMode = ReflectHelper.CastOrThrow <ISupportSelectModeJoinable>(ElementPersister, "fetch lazy properties");
                if (selectMode != null)
                {
                    return(buf.Append(selectMode.SelectFragment(null, null, lhsAlias, entityInfo.EntitySuffix, null, false, true)).ToString());
                }
            }
#pragma warning restore 618

            if (entityInfo.LazyProperties?.Count > 0)
            {
                var selectMode = ReflectHelper.CastOrThrow <ISupportLazyPropsJoinable>(ElementPersister, "fetch lazy properties");
                if (selectMode != null)
                {
                    return(buf.Append(selectMode.SelectFragment(null, null, lhsAlias, null, false, entityInfo)).ToString());
                }
            }

            var ojl = (IOuterJoinLoadable)ElementPersister;
            return(buf.Append(ojl.SelectFragment(lhsAlias, entityInfo.EntitySuffix)).ToString());            //use suffix for the entity columns
        }
コード例 #10
0
 public void AddLoadNPC(EntityLoadInfo npc)
 {
     loadNPCs.Add(npc);
 }
コード例 #11
0
ファイル: XmlLoader.cs プロジェクト: Jebeli/Tiles
        private Map LoadMap(XElement root, string fileId)
        {
            Map    map         = null;
            string name        = (string)root.Attribute("name");
            string title       = (string)root.Attribute("title");
            string orientation = (string)root.Attribute("orientation");
            int?   width       = (int?)root.Attribute("width");
            int?   height      = (int?)root.Attribute("height");
            int?   tileWidth   = (int?)root.Attribute("tileWidth");
            int?   tileHeight  = (int?)root.Attribute("tileHeight");
            int?   startX      = (int?)root.Attribute("startX");
            int?   startY      = (int?)root.Attribute("startY");
            string music       = (string)root.Attribute("music");

            if (name != null && orientation != null && width != null && height != null && tileWidth != null && tileHeight != null)
            {
                MapOrientation mapOrientation;
                if (Enum.TryParse(orientation, true, out mapOrientation))
                {
                    map           = new Map(title, (int)width, (int)height, (int)tileWidth, (int)tileHeight, mapOrientation);
                    map.MusicName = music;
                    map.StartX    = startX ?? ((int)width / 2);
                    map.StartY    = startY ?? ((int)height / 2);
                    foreach (var node in from item in root.Descendants("layer") select item)
                    {
                        string layerName   = (string)node.Attribute("name");
                        int?   layerWidth  = (int?)node.Attribute("width");
                        int?   layerHeight = (int?)node.Attribute("height");
                        bool?  visible     = (bool?)node.Attribute("visible");
                        bool?  objects     = (bool?)node.Attribute("objects");
                        string tileSetName = (string)node.Attribute("tileset");
                        var    data        = node.Descendants().FirstOrDefault();
                        if (layerName != null && layerWidth != null && layerHeight != null && data != null && tileSetName != null)
                        {
                            TileSet tileSet = null;
                            tileSet = engine.GetTileSet(tileSetName);
                            string encoding = (string)data.Attribute("encoding");
                            if (encoding != null && tileSet != null)
                            {
                                Layer layer = map.AddLayer(layerName);
                                if (visible != null && visible == false)
                                {
                                    layer.Visible = false;
                                }
                                if (objects != null && objects == true)
                                {
                                    layer.ObjectLayer = true;
                                }
                                layer.TileSet = tileSet;
                                if (encoding.Equals("csv", StringComparison.OrdinalIgnoreCase))
                                {
                                    layer.SetCSV(data.Value);
                                }
                            }
                        }
                    }
                    foreach (var node in from item in root.Descendants("npc") select item)
                    {
                        string npcName   = (string)node.Attribute("name");
                        string npcEntity = (string)node.Attribute("entity");
                        int?   posX      = (int?)node.Attribute("posX");
                        int?   posY      = (int?)node.Attribute("posY");
                        if (npcName != null && npcEntity != null && posX != null && posY != null)
                        {
                            EntityLoadInfo npc = new EntityLoadInfo(npcName, npcEntity, (int)posX, (int)posY);
                            map.AddLoadNPC(npc);
                        }
                    }
                }
            }
            return(map);
        }
コード例 #12
0
ファイル: Engine.cs プロジェクト: Jebeli/Tiles
 public void SetNextPlayer(string pname, string name, int posX = -1, int posY = -1, int dir = -1)
 {
     playerName = pname;
     playerId   = name;
     nextPlayer = new EntityLoadInfo(playerName, playerId, posX, posY, dir);
 }
コード例 #13
0
ファイル: IniLoader.cs プロジェクト: Jebeli/Tiles
        private Map InternalLoadMap(IniFile ini, string fileId)
        {
            Map    map         = null;
            int    width       = ini.ReadInt("header", "width");
            int    height      = ini.ReadInt("header", "height");
            int    tileWidth   = ini.ReadInt("header", "tilewidth");
            int    tileHeight  = ini.ReadInt("header", "tileheight");
            string orientation = ini.ReadString("header", "orientation");
            string title       = ini.ReadString("header", "title");
            string tileSetId   = ini.ReadString("header", "tileset");

            int[]   startPos = ini.ReadString("header", "hero_pos").ToIntValues();
            TileSet tileSet  = engine.LoadTileSet(tileSetId);

            if (tileSet != null)
            {
                MapOrientation mapOrientation;
                if (Enum.TryParse(orientation, true, out mapOrientation))
                {
                    map = new Map(title, width, height, tileWidth, tileHeight, mapOrientation);
                    string   data    = null;
                    int[]    values  = null;
                    string[] sValues = null;
                    if (startPos.Length >= 2)
                    {
                        map.StartX = startPos[0];
                        map.StartY = startPos[1];
                    }
                    foreach (var sec in ini.Sections)
                    {
                        switch (sec.Name)
                        {
                        case "layer":
                            string        layerType = sec.ReadString("type");
                            StringBuilder sb        = new StringBuilder();
                            foreach (var k in sec.KeyList)
                            {
                                if (k.Ident.Equals(""))
                                {
                                    sb.Append(k.Value);
                                }
                            }
                            data   = sb.ToString();
                            values = data.ToIntValues();
                            Layer layer = map.AddLayer(layerType);
                            layer.TileSet = tileSet;
                            if (layerType.Equals("collision", StringComparison.OrdinalIgnoreCase))
                            {
                                Texture colTex = engine.Graphics.CreateTexture("Collision", tileWidth, tileHeight);
                                layer.TileSet = TileSet.GetCollisionTileSet(colTex);
                                layer.Visible = false;
                            }
                            else if (layerType.Equals("object", StringComparison.OrdinalIgnoreCase))
                            {
                                layer.ObjectLayer = true;
                            }
                            for (int i = 0; i < values.Length; i++)
                            {
                                if (values[i] >= 0)
                                {
                                    layer[i].TileId = values[i];
                                }
                            }
                            break;

                        case "event":
                            string    evtType     = sec.ReadString("type");
                            EventType evtActivate = sec.ReadString("activate").ToEventType();
                            string    evtLocation = sec.ReadString("location");
                            values = evtLocation.ToIntValues();
                            if (values.Length >= 4 && evtType.Equals("event") && evtActivate != EventType.None)
                            {
                                Event evt = new Event(engine, evtActivate, evtType);
                                evt.PosX   = values[0];
                                evt.PosY   = values[1];
                                evt.Width  = values[2];
                                evt.Height = values[3];
                                if (evt.CenterX == -1 && evt.CenterY == -1)
                                {
                                    evt.CenterX = evt.PosX + evt.Width / 2.0f;
                                    evt.CenterY = evt.PosY + evt.Height / 2.0f;
                                }
                                foreach (var k in sec.KeyList)
                                {
                                    switch (k.Ident)
                                    {
                                    case "hotspot":
                                        if (k.Value.Equals("location", StringComparison.OrdinalIgnoreCase))
                                        {
                                            evt.HotSpotFromLocation();
                                            evt.HotSpot = true;
                                        }
                                        else
                                        {
                                            values = k.Value.ToIntValues();
                                            if (values.Length >= 4)
                                            {
                                                evt.HotPosX   = values[0];
                                                evt.HotPosY   = values[1];
                                                evt.HotWidth  = values[2];
                                                evt.HotHeight = values[3];
                                                evt.HotSpot   = true;
                                            }
                                        }
                                        evt.CenterX = evt.HotPosX + evt.HotWidth / 2.0f;
                                        evt.CenterY = evt.HotPosY + evt.HotHeight / 2.0f;
                                        break;

                                    case "mapmod":
                                        var mmEc = evt.AddComponent(EventComponentType.MapMod, 0);
                                        mmEc.MapMods = ParseMapMods(k.Value);
                                        break;

                                    case "spawn":
                                        var spEc = evt.AddComponent(EventComponentType.Spawn, 0);
                                        spEc.MapSpawns = ParseMapSpawns(k.Value);
                                        break;

                                    case "msg":
                                        evt.AddComponent(EventComponentType.Msg, k.Value);
                                        break;

                                    case "repeat":
                                        evt.AddComponent(EventComponentType.Repeat, k.Value.ToBoolValue());
                                        break;

                                    case "stash":
                                        evt.AddComponent(EventComponentType.Stash, k.Value.ToBoolValue());
                                        break;

                                    case "shakycam":
                                        evt.AddComponent(EventComponentType.ShakyCam, k.Value.ToDuration());
                                        break;

                                    case "requires_status":
                                        evt.AddComponent(EventComponentType.RequiresStatus, k.Value.ToStrValues());
                                        break;

                                    case "requires_not_status":
                                        evt.AddComponent(EventComponentType.RequiresNotStatus, k.Value.ToStrValues());
                                        break;

                                    case "set_status":
                                        evt.AddComponent(EventComponentType.SetStatus, k.Value.ToStrValues());
                                        break;

                                    case "unset_status":
                                        evt.AddComponent(EventComponentType.UnsetStatus, k.Value.ToStrValues());
                                        break;

                                    case "intermap":
                                        sValues = k.Value.ToStrValues();
                                        if (sValues.Length >= 3)
                                        {
                                            var imEc = evt.AddComponent(EventComponentType.InterMap, sValues[0]);
                                            imEc.MapX = sValues[1].ToIntValue();
                                            imEc.MapY = sValues[2].ToIntValue();
                                        }
                                        break;

                                    case "intramap":
                                        values = k.Value.ToIntValues();
                                        if (values.Length >= 2)
                                        {
                                            var imEc = evt.AddComponent(EventComponentType.IntraMap, 0);
                                            imEc.MapX = values[0];
                                            imEc.MapY = values[1];
                                        }
                                        break;

                                    case "tooltip":
                                        evt.AddComponent(EventComponentType.Tooltip, k.Value);
                                        break;

                                    case "soundfx":
                                        sValues = k.Value.ToStrValues();
                                        if (sValues.Length >= 1)
                                        {
                                            var fxEc = evt.AddComponent(EventComponentType.SoundFX, sValues[0]);
                                            fxEc.MapX = -1;
                                            fxEc.MapY = -1;
                                            if (sValues.Length >= 3)
                                            {
                                                fxEc.MapX = sValues[0].ToIntValue();
                                                fxEc.MapY = sValues[1].ToIntValue();
                                            }
                                        }
                                        break;

                                    case "cooldown":
                                        evt.Cooldown = k.Value.ToDuration();
                                        break;

                                    case "delay":
                                        evt.Delay = k.Value.ToDuration();
                                        break;

                                    case "music":
                                        evt.AddComponent(EventComponentType.Music, k.Value);
                                        break;
                                    }
                                }
                                map.AddLoadEvent(evt);
                            }
                            break;

                        case "npc":
                            EntityLoadInfo npc         = new EntityLoadInfo();
                            string         npcFilename = sec.ReadString("filename");
                            if (!string.IsNullOrEmpty(npcFilename))
                            {
                                npc.EntityId = npcFilename;
                                string npcLocation = sec.ReadString("location");
                                values = npcLocation.ToIntValues();
                                if (values.Length >= 2)
                                {
                                    npc.PosX = values[0];
                                    npc.PosY = values[1];

                                    map.AddLoadNPC(npc);
                                }
                            }
                            break;

                        case "enemy":
                            string enemyName = sec.ReadString("type");
                            if (!string.IsNullOrEmpty(enemyName))
                            {
                                EnemyGroup enemy = new EnemyGroup(enemyName);
                                foreach (var k in sec.KeyList)
                                {
                                    switch (k.Ident)
                                    {
                                    case "category":
                                        enemy.Category = k.Value;
                                        break;

                                    case "chance":
                                        enemy.Chance = k.Value.ToIntValue(100);
                                        break;

                                    case "location":
                                        values = k.Value.ToIntValues();
                                        if (values.Length >= 2)
                                        {
                                            enemy.PosX = values[0];
                                            enemy.PosY = values[1];
                                        }
                                        if (values.Length >= 4)
                                        {
                                            enemy.Width  = values[2];
                                            enemy.Height = values[3];
                                        }
                                        break;

                                    case "level":
                                        values = k.Value.ToIntValues();
                                        if (values.Length >= 2)
                                        {
                                            enemy.MinLevel = values[0];
                                            enemy.MaxLevel = Math.Max(enemy.MinLevel, values[1]);
                                        }
                                        else if (values.Length >= 1)
                                        {
                                            enemy.MinLevel = values[0];
                                            enemy.MaxLevel = values[0];
                                        }
                                        break;

                                    case "number":
                                        values = k.Value.ToIntValues();
                                        if (values.Length >= 2)
                                        {
                                            enemy.MinNumber = values[0];
                                            enemy.MaxNumber = Math.Max(enemy.MinNumber, values[1]);
                                        }
                                        else if (values.Length >= 1)
                                        {
                                            enemy.MinNumber = values[0];
                                            enemy.MaxNumber = values[0];
                                        }
                                        break;

                                    case "direction":
                                        enemy.Direction = k.Value.ToDirection();
                                        break;

                                    case "waypoints":
                                        var lValues = new List <int>(k.Value.ToIntValues());
                                        while (lValues.Count >= 2)
                                        {
                                            int x = lValues[0];
                                            int y = lValues[1];
                                            lValues.RemoveAt(0);
                                            lValues.RemoveAt(0);
                                            enemy.WayPoints.Add(new FPoint(x + 0.5f, y + 0.5f));
                                        }
                                        enemy.WanderRadius = 0;
                                        break;

                                    case "wander_radius":
                                        enemy.WanderRadius = Math.Max(0, k.Value.ToIntValue());
                                        enemy.WayPoints.Clear();
                                        break;
                                    }
                                }
                                map.AddLoadEnemyGroup(enemy);
                            }
                            break;
                        }
                    }
                    map.MusicName       = ini.ReadString("header", "music");
                    map.BackgroundColor = ini.ReadString("header", "background_color").ToColor();
                    map.AddMapParallax(engine.LoadParallax(ini.ReadString("header", "parallax_layers")));
                }
            }
            return(map);
        }