Exemplo n.º 1
0
 public void OnExposed(FireExposure exposure)
 {
     if (exposure.Temperature > HeatResistance)
     {
         ApplyDamage(exposure.StandardDamage(), AttackType.Fire, DamageType.Burn);
     }
 }
Exemplo n.º 2
0
    private void Expose(Vector3Int hotspotPosition, Vector3Int atLocalPosition)
    {
        var isSideExposure = hotspotPosition != atLocalPosition;
        //calculate world position
        var hotspotWorldPosition = MatrixManager.LocalToWorldInt(hotspotPosition, MatrixManager.Get(matrix));
        var atWorldPosition      = MatrixManager.LocalToWorldInt(atLocalPosition, MatrixManager.Get(matrix));
        var exposure             = FireExposure.FromMetaDataNode(hotspots[hotspotPosition], hotspotWorldPosition.To2Int(), atLocalPosition.To2Int(), atWorldPosition.To2Int());

        if (isSideExposure)
        {
            //side exposure logic

            //already exposed by a different hotspot
            if (hotspots.ContainsKey(atLocalPosition))
            {
                return;
            }

            var metadata = metaDataLayer.Get(atLocalPosition);
            if (!metadata.IsOccupied)
            {
                //atmos can pass here, so no need to check side exposure (nothing to brush up against)
                return;
            }

            //only expose to atmos impassable objects, since those are the things the flames would
            //actually brush up against
            var regTiles = matrix.Get <RegisterTile>(atLocalPosition, true);
            foreach (var regTile in regTiles)
            {
                if (!regTile.IsAtmosPassable(exposure.HotspotLocalPosition.To3Int(), true))
                {
                    var exposable = regTile.GetComponent <IFireExposable>();
                    exposable.OnExposed(exposure);
                }
            }

            //expose the tiles there
            foreach (var tilemapDamage in tilemapDamages)
            {
                tilemapDamage.OnExposed(exposure);
            }
        }
        else
        {
            //direct exposure logic
            var fireExposables = matrix.Get <IFireExposable>(atLocalPosition, true);
            foreach (var exposable in fireExposables)
            {
                exposable.OnExposed(exposure);
            }
            //expose the tiles
            foreach (var tilemapDamage in tilemapDamages)
            {
                tilemapDamage.OnExposed(exposure);
            }
        }
    }
Exemplo n.º 3
0
 public void OnExposed(FireExposure exposure)
 {
     Profiler.BeginSample("IntegrityExpose");
     if (exposure.Temperature > HeatResistance)
     {
         ApplyDamage(exposure.StandardDamage(), AttackType.Fire, DamageType.Burn);
     }
     Profiler.EndSample();
 }
Exemplo n.º 4
0
 /// <summary>
 /// Efficient fire exposure for all IFireExposable components on this register tile.
 /// Uses cached IFireExposable so no GC caused by GetComponent
 /// </summary>
 /// <param name="exposure"></param>
 public void OnExposed(FireExposure exposure)
 {
     if (fireExposables == null)
     {
         return;
     }
     foreach (var fireExposable in fireExposables)
     {
         fireExposable.OnExposed(exposure);
     }
 }
Exemplo n.º 5
0
	public void OnExposed(FireExposure exposure)
	{
		if (Layer.LayerType == LayerType.Floors ||
		    Layer.LayerType == LayerType.Base ||
		    Layer.LayerType == LayerType.Walls ) return;

		var basicTile = metaTileMap.GetTile(exposure.ExposedLocalPosition, Layer.LayerType) as BasicTile;

		if (basicTile == null) return;

		MetaDataNode data = metaDataLayer.Get(exposure.ExposedLocalPosition);
		AddDamage(exposure.StandardDamage(), AttackType.Fire, data, basicTile, exposure.ExposedWorldPosition);
	}
Exemplo n.º 6
0
    public void OnExposed(FireExposure exposure)
    {
        Profiler.BeginSample("TileExpose");
        var cellPos = exposure.ExposedLocalPosition;

        if (Layer.LayerType == LayerType.Floors)
        {
            //floor scorching
            if (exposure.IsSideExposure)
            {
                Profiler.EndSample();
                return;
            }

            if (!(exposure.Temperature > TILE_MIN_SCORCH_TEMPERATURE))
            {
                Profiler.EndSample();
                return;
            }

            if (!metaTileMap.HasTile(cellPos, true))
            {
                Profiler.EndSample();
                return;
            }
            TryScorch(cellPos);
        }
        else if (Layer.LayerType == LayerType.Windows)
        {
            if (metaTileMap.HasTile(cellPos, LayerType.Windows, true))
            {
                //window damage
                SoundManager.PlayNetworkedAtPos("GlassHit", exposure.ExposedWorldPosition, Random.Range(0.9f, 1.1f));
                AddWindowDamage(exposure.StandardDamage(), metaDataLayer.Get(cellPos), cellPos, exposure.ExposedWorldPosition, AttackType.Fire, false);
            }
        }
        else if (Layer.LayerType == LayerType.Grills)
        {
            //grill damage
            //Make sure a window is not protecting it first:
            if (!metaTileMap.HasTile(cellPos, LayerType.Windows, true))
            {
                if (metaTileMap.HasTile(cellPos, LayerType.Grills, true))
                {
                    SoundManager.PlayNetworkedAtPos("GrillHit", exposure.ExposedWorldPosition, Random.Range(0.9f, 1.1f));
                    AddGrillDamage(exposure.StandardDamage(), metaDataLayer.Get(cellPos), cellPos, exposure.ExposedWorldPosition, AttackType.Fire, false);
                }
            }
        }
        Profiler.EndSample();
    }
Exemplo n.º 7
0
    public void OnExposed(FireExposure exposure)
    {
        var cellPos = exposure.ExposedLocalPosition.To3Int();

        if (Layer.LayerType == LayerType.Floors)
        {
            //floor scorching
            if (exposure.IsSideExposure)
            {
                return;
            }
            if (!(exposure.Temperature > TILE_MIN_SCORCH_TEMPERATURE))
            {
                return;
            }

            if (!metaTileMap.HasTile(cellPos, true))
            {
                return;
            }
            //is it already scorched
            var metaData = metaDataLayer.Get(exposure.ExposedLocalPosition.To3Int());
            if (metaData.IsScorched)
            {
                return;
            }

            //scorch the tile, choose appearance randomly
            //TODO: This should be done using an overlay system which hasn't been implemented yet, this replaces
            //the tile's original appearance
            if (Random.value >= 0.5)
            {
                tileChangeManager.UpdateTile(cellPos, TileType.Floor, "floorscorched1");
            }
            else
            {
                tileChangeManager.UpdateTile(cellPos, TileType.Floor, "floorscorched2");
            }

            metaData.IsScorched = true;
        }
        else if (Layer.LayerType == LayerType.Windows)
        {
            if (metaTileMap.HasTile(cellPos, LayerType.Windows, true))
            {
                //window damage
                MetaDataNode data = metaDataLayer.Get(cellPos);
                SoundManager.PlayNetworkedAtPos("GlassHit", exposure.ExposedWorldPosition.To3Int(), Random.Range(0.9f, 1.1f));
                AddWindowDamage(exposure.StandardDamage(), data, cellPos, exposure.ExposedWorldPosition.To3Int(), AttackType.Melee);
                return;
            }
        }
        else if (Layer.LayerType == LayerType.Grills)
        {
            //grill damage
            //Make sure a window is not protecting it first:
            if (!metaTileMap.HasTile(cellPos, LayerType.Windows, true))
            {
                if (metaTileMap.HasTile(cellPos, LayerType.Grills, true))
                {
                    //window damage
                    MetaDataNode data = metaDataLayer.Get(cellPos);
                    SoundManager.PlayNetworkedAtPos("GrillHit", exposure.ExposedWorldPosition.To3Int(), Random.Range(0.9f, 1.1f));
                    AddGrillDamage(exposure.StandardDamage(), data, cellPos, exposure.ExposedWorldPosition.To3Int(), AttackType.Melee);
                }
            }
        }
    }