Example #1
0
 public void TeleportToTile(HexTile tile) => TeleportToTile(tile, false);
Example #2
0
        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);
            }
        }