Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Advanced Pointer Recalculator
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Ср Июл 26, 2006 11:22 am    Заголовок сообщения: Advanced Pointer Recalculator Ответить с цитатой

Представляю на суд общественности (...барабанная дробь...Smile) мою первую публичную утилиту-рекалькулятор с возможностью дампа/вставки скрипта. Прога предназначена для пересчёта практически всех типов указателей, в т. ч. неупорядоченных и со сложной структурой. Подробный readme прилагается.

После трёх месяцев работы над программой (правда, с большими перерывамиSmile) вроде бы реализовал в ней практически всё, что хотел. Единственное, не смог проверить все комбинации (а их очень много), которые могут встретиться в играх для различных платформ. По этой причине (плюс не очень удобная работа с программой и медленная скорость дампа текста) текущая версия - 0.8beta, а не 1.0.
Теоретически поддерживается как минимум 95% игр (с несжатым текстом/поинтерами, разумеется). Фактически в программе реализован один большой универсальный алгоритм (точнее, два - для дампа и для вставки), благодаря которому и появилась возможность осуществить поддержку такого количества ситуаций.

Текущая версия (0.8beta) позволяет:
- пересчитывать указатели прямого и обратного порядка (Motorola и Intel) длиной от 2-х до 4-х байтов
- пересчитывать указатели как с прибавляемой, так и с вычитаемой базой
- пересчитывать несортированные (неупорядоченные) указатели
- пересчитывать указатели, идущие в обратном порядке
- пересчитывать параметрические и составные сложные указатели
- дампить и вставлять скрипт по указателям (с их пересчётом)
- дампить скрипт с DTE/MTE

В архиве с программой есть парочка примеров с необходимыми файлами.

http://shedevr.org.ru/temp/arp08beta.rar

Readme в CHM, с добавленным примером по работе с утилитой:
http://shedevr.org.ru/temp/arp_help.chm


Последний раз редактировалось: gottax (Вс Авг 06, 2006 6:31 am), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Ср Июл 26, 2006 2:29 pm    Заголовок сообщения: Ответить с цитатой

Уф. Сам чёрт ногу сломит, у меня понятнее было. Razz
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Ср Июл 26, 2006 3:07 pm    Заголовок сообщения: Ответить с цитатой

АнС писал(а):
Уф. Сам чёрт ногу сломит, у меня понятнее было. Razz


Естественно, понятнее, у тебя же только 1 вид поинтеров считает Wink
Похоже, придётся сделать описание в формате CHM с подробным пошаговым примером.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Ср Июл 26, 2006 3:18 pm    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
АнС писал(а):
Уф. Сам чёрт ногу сломит, у меня понятнее было. Razz


Естественно, понятнее, у тебя же только 1 вид поинтеров считает Wink


Да, куча однотипных программок - для каждого типа своя. ИМХО, веник прочнее швабры. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Ср Июл 26, 2006 3:45 pm    Заголовок сообщения: Re: Advanced Pointer Recalculator Ответить с цитатой

gottax писал(а):
- указатели прямого и обратного порядка (Motorola и Intel) длиной от 2-х до 4-х байтов

может назовёшь по нормальному
Big endian(Motorola),Little endian(Intel)

поскольку у GBA/NDS не моторольный(е) и не интеловский(е)
процессор(ы) (ARM), а всё же твоя прога должна для него подходить (он little endian)
_________________
Всех их вместе переведём!


Последний раз редактировалось: Axel (Ср Июл 26, 2006 5:06 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
PicaSSO



Зарегистрирован: 04.04.2004
Сообщения: 711
Откуда: Украина. Краматорск

СообщениеДобавлено: Ср Июл 26, 2006 4:45 pm    Заголовок сообщения: Ответить с цитатой

Зато швабра зачастую эффективней Smile
Молодец, Готакс!
_________________
まだ若い夜...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Ср Июл 26, 2006 5:45 pm    Заголовок сообщения: Ответить с цитатой

АнС писал(а):

Да, куча однотипных программок - для каждого типа своя. ИМХО, веник прочнее швабры. Wink


Согласен. Но вот что делать тем, кто веники вязать не умеет? Wink Я сам недавно был в таком же положении, и поэтому прекрасно понимаю, что универсал - лучший выход в этой ситуации.


Axel писал(а):

может назовёшь по нормальному
Big endian(Motorola),Little endian(Intel)

поскольку у GBA/NDS не моторольный(е) и не интеловский(е)
процессор(ы) (ARM), а всё же твоя прога должна для него подходить (он little endian)


Дело не в процессоре, используемом в консоли. Называть можно по-разному, кому как удобнее/понятнее. Просто такие виды считывания адресов, насколько я знаю, придумали Motorola и Intel соответственно, поэтому и назвал так. Хотя, наверное, Big endian и Little endian приписать стоит.


PicaSSO писал(а):

Зато швабра зачастую эффективней


Швабра просто универсальнееWink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Ср Июл 26, 2006 7:49 pm    Заголовок сообщения: Ответить с цитатой

хехе Smile
благодаря твоей проге+readme, я похоже, понял, что делает круптар Very Happy
(в том смысле, что такое у него "группы" и "элементы")


...кстати, посмотри, как у крупрара устроен .kpj файл
(по мне, так это наглядней, чем текущий .apr ) Wink
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Чт Июл 27, 2006 8:25 am    Заголовок сообщения: Ответить с цитатой

Axel писал(а):
хехе Smile
благодаря твоей проге+readme, я похоже, понял, что делает круптар Very Happy
(в том смысле, что такое у него "группы" и "элементы")


Да, я тоже хотел сделать нечто подобное и в своей проге, но это бы слишком усложнило её. И вообще, у меня просто рекалькулятор, а не редактор проектов Wink А самое главное, прога не работает со скриптом, его можно редактировать где угодно, даже в Блокноте. В принципе, реализовать поддержку импорта/экспорта скрипта формата ПП2 вполне реально (надо только "отучить" ПП2 удалять "ненужные" байты при разметке диалогов Wink )


Axel писал(а):
...кстати, посмотри, как у крупрара устроен .kpj файл
(по мне, так это наглядней, чем текущий .apr ) Wink


Хех, я вообще сначала хотел файл настроек сделать бинарным, шоб никто туда не лазилSmile Просто не имеет смысла редактировать его вручную, так как параметров там немного, легче их проставить в самой проге и пересохранить файл с параметрами.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Пт Июл 28, 2006 3:30 pm    Заголовок сообщения: Ответить с цитатой

Переписал readme в CHM, ссылка в первом посте.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Пт Июл 28, 2006 5:53 pm    Заголовок сообщения: Ответить с цитатой

а я вот, так и не понял, что такое "пересчитывать параметрические и составные сложные указатели", т.е. я понял(догадываюсь) что это такое, но не понял как это объяснить проге :roll:

[edit]
да, и укажи где нибудь, что "Код для переноса строки" должен ОТСУТСТВОВАТЬ в таблице перекодировки, и должен быть указан
в программе (в меню).

кроме того, не забудь упомянуть, что НЕ рекомендуется
задействовать символ "\" в таблице перекодировки...
поскольку он зарезервирован как символ "переноса строки"
(для текущей версии проги, его нельзя использовать в правой части таблицы перекодировки, иначе вставка текста, вероятно, будет работать криво)
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Пт Июл 28, 2006 7:54 pm    Заголовок сообщения: Ответить с цитатой

Axel писал(а):
а я вот, так и не понял, что такое "пересчитывать параметрические и составные сложные указатели", т.е. я понял(догадываюсь) что это такое, но не понял как это объяснить проге Rolling Eyes


Просто такие указатели тоже объединяются в таблицу, и в них достаточно считывать только те байты, которые являются адресами, пропуская другие байты в поинтере с помощью холостого цикла.
Взгляни на скрин, и всё станет понятно:


Но мне недавно встретился ещё более сложный тип поинтера, в котором хранится уже 2 адреса. Такие указатели проге не позубам. Думаю, в следующей версии стоит ввести возможность загрузки поинтеров из файла, в котором адрес каждого поинтера забит вручную. По-другому пересчёт таких указателей вряд ли возможен...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Пт Июл 28, 2006 7:54 pm    Заголовок сообщения: Ответить с цитатой

Axel писал(а):

кроме того, не забудь упомянуть, что НЕ рекомендуется
задействовать символ "\" в таблице перекодировки...
поскольку он зарезервирован как символ "переноса строки"
(для текущей версии проги, его нельзя использовать в правой части таблицы перекодировки, иначе вставка текста, вероятно, будет работать криво)


Ну да, верно, символы "\", "{", "}" и "§" являются зарезервированными и не должны прописываться в таблице.

Так-с, уже довольно много недочётов накопилось, пора обновление релизитьSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Пт Июл 28, 2006 9:56 pm    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
Ну да, верно, символы "\", "{", "}" и "§" являются зарезервированными и не должны прописываться в таблице.

Так-с, уже довольно много недочётов накопилось, пора обновление релизитьSmile

это НЕ недочёты, это features Smile
фичи нужно просто не забыть описать, чтобы не возникало прострации, когда прога работает не так как расчитывает её пользователь...

(не думаю, что можно придумать что-то относительно простое и одновременно гибкое (если только не заморачиваться, как я в ПП2 с "укодированием") )

единственный недочёт - нельзя чтобы в таблице были "пустые строки"
и (вообще что либо отличное от описания кодов)...
но это, надеюсь, будет исправлено в следующей версии :)

про составные указатели, я понял...
gottax писал(а):
пропуская другие байты

т.е. это НЕ пересчет указателей на указатели (как в минише Wink )...
а то я уж читал...читал... и там... и сям Wink и всё не мог понять...
непоняток больше нет.(кажется)
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Сб Июл 29, 2006 7:34 am    Заголовок сообщения: Ответить с цитатой

Axel писал(а):
т.е. это НЕ пересчет указателей на указатели (как в минише Wink )...
а то я уж читал...читал... и там... и сям Wink и всё не мог понять...
непоняток больше нет.(кажется)


Хех, а зачем так заморачиваться? Вряд ли кто-то будет переносить сами указатели в другое место, а тогда зачем это нужно?
Конечно же, можно сделать гораздо проще и удобнее, заточив прогу под какую-то конкретную игру, где она будет пересчитывать автоматом всё что угодно, но ведь на то и универсал, чтобы работать с любой игрой....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Alex_231



Зарегистрирован: 13.01.2005
Сообщения: 144
Откуда: Арсеньев

СообщениеДобавлено: Сб Июл 29, 2006 9:40 am    Заголовок сообщения: Ответить с цитатой

Универсал должен быть не только универсальным, но и удобным в обращении.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Сб Июл 29, 2006 2:12 pm    Заголовок сообщения: Ответить с цитатой

Обновление утилиты (версия 0.85):



Изменения:
- тип поинтеров изменён с Intel на Intel(LittleEndian) и с Motorola на Motorola(BigEndian)
- добавлена автоматическая проверка таблиц на недопустимые строки и зарезервированные символы
- увеличена скорость дампа текста на 75%* (спасибо Акселю Wink )


*Добавлено* Версия оказалась чересчур глючной и бажной, поэтому удаляю ссылку. Юзайте предыдущую версию 0.8.


Последний раз редактировалось: gottax (Вс Июл 30, 2006 4:29 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Сб Июл 29, 2006 5:42 pm    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
увеличена скорость дампа текста на 75%

в принципе, можно было еще раза в 1.5-2 ускорить Wink ,
но не думаю, что так уж нужно настолько сильно зарываться
в оптимизацию, да и к тому же, тебе пришлось бы сильно
покорёжить текущий код программы...
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Пн Июл 31, 2006 2:35 pm    Заголовок сообщения: Ответить с цитатой

Новая версия программы - 0.9:

http://shedevr.org.ru/temp/apr090.rar

Изменения:
- переписан код с проверенной версии 0.8
- добавлен удобный пользовательский интерфейс (теперь не надо мучаться с переименованием, все необходимые файлы можно загрузить из меню)
- введена блокировка на дамп/вставку текста при отсутствии соответствующих таблиц
- добавлена автоматическая проверка таблиц на недопустимые строки и зарезервированные символы
- немного оптимизирован процесс дампа текста (ProgressBar'ы было решено оставить в виду их эстетической функции при небольшом увеличении времени дампа текста)
- введена возможность загрузки списка адресов указателей из текстового файла и дамп/вставка по нему (в текущей версии эта возможность заблокирована в виду не совсем корректной работы при вставке скрипта по такому списку)


Ну вот, теперь вроде глупых ошибок нет, всё работает чётко и точно, как швейцарские часы Very Happy
Ещё немного подрихтовать функциональность, допроверять различные варианты работы и можно релизить версию 1.0 (даже можно будет новость по такому случаю написатьSmile)

Но это позже, сейчас мне важно знать, что утилита без проблем работает на любых комбинациях. Кто-нибудь помимо меня уже пробовал дампить/вставлять скрипт с её помощью? Question
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Пн Июл 31, 2006 4:58 pm    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
Новая версия программы - 0.9:

http://shedevr.org.ru/temp/apr090.rar

Кто-нибудь помимо меня уже пробовал дампить/вставлять скрипт с её помощью? Question

дык, ты же её только что выложил... когда же мы успели ? :)

[edit]
пара мааааленьких замечаниц: Smile
когда ты загрузил адреса, не разрешай указывать "количество блоков для вставки" больше чем у тебя есть адресов, иначе случится
Код:
" is not a valid integer value


и перед тем как enable'ить кнопку дампа проверь, что загружены адреса Wink, иначе
Код:
 I/O error 6...


ну и на последок, если указано "смещение при вставке текста=0", то стоит уточнить у юзверя он уверен, что этого хочет ?
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Пн Июл 31, 2006 7:36 pm    Заголовок сообщения: Ответить с цитатой

Axel писал(а):
дык, ты же её только что выложил... когда же мы успели ? Smile


Нет, я имел в виду, испытывал ли кто-нибудь первую версию, 0.8? Алгоритм-то не изменился. :)

Axel писал(а):
[edit]
пара мааааленьких замечаниц: Smile
когда ты загрузил адреса, не разрешай указывать "количество блоков для вставки" больше чем у тебя есть адресов, иначе случится
Код:
" is not a valid integer value


и перед тем как enable'ить кнопку дампа проверь, что загружены адреса Wink, иначе
Код:
 I/O error 6...
?


Ох, сколько же надо таких защит "от дурака" ставить Shocked Very Happy Вообще-то то, что нельзя указывать более число, чем имеется адресов в адресном файле, написано в readme. И убирать эти поля не хочется - а вдруг пользователю понадобится в целях проверки дампить или вставлять только часть скрипта?..
Rolling Eyes Это, конечно, надо учитывать, только вот как бы не порушить этими замазками всё строение, то бишь программу... Rolling Eyes


Axel писал(а):
[ну и на последок, если указано "смещение при вставке текста=0", то стоит уточнить у юзверя он уверен, что этого хочет ?



Эээ... Я так понимаю, Axel, ты просто не правильно понял смысл надписи "Смещение при вставке текста". Это не адрес, куда вставляется текст, а дополнительное смещение на определённое количество байт. То есть если пользователь имеет достаточно свободного места в конце рома, либо он расширил ром, то он может задать эту разницу между адресом положения оригинального скрипта и адресом начала пустого места в роме, и прога будет вставлять текст туда. Если стоит 0, то естественно, текст будет вставляться на то же самое место.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Пн Июл 31, 2006 8:01 pm    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
Вообще-то то, что нельзя указывать более число, чем имеется адресов в адресном файле, написано в readme. И убирать эти поля не хочется - а вдруг пользователю понадобится в целях проверки дампить или вставлять только часть скрипта?

меньше можно, больше низзя

в любом случае у тебя ЕСТЬ переменная с этим числом (загруженных адресов) например mC, просто если ввели число (скажем в переменную TBnum Smile), то если TBnum > mC -1 тогда TBnum = mC -1 Wink
и усё...

gottax писал(а):
Axel писал(а):
[ну и на последок, если указано "смещение при вставке текста=0", то стоит уточнить у юзверя он уверен, что этого хочет ?

это дополнительное смещение на определённое количество байт.

поэтому я написал - пара замечаний (а не три) Wink
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Virtual_Killer



Зарегистрирован: 25.03.2004
Сообщения: 610
Откуда: Чекагинск

СообщениеДобавлено: Вт Авг 01, 2006 5:50 am    Заголовок сообщения: Ответить с цитатой

gottax писал(а):
То есть если пользователь имеет достаточно свободного места в конце рома, либо он расширил ром, то он может задать эту разницу между адресом положения оригинального скрипта и адресом начала пустого места в роме, и прога будет вставлять текст туда. Если стоит 0, то естественно, текст будет вставляться на то же самое место.

1) А не лучше ли, как в Круптаре, указывать координаты для текста?
2) Что будет делать программа, ести переведённый скрипт занимает больше места, чем оригинальный? Не запоганит ли она чего? Wink
_________________
Не поймите меня правильно
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Вт Авг 01, 2006 9:25 am    Заголовок сообщения: Ответить с цитатой

Axel писал(а):
в любом случае у тебя ЕСТЬ переменная с этим числом (загруженных адресов) например mC, просто если ввели число (скажем в переменную TBnum Smile), то если TBnum > mC -1 тогда TBnum = mC -1 Wink
и усё...

да ясно, я так и хотел сделать:)


Virtual_Killer писал(а):
1) А не лучше ли, как в Круптаре, указывать координаты для текста?

Нет, не лучше. Для этого придётся лезть в алгоритм пересчёта. А посчитать разницу несложно и самостоятельно, в калькуляторе.


Virtual_Killer писал(а):
2) Что будет делать программа, ести переведённый скрипт занимает больше места, чем оригинальный? Не запоганит ли она чего?

Запоганит конечно же. Wink За этим должен следить пользователь. Сравнить размер переведённого и оригинального скрипта - задача очень простая. Всё-таки это рекалькулятор поинтеров, а не скриптер. Дамп/вставка скрипта здесь больше для наглядности. Я не собираюсь раздувать утилиту до PP2 или Kruptar.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
gottax



Зарегистрирован: 16.11.2003
Сообщения: 588
Откуда: Курск

СообщениеДобавлено: Вс Сен 17, 2006 3:26 pm    Заголовок сообщения: Ответить с цитатой

Новая версия моего рекалькулятора поинтеров:
http://shedevr.org.ru/temp/apr091.rar
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group