Ejemplo n.º 1
0
 public TileDefinition.DrawMode GetTileDrawMode(TilePosition pos)
 {
     return(GetTileDefinition(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].tileType).drawMode);
 }
Ejemplo n.º 2
0
 public bool GetTileCastShadow(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].CastShadow);
 }
Ejemplo n.º 3
0
 public byte GetTileType(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].tileType);
 }
Ejemplo n.º 4
0
 public bool GetTileBurns(TilePosition pos)
 {
     return(GetTileDefinition(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].tileType).burns);
 }
Ejemplo n.º 5
0
 public void TileClicked(TilePosition pos)
 {
     ExecuteTileActions(pos, TileActionRule.ActionType.CLICKED);
 }
Ejemplo n.º 6
0
 private void ReportTileInvalidated(TilePosition pos)
 {
     ReportTileInvalidated(pos, false);
 }
Ejemplo n.º 7
0
 public byte GetTileEnergy(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].Energy);
 }
Ejemplo n.º 8
0
 public bool IsValidTile(TilePosition pos)
 {
     return(pos.x >= 0 && pos.x < sizeX && pos.y >= 0 && pos.y < sizeY && pos.z >= 0 && pos.z < sizeZ);
 }
Ejemplo n.º 9
0
        public bool HasTileActions(TilePosition pos, TileActionRule.ActionType actionType)
        {
            TileDefinition tileDefinition = GetTileDefinition(GetTileType(pos));

            return(tileDefinition.tileActionRules != null && tileDefinition.tileActionRules.GetRulesForAction(actionType) != null);
        }
Ejemplo n.º 10
0
 public bool GetTileOnFire(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].OnFire);
 }
Ejemplo n.º 11
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);
                    }
                }
            }
        }
Ejemplo n.º 12
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);
            }
        }
Ejemplo n.º 13
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);
            }
        }
Ejemplo n.º 14
0
 public byte GetTileAmbientLuminance(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].AmbientLuminance);
 }
Ejemplo n.º 15
0
 public DynamicTile GetDynamicTile(TilePosition pos)
 {
     return(dynamicTiles[pos]);
 }
Ejemplo n.º 16
0
 public byte GetTileLightSourceLuminance(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].LightSourceLuminance);
 }
Ejemplo n.º 17
0
 public bool GetTileDynamic(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].Dynamic);
 }
Ejemplo n.º 18
0
 public void TileHitFloor(TilePosition pos)
 {
     ExecuteTileActions(pos, TileActionRule.ActionType.HIT_FLOOR);
 }
Ejemplo n.º 19
0
 public byte GetTileExtraData(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].ExtraData);
 }
Ejemplo n.º 20
0
 public void TileDamaged(TilePosition pos)
 {
     ExecuteTileActions(pos, TileActionRule.ActionType.DAMAGED);
 }
Ejemplo n.º 21
0
 public bool GetTileLiquid(TilePosition pos)
 {
     return(GetTileDefinition(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)].tileType).liquid);
 }
Ejemplo n.º 22
0
        public void Load(System.IO.BinaryReader br)
        {
            //Read tile definition mapper (oldId -> newId)
            byte[] mapTileDefinitionMapper = new byte[byte.MaxValue];

            int definitions = br.ReadInt32();

            for (int i = 0; i < definitions; i++)
            {
                byte   oldType = br.ReadByte();
                string id      = br.ReadString();
                byte   newType = 0;

                foreach (TileDefinition td in tileDefinitions)
                {
                    if (td.id == id)
                    {
                        newType = td.tileType;
                        break;
                    }
                }

                mapTileDefinitionMapper[oldType] = newType;
            }

            //Read map size
            //This is read in CubeWorld.Load()
            //int sizeXbits = br.ReadInt32();
            //int sizeYbits = br.ReadInt32();
            //int sizeZbits = br.ReadInt32();

            //Create empty world
            //The world is already created in CubeLoad.Load()
            //Create(tileDefinitions, sizeXbits, sizeYbits, sizeZbits);

            //Read tiles
            byte[] tileBytes = br.ReadBytes(sizeX * sizeY * sizeZ * 4);
            Tile   tile      = new Tile();

            for (int n = tiles.Length - 1; n >= 0; n--)
            {
                tile.tileType  = mapTileDefinitionMapper[tileBytes[(n << 2) | 0]];
                tile.luminance = tileBytes[(n << 2) | 1];
                tile.extra     = tileBytes[(n << 2) | 2];
                tile.extra2    = tileBytes[(n << 2) | 3];

                tiles[n] = tile;
            }

            //Read dynamic tiles
            int nDyanamicTiles = br.ReadInt32();

            for (int n = 0; n < nDyanamicTiles; n++)
            {
                int          objectId = br.ReadInt32();
                TilePosition pos      = SerializationUtils.ReadTilePosition(br);
                int          timeout  = br.ReadInt32();

                DynamicTile dynamicTile = new DynamicTile(world, pos, true, objectId);

                //TODO: Get gravity attribute from somewhere
                if (true)
                {
                    dynamicTile.AddComponent(new TileComponentGravity());
                }

                dynamicTiles[pos] = dynamicTile;

                if (timeout > 0)
                {
                    dynamicTile.timeout      = timeout;
                    dynamicTilesTimeout[pos] = dynamicTile;
                }

                world.cwListener.CreateObject(dynamicTile);
            }

            //Read top positions
            topPositions = br.ReadBytes(sizeX * sizeZ);

            if (world.gameplay.useEnqueueTileUpdates)
            {
                EnqueueTilesWithRules();
            }

            enqueueTileUpdates    = world.gameplay.useEnqueueTileUpdates;
            updateLighting        = true;
            reportTileInvalidated = true;

            if (world.gameplay.useEnqueueTileUpdates)
            {
                UpdateTiles();
            }

            //The read tiles already have the light information updated
            //LightModelAmbient.InitLuminance(this);
            //LightModelLightSource.InitLuminance(this);
        }
Ejemplo n.º 23
0
 public Tile GetTile(TilePosition pos)
 {
     return(tiles[pos.x | (pos.y << sizeXbits) | (pos.z << sizeXBitsYBits)]);
 }