예제 #1
0
    public static ObjList ListTile(locXY loc, ObjectListFilter flags)
    {
        Span <bool> returnTypes = stackalloc bool[ObjectTypes.Count];

        CreateTypeFilter(flags, returnTypes);

        var result = new ObjList();

        var sectorLoc = new SectorLoc(loc);

        if ((flags & ObjectListFilter.OLC_STATIC) != 0 || GameSystems.MapSector.IsSectorLoaded(sectorLoc))
        {
            using var lockedSector = new LockedMapSector(sectorLoc);

            Sector.GetSectorTileCoords(loc, out var tileX, out var tileY);

            var objects = lockedSector.GetObjectsAt(tileX, tileY);
            result.EnsureCapacity(objects.Count);
            foreach (var obj in objects)
            {
                if (!GameSystems.MapObject.IsHiddenByFlags(obj) && returnTypes[(int)obj.type])
                {
                    result.Add(obj);
                }
            }
        }
        else
        {
            foreach (var obj in GameSystems.Object.SpatialIndex.EnumerateInSector(sectorLoc))
            {
                if (!obj.type.IsStatic())
                {
                    if (!obj.HasFlag(ObjectFlag.INVENTORY) &&
                        obj.GetLocation() == loc &&
                        !GameSystems.MapObject.IsHiddenByFlags(obj) &&
                        returnTypes[(int)obj.type])
                    {
                        result.Add(obj);
                    }
                }
            }
        }

        ++dword_10808CF8;
        return(result);
    }
예제 #2
0
    private static void CreateTypeFilter(ObjectListFilter flags, Span <bool> typeFilter)
    {
        Debug.Assert(typeFilter.Length == ObjectTypes.Count);

        if (flags.HasFlag(ObjectListFilter.OLC_PORTAL))
        {
            typeFilter[(int)ObjectType.portal] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_CONTAINER))
        {
            typeFilter[(int)ObjectType.container] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_SCENERY))
        {
            typeFilter[(int)ObjectType.scenery] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_PROJECTILE))
        {
            typeFilter[(int)ObjectType.projectile] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_WEAPON))
        {
            typeFilter[(int)ObjectType.weapon] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_AMMO))
        {
            typeFilter[(int)ObjectType.ammo] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_ARMOR))
        {
            typeFilter[(int)ObjectType.armor] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_MONEY))
        {
            typeFilter[(int)ObjectType.money] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_FOOD))
        {
            typeFilter[(int)ObjectType.food] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_SCROLL))
        {
            typeFilter[(int)ObjectType.scroll] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_KEY))
        {
            typeFilter[(int)ObjectType.key] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_BAG))
        {
            typeFilter[(int)ObjectType.bag] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_WRITTEN))
        {
            typeFilter[(int)ObjectType.written] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_GENERIC))
        {
            typeFilter[(int)ObjectType.generic] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_PC))
        {
            typeFilter[(int)ObjectType.pc] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_NPC))
        {
            typeFilter[(int)ObjectType.npc] = true;
        }

        if (flags.HasFlag(ObjectListFilter.OLC_TRAP))
        {
            typeFilter[(int)ObjectType.trap] = true;
        }
    }