public void TeleportToTile(HexTile tile) => TeleportToTile(tile, false);
public void TeleportToTile(HexTile tile) { var destHolder = tile.TileMap.Holder; var curHolder = CurrentTile.TileMap.Holder; if (destHolder.TypeName != nameof(StarSystem)) { Logger.Log(LogType.Warning, $"{nameof(Planet)}.{nameof(TeleportToTile)}", "Planet can exist only on StarSystem!"); return; } var toRemove = new HashSet <IModifier>(); var toAdd = new HashSet <IModifier>(destHolder.GetAllTiledModifiers(OwnPlayer.PlayerName)); foreach (var m in AffectedTiledModifiers) { if (toAdd.Contains(m)) { toAdd.Remove(m); } else { toRemove.Add(m); } } // Should consider non-tiled modifiers when the tilemap holder changes if (curHolder.Id != destHolder.Id) { foreach (var m in destHolder.GetModifiers(OwnPlayer.PlayerName)) { toAdd.Add(m); } foreach (var m in curHolder.GetModifiers(OwnPlayer.PlayerName)) { if (toAdd.Contains(m)) { toAdd.Remove(m); } else { toRemove.Add(m); } } } // Remove modifier effect before detaching foreach (var m in toRemove) { ApplyModifierChangeToDownward(OwnPlayer.PlayerName, m, true, false); } CurrentTile.RemoveTileObject(TypeName); CurrentTile = tile; // Add modifier effect after attaching tile.AddTileObject(this); foreach (var m in toAdd) { ApplyModifierChangeToDownward(OwnPlayer.PlayerName, m, false, false); } }