public bool updateItem(string name, MapItem prev, MapItem next)
    {
        if (next == null)
        {
            destroyItem(prev.row, prev.column);
            return(true);
        }
        if (prev == null)
        {
            createItem(next);
            return(true);
        }

        Tank tank = findByName(name);

        if (tank == null)
        {
            createItem(name, next);
            return(true);
        }


        int moveByRow    = tank.row - next.row;
        int moveByColumn = tank.column - next.column;
        int rotateBy     = 0;
        int movementDirection;

        if (moveByColumn != 0 || moveByRow != 0)
        {
            if (Mathf.Abs(moveByColumn) > 1 || Mathf.Abs(moveByRow) > 1)
            {
                tank.deltas.Add(TankDelta.teleportTo(MapUtils.mapToWorld(next.row, next.column)));
            }
            else
            {
                movementDirection = getDirectionForMovement(moveByRow, -moveByColumn, rotateBy);
                tank.deltas.Add(TankDelta.rotateToDirection(movementDirection));
                tank.deltas.Add(TankDelta.moveTo(MapUtils.mapToWorld(next.row, next.column)));
                tank.row    = next.row;
                tank.column = next.column;
            }
        }
        var directionSymbol = canProcess(next.symbol) ? next.symbol : prev.symbol;

        tank.deltas.Add(TankDelta.rotateToDirection(MapUtils.getTankDirection(directionSymbol)));
        return(true);
    }
    public void onUpdate(Dictionary <string, MapItem> tanks)
    {
        Tank tank;
        int  moveByRow;
        int  moveByColumn;
        int  rotateBy;
        int  movementDirection;

        foreach (var name in tanks.Keys)
        {
            tank = findByName(name);

            if (tank == null)
            {
                createItem(tanks[name].symbol, tanks[name].row, tanks[name].column);
                return;
            }

            moveByRow    = tank.row - tanks[name].row;
            moveByColumn = tank.column - tanks[name].column;
            rotateBy     = 0;
            if (moveByColumn != 0 || moveByRow != 0)
            {
                movementDirection = getDirectionForMovement(moveByRow, moveByColumn, rotateBy);
                tank.deltas.Add(TankDelta.rotateToDirection(movementDirection));
                tank.deltas.Add(TankDelta.moveTo(tank.transform.position + MapUtils.getWorldDelta(moveByRow, moveByColumn)));
            }
            tank.deltas.Add(TankDelta.rotateToDirection(getLocalDirection(tanks[name].symbol)));
        }
        var tankNames = new List <string>(tanks.Keys);

        for (var entityId = 0; entityId < _filter.EntitiesCount; entityId++)
        {
            tank = _filter.Components1[entityId];
            if (tankNames.IndexOf(tank.name) < 0)
            {
                removeItem(tank);
            }
        }
    }