Программы
Предназначение:
Прочее

Good Jassspy

Автор статьи: host_pi
Автор программы: goodlyhero
Реализация: *.mix файл
Good Jassspy - это логер всех действий во время игры. Что позволит картоделам отследить причину десинхрона или иные проблемы. Также можно отследить действия во время игры на каждой карте. Достаточно запустить её у двух разных игроков (либо во время просмотра демки от двух разных игроков), а потом сравнить оба лога в любой сравнивалке текстов
Установка:
Good Jassspy.mix - кладём в корневую папку варкрафта
goodjasspy.ini - кладём в корневую папку Warcraft
agent_presence_log - создаётся в корневой папке Warcraft после начала первой карты
Настройка:
в goodjasspy.ini есть 4 строки:
console = false
hookjvm = false
hookorder = false
hookpresence = true
Файл agent_presence_log один общий на все игры.
Если было сыграно несколько игр, то можно ориентироваться между играми на строки "time: 0(0(ms))" - это означает, прошло 0мс после начала карты, т.е. самое начало
Пример работы программы - текст лога:
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x38FA,0x3A74)
time: 12(1105(ms)); VF: 0x6F93075C(CTaskTarget); tags: (0x38B0,0x3A75)
time: 12(1105(ms)); VF: 0x6F93075C(CTaskTarget); tags: (0x38B1,0x3A76)
time: 12(1105(ms)); VF: 0x6F93075C(CTaskTarget); tags: (0x38F6,0x3A77)
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x38F7,0x3A78)
time: 12(1105(ms)); VF: 0x6F93075C(CTaskTarget); tags: (0x393C,0x3A79)
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x393D,0x3A7A)
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x3679,0x3A7B)
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x3678,0x3A7C)
time: 12(1105(ms)); VF: 0x6F930304(CTask); tags: (0x368B,0x3A7D)
time: 12(1105(ms)); VF: 0x6F93049C(CTaskAction); tags: (0x368C,0x3A7E)
time: 16(1535(ms)); VF: 0x6F87798C(CUnitRefList); tags: (0x37E0,0x3A82)
time: 16(1565(ms)); VF: 0x6F931934(CUnit); tags: (0x3564,0x3A83)
time: 16(1565(ms)); VF: 0x6F87C384(CAbilityQueue); tags: (0x3679,0x3A91)
time: 16(1565(ms)); VF: 0x6F879B94(CAbilityBlightGrowth); tags: (0x368B,0x3A93)
time: 16(1565(ms)); VF: 0x6F8F9EBC(CEffectBlight); tags: (0x368C,0x3A94)
time: 16(1565(ms)); VF: 0x6F925A6C(CAbilitySpiked); tags: (0x3944,0x3A98)
time: 16(1565(ms)); VF: 0x6F87C6F4(CAbilityRally); tags: (0x3945,0x3A99)
time: 16(1565(ms)); VF: 0x6F87BA54(CAbilityOnFireOrc); tags: (0x393B,0x3A9A)
time: 16(1565(ms)); VF: 0x6F8795A4(CAbilityAlarm); tags: (0x393F,0x3A9B)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x3940,0x3A9C)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x3941,0x3A9D)
time: 16(1565(ms)); VF: 0x6F87798C(CUnitRefList); tags: (0x3942,0x3A9E)
time: 16(1565(ms)); VF: 0x6F933B94(CUnitAI); tags: (0x3943,0x3A9F)
time: 16(1565(ms)); VF: 0x6F92FF24(COrder); tags: (0x359F,0x3AA0)
time: 16(1565(ms)); VF: 0x6F93049C(CTaskAction); tags: (0x3689,0x3AA1)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x393A,0x3AA2)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x3936,0x3AA3)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x393E,0x3AA4)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x392C,0x3AA5)
time: 16(1565(ms)); VF: 0x6F93049C(CTaskAction); tags: (0x392D,0x3AA6)
time: 16(1565(ms)); VF: 0x6F92FF24(COrder); tags: (0x392E,0x3AA7)
time: 16(1565(ms)); VF: 0x6F930304(CTask); tags: (0x392F,0x3AA8)
time: 16(1565(ms)); VF: 0x6F94DF34(CPlayerUnitConstructStartEventData); tags: (0x3930,0x3AA9)
time: 16(1565(ms)); VF: 0x6F950C14(CTriggerExecution); tags: (0x371D,0x3AAA)
time: 16(1565(ms)); VF: 0x6F87A4DC(CAbilityBuildInProgress); tags: (0x3953,0x3AAB)
time: 19(1845(ms)); VF: 0x6F9300F4(COrderTarget); tags: (0x38FD,0x3AB2)
time: 19(1845(ms)); VF: 0x6F93049C(CTaskAction); tags: (0x371D,0x3AB3)
time: 19(1845(ms)); VF: 0x6F930304(CTask); tags: (0x392E,0x3AB4)
Вот цитата от создателя программы, раскрывающая подробности и пример работы:
goodlyhero:
Некоторое количество времени назад я проводил исследование десинков в моей карте.
Они случались после 20 минуты в игре, но были раздражающе часты. Отваливалась часто половина игроков, что было крайне раздражающе.
Вершиной моего расследования стал небольшой микс для логгирования всякого, позволяющий потом сравнить это всякое у разных игроков.
Я выяснил, что в моем случае причиной проблем были 2 вещи - пламя феникса, и что-то в поведении нейтралов на 12+ слотах. (защита союзников или типо того, я не разобрался до конца.)
Сам микс я не довел до окончательной красоты, но на текущий момент он вполне может быть использован для записи JASS и тэгов в игре.
В общем виде, идея довольно проста - сделать запись у двух игроков до десинхрона и сравнить что получилось. Соответственно, если один игрок отвалился а другой остался - один десинкнул и можно сравнивать.
Если воспроизводится в реплеях - совсем хорошо. В моем конретном случае при просмотре одного и того же реплея несколько раз вылезала разница, например, и это было заметно. Если не воспроизводится - остается только отыскать тестеров, которые согласятся посмотреть.
Микс приложил, соответственно.
и дополнение
goodlyhero:
Когда-то давно я предлагал инструмент для продвинутого поиска причин десинхронов, работающий не всегда, но все равно полезный.
А еще там есть настройка на запись того, как исполнялся jass код, как в известной программе для этого дела, так что при желании вы можете в точности просмотреть еще и порядок выполнения кода и где же возникло расхождение в жасе, если оно возникло там.
Настройка hookjvm = true отвечает за это.
Ну а если вы думаете, что проблема точно в той самой строчке, то попробуйте запихать инициализацию ХТ в отдельный триггер на событие прошло времени(0) или в функцию, вызываемую из мейна любым другим образом.
и дополнение2
goodlyhero:
Строго говоря это не только жасс логгер. Например в комментарии показана на самом вторая часть полезного функционала - логгирование выдачи тегов агентам.
Но есть и собственно жасс логер. Он быстрый и пишит как вызовы нативок, так и жасс функций. Для нативок предоставляет информацию о том, с какими аргументами они вызваны.
Были мысли о том, чтобы научиться разбирать, в каком потоке был вызван код, но мне не особо это интересно.
По идеям: soon™️
добавить системное время в каждой строке
Вот конкретно это - если добалять системное время, то логи записанные в разные моменты времени станут несравнимы тривиальным сравнением текстовиков, чего бы хотелось избежать.
Но я некоторое время назад делал некоторые вещи по просьбе одного товарища. Так что некоторый бонусный функционал имеется, если кому-то нужно:
  • Экспортируемая из библиотеки функция AgentPresence_BreakThisPlease будет вызываться каждый раз когда будет достигнута одна из заданных комбинаций тегов. (способ задания см. в обновленном файле)
  • Добавлена настройка для мгновенного вывода в файл, при выдаче новых тэгов.
  • Добавлена настройка не выводить выдаваемые тэги и связанную информацию до того момента, пока не не начнется выполнение основного жасс кода.
Если кто-то хочет добавить какой-нибудь функционал или еще что-нидь сделать - вот сурцы
В будущем было бы неплохо добавить:
  • опциональное разделение по картам, т.е. новая карта - новый лог
  • опциональное автоудаление логов
  • опциональное хранение логов в отдельной папке
Версии программы:
1 27.01.23 15-51 --- отсюда
2 27.01.23 20-38 v0.01 + source --- отсюда
3 03.05.23 + source --- отсюда + отсюда
Все три версии прикреплены к статье
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
22
1 год назад
0
Записывает только вызов Jass функций или вообще всё?
0
14
1 год назад
Отредактирован host_pi
0
Записывает только вызов Jass функций или вообще всё?
вот первая минута стандартной близовской Melee карты на развитие
pastebin.com/8bQJd1Dp 6200 строк
0
20
1 год назад
0
Ещё бы был снапшот глобалок на нажатие клавиши и вообще цены бы не было
1
8
1 год назад
Отредактирован goodlyhero
1
Ладно. Я сюда пришел.
Строго говоря это не только жасс логгер. Например в комментарии показана на самом вторая часть полезного функционала - логгирование выдачи тегов агентам.
Но есть и собственно жасс логер. Он быстрый и пишит как вызовы нативок, так и жасс функций. Для нативок предоставляет информацию о том, с какими аргументами они вызваны.
Были мысли о том, чтобы научиться разбирать, в каком потоке был вызван код, но мне не особо это интересно.
По идеям: soon™️
добавить системное время в каждой строке
Вот конкретно это - если добалять системное время, то логи записанные в разные моменты времени станут несравнимы тривиальным сравнением текстовиков, чего бы хотелось избежать.
Но я некоторое время назад делал некоторые вещи по просьбе одного товарища. Так что некоторый бонусный функционал имеется, если кому-то нужно:
  • Экспортируемая из библиотеки функция AgentPresence_BreakThisPlease будет вызываться каждый раз когда будет достигнута одна из заданных комбинаций тегов. (способ задания см. в обновленном файле)
  • Добавлена настройка для мгновенного вывода в файл, при выдаче новых тэгов.
  • Добавлена настройка не выводить выдаваемые тэги и связанную информацию до того момента, пока не не начнется выполнение основного жасс кода.
Если кто-то хочет добавить какой-нибудь функционал или еще что-нидь сделать - вот сурцы
Загруженные файлы
0
14
1 год назад
0
если добалять системное время, то логи записанные в разные моменты времени станут несравнимы
да, я уже тоже к этому пришёл через 5 минут после публикации, так что системное время если и нужно, то только между картами а не в строках
некоторый бонусный функционал имеется, если кому-то нужно:
добавлено в шапку, теперь там 3 версии
0
14
1 год назад
Отредактирован host_pi
0
del
0
14
1 год назад
0
0
14
1 год назад
0
0
15
2 месяца назад
0
Подробный вывод вызова функций Jass очень хорошо сделан, но жизненно необходима возможность отключения вывода вызванных нативок. Слишком нагружает систему на тяжёлых картах.
Ответы (1)
0
14
2 месяца назад
Отредактирован IceFog
0
JackFastGame, я недавно выкладывал исходники интерпретатора JASS-байткода, ты можешь скачать Lazarus IDE и скомпилировать их. Тебе нужно добавить логирование инструкций вызова функций.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.