Наблюдаю явление, которому не могу найти объяснение.
Пишу в своё удовольствие рогалик, сейчас работаю над генерацией уровня. Просмотр сгенерёного уровня делаю с помошью curses.newpad, скролл которого делаю следующим образом:
        while True:
            c=stdscr.getch()
            if c == ord ('q'):
                break
            if c == ord ('w'):
                cl.scroll (0, -1)
            if c == ord ('a'):
                cl.scroll (-1, 0)
            if c == ord ('s'):
                cl.scroll (0, 1)
            if c == ord ('d'):
                cl.scroll (+1, 0)
            cl.refresh ()

где cl.scroll это

    def scroll (self, __x, __y):
        """Change _x, _y according to arguments. Does not refresh,\
        but sets variables for refresh() to run. """
        assert isinstance (__x, int)
        assert isinstance (__y, int)        
        if self._x == self.lvl.min_x - 2*self.draw_length and __x < 0:
            __x = 0
        elif self._x == self.lvl.max_x + 2*self.draw_length+15 and __x > 0:
            __x = 0
        self._x +=__x
        if self._y == self.lvl.min_y - 2*self.draw_length and __y < 0:
            __y = 0
        elif self._y == self.lvl.max_y + 2*self.draw_length+15 and __y > 0:
            __y = 0
        self._y +=__y

потом делаю pad.refresh ()

Скролл работает, однако в некоторых случаях (когда уровень получается сильно разлапистым) получается, что вниз и вправо скролл не захватывает весь уровень. При этом размеры pad и уровня вполне правильны:
“l” это уровень, “cl” это curses.newpad
In [5]: l
Out[5]: Level (room_size_min = 5, room_size_max = 7,        room_type = "random", digger_where_to = (2, 4, 6, 8),         digger_stamina = 6, doors_are_useful = True,         min_rooms = 5, max_rooms = 10, room_times = 1)
In [6]: l.size_y, l.size_x
Out[6]: (121, 101)
In [7]: cl.pad.getmaxyx()
Out[7]: (123, 103)
Вопрос: может в curses есть какой-то максимальный размер объекта или что? По докам про curses не припоминаю такого. По переменным я понять в чём дело не могу.