Beispiel #1
0
        public void MoveTile(TilePosition oldTilePos, TilePosition newTilePos)
        {
            Tile oldTile = tiles[oldTilePos.x | (oldTilePos.y << sizeXbits) | (oldTilePos.z << sizeXBitsYBits)];

            Tile oldTileUpdated = oldTile;

            if (oldTile.LightSource)
            {
                if (updateLighting)
                {
                    LightModelLightSource.UpdateLuminanceDark(this, oldTilePos);
                    oldTileUpdated.LightSourceLuminance = GetTileLightSourceLuminance(oldTilePos);
                }
                else
                {
                    oldTile.LightSourceLuminance = 0;
                }
            }

            oldTileUpdated.tileType    = TileDefinition.EMPTY_TILE_TYPE;
            oldTileUpdated.Energy      = 0;
            oldTileUpdated.Destroyed   = false;
            oldTileUpdated.OnFire      = false;
            oldTileUpdated.CastShadow  = false;
            oldTileUpdated.LightSource = false;
            oldTileUpdated.Dynamic     = false;
            oldTileUpdated.ExtraData   = 0;

            tiles[oldTilePos.x | (oldTilePos.y << sizeXbits) | (oldTilePos.z << sizeXBitsYBits)] = oldTileUpdated;

            if (updateLighting)
            {
                if (oldTileUpdated.CastShadow != oldTile.CastShadow)
                {
                    LightModelAmbient.UpdateLuminanceLight(this, oldTilePos, oldTileUpdated.AmbientLuminance);
                    LightModelLightSource.UpdateLuminanceLight(this, oldTilePos, oldTileUpdated.LightSourceLuminance);
                }
            }

            UpdateTopPosition(oldTilePos, TileDefinition.EMPTY_TILE_TYPE);

            Tile newTileOriginal = GetTile(newTilePos);

            Tile newTile = oldTile;

            if (newTile.LightSource == false)
            {
                newTile.LightSourceLuminance = newTileOriginal.LightSourceLuminance;
            }

            newTile.AmbientLuminance = newTileOriginal.AmbientLuminance;

            tiles[newTilePos.x | (newTilePos.y << sizeXbits) | (newTilePos.z << sizeXBitsYBits)] = newTile;

            if (newTile.Dynamic)
            {
                DynamicTile dynamicTile = dynamicTiles[oldTilePos];

                dynamicTiles.Remove(oldTilePos);
                dynamicTiles[newTilePos] = dynamicTile;

                dynamicTile.tilePosition = newTilePos;

                if (dynamicTilesTimeout.ContainsKey(oldTilePos))
                {
                    dynamicTilesTimeout.Remove(oldTilePos);
                    dynamicTilesTimeout[newTilePos] = dynamicTile;
                }
            }

            if (updateLighting)
            {
                if (newTile.CastShadow)
                {
                    LightModelAmbient.UpdateLuminanceDark(this, newTilePos);
                    LightModelLightSource.UpdateLuminanceDark(this, newTilePos);
                }

                if (newTile.LightSource)
                {
                    LightModelLightSource.UpdateLuminanceLight(this, newTilePos, newTile.LightSourceLuminance);
                }
            }
            else
            {
                if (newTile.LightSource)
                {
                    SetTileLightSourceLuminance(newTilePos, newTile.LightSourceLuminance);
                }
            }

            UpdateTopPosition(newTilePos, newTile.tileType);

            if (enqueueTileUpdates)
            {
                EnqueueInvalidatedTileAndNearTiles(oldTilePos);
                EnqueueInvalidatedTileAndNearTiles(newTilePos);
            }

            if (reportTileInvalidated)
            {
                ReportTileInvalidated(oldTilePos);
                ReportTileInvalidated(newTilePos);
            }
        }
Beispiel #2
0
        public void SetTileOnFire(TilePosition pos, bool onFire)
        {
            if (GetTileType(pos) != TileDefinition.EMPTY_TILE_TYPE)
            {
                if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].OnFire != onFire)
                {
                    tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].OnFire = onFire;

                    if (onFire)
                    {
                        ExecuteTileActions(pos, TileActionRule.ActionType.ONFIRE);

                        if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource == false)
                        {
                            tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource = true;

                            if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow)
                            {
                                tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow = false;
                                if (updateLighting)
                                {
                                    LightModelAmbient.UpdateLuminanceDark(this, pos);
                                }
                            }

                            if (updateLighting)
                            {
                                LightModelLightSource.UpdateLuminanceLight(this, pos, (byte)(Tile.MAX_LUMINANCE - 1));
                            }
                            else
                            {
                                SetTileLightSourceLuminance(pos, (byte)(Tile.MAX_LUMINANCE - 1));
                            }
                        }
                    }
                    else
                    {
                        TileDefinition def = GetTileDefinition(GetTileType(pos));

                        if (tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource != (def.lightSourceIntensity > 0))
                        {
                            if (updateLighting)
                            {
                                LightModelLightSource.UpdateLuminanceDark(this, pos);
                            }

                            tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSource = false;

                            if (def.castShadow != tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow != def.castShadow)
                            {
                                tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow = false;

                                if (updateLighting)
                                {
                                    LightModelAmbient.UpdateLuminanceLight(this, pos, GetTileAmbientLuminance(pos));
                                }
                            }
                        }
                    }

                    if (enqueueTileUpdates)
                    {
                        EnqueueInvalidatedTileAndNearTiles(pos);
                    }

                    if (reportTileInvalidated)
                    {
                        ReportTileInvalidated(pos);
                    }
                }
            }
        }
Beispiel #3
0
        public void SetTileType(TilePosition pos, byte type)
        {
            Tile oldTile = tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)];

            if (oldTile.Dynamic)
            {
                SetTileDynamic(pos, false, false, 0);
                oldTile.Dynamic = false;
            }

            if (oldTile.LightSource)
            {
                if (updateLighting)
                {
                    LightModelLightSource.UpdateLuminanceDark(this, pos);
                    oldTile.LightSourceLuminance = GetTileLightSourceLuminance(pos);
                }
                else
                {
                    oldTile.LightSourceLuminance = 0;
                }
            }

            Tile           newTile        = oldTile;
            TileDefinition tileDefinition = GetTileDefinition(type);

            newTile.tileType    = type;
            newTile.Energy      = (byte)tileDefinition.energy;
            newTile.Destroyed   = false;
            newTile.OnFire      = false;
            newTile.CastShadow  = tileDefinition.castShadow;
            newTile.LightSource = (tileDefinition.lightSourceIntensity > 0);
            newTile.ExtraData   = 0;

            tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)] = newTile;

            if (updateLighting)
            {
                if (newTile.CastShadow != oldTile.CastShadow)
                {
                    if (newTile.CastShadow)
                    {
                        LightModelAmbient.UpdateLuminanceDark(this, pos);
                        LightModelLightSource.UpdateLuminanceDark(this, pos);
                    }
                    else
                    {
                        LightModelAmbient.UpdateLuminanceLight(this, pos, newTile.AmbientLuminance);
                        LightModelLightSource.UpdateLuminanceLight(this, pos, newTile.LightSourceLuminance);
                    }
                }

                if (tileDefinition.lightSourceIntensity > 0)
                {
                    LightModelLightSource.UpdateLuminanceLight(this, pos, tileDefinition.lightSourceIntensity);
                }
            }
            else
            {
                if (newTile.LightSource)
                {
                    SetTileLightSourceLuminance(pos, tileDefinition.lightSourceIntensity);
                }
            }

            ExecuteTileActions(pos, TileActionRule.ActionType.CREATED);

            if (enqueueTileUpdates)
            {
                EnqueueInvalidatedTileAndNearTiles(pos);
            }

            UpdateTopPosition(pos, type);

            if (reportTileInvalidated)
            {
                ReportTileInvalidated(pos);
            }
        }