В общем немного поиска, немного усилий и мне удалось написать приемлемый дебаггер, который я и собираюсь использовать дальше (а значит и буду поддерживать пока он мне нужен). Возможно вы ожидали другого - тогда пишите, но именно такое чудо я подразумеваю когда говорю "дебаггер".
Сразу расскажу немного о принципе - руби со своим метопрограммированием на голову выше всех языков, с которыми я сталкивался. В основе дебаггера две вещи - binding и eval.
Binding - это считай окружение, он содержит все все все переменные, методы, константы конкретного участка кода. Грубо говоря, находясь в класс Actor на xxx сточке, в методе, в цикле, в блоке вы можете вызвать binding который будет слепком этого самого места. (Я бы наверное сам бы не понял, если бы не знал что такое binding и прочитал такое объяснение, но лучше я не могу
Просто попользуйтесь дебаггером и все поймете)
Kernel#eval - метод, позволяющий исполнить строку, как будто в ней код.
Будьте осторожный с этим методом. Я надеюсь, что вы не попытаетесь через дебаггер снести себе папки на диске C.
Код
можно скачать перейдя по этой длинной ссылке. Он пока что плохо прокомментирован, буду исправлять в процессе использования.
Как пользоваться дебаггером:
1) создайте папку lib (или как хотите назовите) в проекте
2) загрузите туда все файлы дебаггера
3) вставте этот скрипт в проект (или прочитайте статью про внешние гемы и напишите свой, только учтите что этот скрипт загрузит консоль и в проекте, в пути к которому есть не ASCII символы) желательно до всех ваших скриптов.
Я часто модифицирую код загрузчика, так что актуальную версию можно взять
по этой длинной ссылке
Добавте код загрузчика в скрипты, а затем этот код
SideScriptsLoader.add_to_path 'lib' #добовляем lib папку в $LOAD_PATh
SideScriptsLoader.load 'lib' #загружаем все rb файлы из lib папки
4) В игре
(в битве пока что не работает) уже работает, с запущенной консолью нажимаем F5 - в консоли появится приветствие. Вы можете исполнить любой руби код в контексте приложения.
debug console activated, version 0.0.1
> 1 + 1
=> 2
> RPG.constants
=> [:Map, :MapInfo, :Event ....
5) В своих скриптах в любом месте вставляем
Debugger.load_console(binding)
6) Когда скрипт будет исполняться в этом месте - в консоли опять появится приветствие и возможность выполнить любой руби код в
контексте именно этого местаdef say
a = 1
b = 2
c = 3
Debugger.load_console binding
end
#когда запустится этот метод
debug console activated, version 0.0.1
> a
=> 1
> b
=> 2
> c
=> 3
7) Хотим выйти - пишем exit (фокус переключится на игровое окошко)
8) Немножко кастылей. Консоль поддерижвает мультистрочность команд, т.е. это будет работать:
> arr = [1, 2,
* 3,
* 4]
=> [1, 2, 3, 4]
> arr.length
=> 4
Но если мы допустим ошибку в синтаксисе в середине, консоль не выкинет нам SyntaxError, а будет продолжать запрашивать команды, пытаясь достроить код до чего путного.
> arr = [1, 2,
* 3 #=> пропустили запятую
* 4,
* 5 #=> и так можно до бесконечности
чтобы выйти из этой ситуации наберите clear_eval
И напоследок - баги точно будут, ошибки - тоже будут, считайте что это альфа версия. Пишите сюда о ошибках, или что вам нравится \ не нравится, буду дописывать. Всем удачи!