public void OnExposed(FireExposure exposure) { if (exposure.Temperature > HeatResistance) { ApplyDamage(exposure.StandardDamage(), AttackType.Fire, DamageType.Burn); } }
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); } } }
public void OnExposed(FireExposure exposure) { Profiler.BeginSample("IntegrityExpose"); if (exposure.Temperature > HeatResistance) { ApplyDamage(exposure.StandardDamage(), AttackType.Fire, DamageType.Burn); } Profiler.EndSample(); }
/// <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); } }
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); }
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(); }
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); } } } }