public TiledModifier(ModifierCore core, int adderObjectId, string rangeKey,
                      HashSet <HexTileCoord> tiles, int leftWeek)
 {
     _core            = core;
     AdderObjectId    = adderObjectId;
     _infos[rangeKey] = new TiledModifierInfo(tiles, leftWeek);
 }
        /// <summary>
        ///     Returns pure added tile effect range
        /// </summary>
        public HashSet <HexTileCoord> AddTileInfo(string rangeKey, HashSet <HexTileCoord> tiles, int leftWeek)
        {
            if (_infos.ContainsKey(rangeKey))
            {
                return(new HashSet <HexTileCoord>());
            }

            var result = new HashSet <HexTileCoord>(
                from t in tiles
                where _infos.Values.All(info => !info.Tiles.Contains(t))
                select t);

            _infos[rangeKey] = new TiledModifierInfo(tiles, leftWeek);

            return(result);
        }
        /// <summary>
        ///     Returns removed range and newly affected range
        /// </summary>
        /// <returns></returns>
        public (HashSet <HexTileCoord> removed, HashSet <HexTileCoord> added) MoveTileInfo(
            string rangeKey, HashSet <HexTileCoord> newTiles)
        {
            if (!_infos.ContainsKey(rangeKey))
            {
                return(new HashSet <HexTileCoord>(), new HashSet <HexTileCoord>());
            }

            var pureAdded = new HashSet <HexTileCoord>(
                from t in newTiles
                where _infos.Values.All(info => !info.Tiles.Contains(t))
                select t);

            var originalTile = _infos[rangeKey].Tiles;

            _infos[rangeKey] = new TiledModifierInfo(newTiles, _infos[rangeKey].LeftWeek);

            var pureRemoved = new HashSet <HexTileCoord>(
                from t in originalTile
                where _infos.Values.All(info => !info.Tiles.Contains(t))
                select t);

            return(pureRemoved, pureAdded);
        }