private bool GetTileScript(locXY tileLoc, out TileScript tileScript)
    {
        using var lockedSector = new LockedMapSector(new SectorLoc(tileLoc));
        var sector = lockedSector.Sector;

        if (sector == null)
        {
            tileScript = default;
            return(false);
        }
        var tileIndex = sector.GetTileOffset(tileLoc);

        foreach (var scriptInSector in sector.tileScripts)
        {
            if (scriptInSector.tileIndex == tileIndex)
            {
                tileScript.Location        = tileLoc;
                tileScript.Script.unk1     = scriptInSector.scriptUnk1;
                tileScript.Script.counters = scriptInSector.scriptCounters;
                tileScript.Script.scriptId = scriptInSector.scriptId;
                return(true);
            }
            else if (scriptInSector.tileIndex > tileIndex)
            {
                break; // Tiles are sorted in ascending order
            }
        }

        tileScript = default;
        return(false);
    }
Ejemplo n.º 2
0
    private static void HandleEnterNewSector(SectorLoc loc, GameObject obj)
    {
        {
            using var sectorLock = new LockedMapSector(loc);
            var sector      = sectorLock.Sector;
            var lightScheme = sector.lightScheme;
            if (lightScheme == 0)
            {
                lightScheme = GameSystems.LightScheme.GetDefaultScheme();
            }
            if (lightScheme != GameSystems.LightScheme.GetCurrentScheme())
            {
                var hourOfDay = GameSystems.TimeEvent.HourOfDay;
                GameSystems.LightScheme.SetCurrentScheme(sector.lightScheme, hourOfDay);
            }

            if (sector.soundList.scheme1 != 0 || sector.soundList.scheme2 != 0)
            {
                GameSystems.SoundGame.SetScheme(sector.soundList.scheme1, sector.soundList.scheme2);
            }
        }

        GameSystems.TileScript.TriggerSectorScript(loc, obj);

        var followers = GameSystems.Critter.EnumerateDirectFollowers(obj);

        foreach (var follower in followers)
        {
            GameSystems.Script.ExecuteObjectScript(obj, follower, 0,
                                                   ObjScriptEvent.NewSector);
        }
    }
Ejemplo n.º 3
0
 public PartialSector(SectorLoc sectorLoc, bool fullSector, Rectangle tileRectangle, LockedMapSector sector)
 {
     SectorLoc     = sectorLoc;
     FullSector    = fullSector;
     TileRectangle = tileRectangle;
     Sector        = sector;
 }
Ejemplo n.º 4
0
 public SectorIterator(int fromX, int toX, int fromY, int toY)
 {
     _lockedMapSector = default;
     _fromX           = fromX / Sector.SectorSideSize;
     _fromY           = fromY / Sector.SectorSideSize;
     _toX             = toX / Sector.SectorSideSize;
     _toY             = toY / Sector.SectorSideSize;
     _x = _fromX;
     _y = _fromY;
 }
Ejemplo n.º 5
0
    public LockedMapSector Next()
    {
        _lockedMapSector?.Dispose();

        _lockedMapSector = new LockedMapSector(_x, _y);
        if (++_x > _toX)
        {
            _x = _fromX;
            ++_y;
        }

        return(_lockedMapSector);
    }
Ejemplo n.º 6
0
    public void RenderOccludedMapObjects(IGameViewport viewport, int tileX1, int tileX2, int tileY1, int tileY2)
    {
        using var _ = mDevice.CreatePerfGroup("Occluded Map Objects");

        for (var secY = tileY1 / 64; secY <= tileY2 / 64; ++secY)
        {
            for (var secX = tileX1 / 64; secX <= tileX2 / 64; ++secX)
            {
                using var sector = new LockedMapSector(secX, secY);

                foreach (var obj in sector.EnumerateObjects())
                {
                    RenderOccludedObject(viewport, obj);
                }
            }
        }
    }
Ejemplo n.º 7
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);
    }
Ejemplo n.º 8
0
    public static void RenderAllAnimGoals(IGameViewport viewport, int tileX1, int tileX2, int tileY1, int tileY2)
    {
        if (!Enabled)
        {
            return;
        }

        for (var secY = tileY1 / 64; secY <= tileY2 / 64; ++secY)
        {
            for (var secX = tileX1 / 64; secX <= tileX2 / 64; ++secX)
            {
                using var sector = new LockedMapSector(secX, secY);

                foreach (var obj in sector.EnumerateObjects())
                {
                    RenderAnimGoals(viewport, obj);
                }
            }
        }
    }
    public bool MoveNext()
    {
        _lockedSector?.Dispose();

        if (_currentX >= _endX || _currentY >= _endY)
        {
            return(false);
        }

        var secX = _currentX / 64;
        var remX = _currentX % 64;
        var secY = _currentY / 64;
        var remY = _currentY % 64;
        var w    = Math.Min(64 - remX, _endX - _currentX);
        var h    = Math.Min(64 - remY, _endY - _currentY);

        var sectorLoc = new SectorLoc(secX, secY);

        if (_lockSectors)
        {
            _lockedSector = new LockedMapSector(sectorLoc);
        }

        Current = new PartialSector(
            sectorLoc,
            w < 64 || h < 64,
            new Rectangle(remX, remY, w, h),
            _lockedSector
            );

        _currentX += w;
        if (_currentX >= _endX)
        {
            _currentX  = _tileRectangle.Left;
            _currentY += h;
        }

        return(true);
    }