Автор Тема: Пользовательские конфиги для CaD Editor  (Прочитано 20734 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Тема для обсуждения добавления новых игр в редактор и особенностей написания конфигов для них.


Начало составлено мной переносом сообщений из основной, если где-то случайно получились оборванные диалоги или вырванные из контекста фразы - извиняюсь.

=============================================
Вообще, чтобы упростить написание конфигов - есть несколько путей.
1. Самый простой - добавить возможность писать код на разных языках программирования - Python, Lua, Java Script. Достаточно будет знание автором конфига хотя бы одного из них. Можно свой максимально простой язык добавить, похожий на ini-файлы.

2. Написать обучающие материалы - статьи и видео. Местами полезно, но только для игр, которые похожи на уже добавленные (таких много очень на самом деле, всё же почти 100 примеров разных игр добавлено.

3. Сделать отдельную программу - генератор конфигов, в котором можно будет заранее выбрать комбинацию из предзаготовленных вариантов, и нажать кнопку "сгенерировать" - и получить на выходе готовый конфиг уровня. Это, наверное, оптимальный вариант, но его тяжелее всего реализовать. Ключевой вопрос - надо ли это кому-то? Фактически - это будет программа для авторов редакторов уровней, а тут таких немного, да и часть из них предпочитают редактор для конкретной игры с нуля лепить.
« Последнее редактирование: 12 Апрель 2018, 16:34:13 от spiiin »

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
А у тебя есть идеи, как сделать проще описание того, как именно загружать блоки и отрисовывать уровни для любой игры?

Если был бы удобный язык, на котором можно было бы легко описать "в этой игре уровне строятся из таких-то блоков, палитры для блоков берутся оттуда-то, видеопамять подгружаем так-то", тогда может и попроще было бы. Но язык этот всё равно надо будет выучить, чтобы на нём писать.
сделать скриптовой язык можно и научиться его использовать при нормальном его документировании можно. но врядли тут можно сделать что-то универсальное.

у каждой игры есть свои нюансы, каждый раз придется придумывать костыль. тебе в своей программе, в которой ты точно знаешь, что и как работает, всегда проще померять или добавить пару строк или функцию и все заработает и знание с# тут ни при чем...

т.е. я вот может и знаю, как на нем писать, но я не знаю, за что отвечают и как работают все твои собственные функции и переменные... разбираться с чужими программами ничуть не проще, чем дизасмить игры денди. если я с денди еще готов копаться в свое удовольствие, то с чужими программами - не очень лол ну тут т.е. надо иметь какую-то конкретную заинтересованность и стимул, чтобы зарываться в чужой код и разбирать, как что работает, чтобы что-то суметь поменять...

потому я говорю, что это сложно всем, кроме тебя самого лол
« Последнее редактирование: 23 Декабрь 2017, 18:34:01 от CaH4e3 »

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
разбираться с чужими программами ничуть не проще, чем дизасмить игры денди
Вообще обычному программисту читать код, написанный человеком на высокоуровневом языке намного проще, чем машинный код. Это у тебя профдеформация на почве длительного дизассемблирования игр на денди.

Цитата
у каждой игры есть свои нюансы, каждый раз придется придумывать костыль
Так вот прикол в том, что на самом деле не так, есть очень много общих черт. Я для того столько игр и подключил, чтобы это проверить. Иногда в конфиге надо именно уникальный код дописать - но всё-таки написать 10-20 строк кода намного проще, чем целый отдельный редактор делать. А если надо уникальный подредактор добавить специфичный для конкретной игры - для этого плагины есть, по сути отдельные программы (редактор трасс для battletoads например).

Для меня эти конфиги собирать, так чтобы уровни можно было посмотреть (даже без редактирования какого-либо вообще), как для тебя unpublished cheats собирать, наверное :)

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вообще обычному программисту читать код, написанный человеком на высокоуровневом языке намного проще, чем машинный код. Это у тебя профдеформация на почве длительного дизассемблирования игр на денди.
программы на асме, в отличие от програм на высокоуровневых языках, сложно написать разнообразно или обфусцировать лол если переставить опкоды местами, смысл не поменяется, а вот на высокоуровневых можно писать так, что твой код будет читаться как книга на английском, а можно так, что не поймешь никогда, что там происходит вообще без бутылки. тем более на сях для этого есть широкие возможности в плане макросов. а там пойди разберись, где библиотечные функции, где твои, где у тебя что переназначено на что, где вин апи, а где нет... это тоже требует усилий при прочтении, не меньше, чем при асме.

Для меня эти конфиги собирать, так чтобы уровни можно было посмотреть (даже без редактирования какого-либо вообще), как для тебя unpublished cheats собирать, наверное :)
так я и говорю, что тебе это без проблем. ты же все это сам и писал лол

Оффлайн Roket

  • Пользователь
  • Сообщений: 3324
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Цитата
Roket
А что сложного-то? (я не издеваюсь, просто мне со стороны знающего C# программиста не видно) Основная работа - картинки подготовить и нарезать, а не конфиг написать. Если бы для этого были бы удобные инструменты - было бы проще.

Смысла ещё раз обсуждать это не вижу, Спин.  Я просто не хочу к этой теме приходить вновь, потому что не хочу быть опять виноватым, что картинки у меня не те и прочее.  <_<

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Roket
Окей, проехали. Метаинформацию из картинок я за тебя подчистил же.

Там ситуация была такая - какая-то программа, в которой делались картинки, писала в png метаинформацию неверную - типа "в этом файле плотность пикселей столько-то на метр", цифра абсолютно левая. Так что картинки были неправильные действительно. Я ещё одну такую картинку от Nemesis_C встречал в конфиге zamn - у Ti_ обнаружился этот баг.
 
Если делать генератор конфига - картинку с блоками тоже он будет генерировать (по скриншотам или картинкам отдельных блоков), так же такая ситуация будет исключена.


Добавлено позже:
Я донейты на редактор собираю не от жадности, а потому что работы много действительно по нему :)

Сейчас готов собранное (около 20$), отдать за составление конфигов для Shatterhand для всех уровней если кто возьмётся. Ну или сам их допилю, если желающих не будет.

Оффлайн Roket

  • Пользователь
  • Сообщений: 3324
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
spiiin, Для шаттерхенда уже все уровни есть. Тай пилил ещё. Я хотел запилить хак на него но понятное дело что это будет за хак если найдены в игре только уровни. Врагов я вроде тоже всех нашёл.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Не видел. У меня в данный момент есть конфиг 1 уровня полный, и конфиг экранов/блоков/макроблоков для уровня 2-1 для английской версии, а также текстовик от тебя с описанием врагов для японской версии.
https://github.com/spiiin/CadEditor/tree/master/CadEditor/settings_shatterhand

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
я до сих пор, кстати, не понимаю.. если программа умеет читать графику в роме, конвертить ее в макроблоки, зачем до сих пор вообще нужно конвертирование руками в пнг для вешнего использования? это попахивает наклеиванием обоев через замочную скважину лол

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Редактор умеет и так и так читать графику. Если опишешь в конфиге, как строить блоки из графики в роме, то картинки делать и не надо, конечно.

Сейчас конфиги для 62 nes игр строят блоки из видеопамяти (из рома прямо её берут или из дампов, когда мне лень в роме искать, как она хранится) и всего 11 берут блоки из заготовленных картинок (в основном, это конфиги, которые делал Roket, я их просто не переписал ещё на построение блоков из ROM, это что-то вроде промежуточной стадии). На сегу тоже в основном блоки строятся из видеопамяти.

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
spiiin, один вопрос. А если блоки нестандартные? Как быть? Вот в Challenger, например, блоки 8х8. Как их добавить в конфиг?

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Я бы сказал, что это не блоки, а просто тайлы. Для описания экранов тайлами есть плагин map editor, там как раз 8x8 тайлы. Кидай адреса, составлю конфиг.

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
Я бы сказал, что это не блоки, а просто тайлы. Для описания экранов тайлами есть плагин map editor, там как раз 8x8 тайлы. Кидай адреса, составлю конфиг.
"Внутренности" блоков с 6691 по 7230.
Начало карты - 5bfc, конец - 62ba, наверное. Там если изменить карту в самом низу, то можно проскроллить до других данных, или по кругу по карте пройтись. Как-то так.
« Последнее редактирование: 28 Декабрь 2017, 01:18:55 от lancuster »

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
чего-то я не вижу изменений никаких при изменении данных по этим адресам

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
чего-то я не вижу изменений никаких при изменении данных по этим адресам
Да блин! Блок 00 - первый! Его внутренности находятся по этому адресу: 6691. Чтобы увидеть изменения, меняй блоки на стартовом экране (сцена 2) с 61bb по 61bf. Всё будет видно.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Я эту игру в первый раз вижу, до сцены 2 доходить не хочу абсолютно :)
Сейв кидай или мувик прохождения

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
Я эту игру в первый раз вижу, до сцены 2 доходить не хочу абсолютно :)
Сейв кидай или мувик прохождения
Вот, пожалуйста. Ром тоже в архиве, похаченный лежит.
Я просто не понимаю, что можно поменять в сцене с поездом. Длину вагонов/всего поезда? Не особо там и разгуляешься.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
А, ну теперь понятно, о чём ты. Да, действительно, внешне похоже на блоки 8x8 тайлов, но на самом деле там структура из блоков 4x4 тайла, и затем из них составлены макроблоки 2x2 блока. т.е. для составления конфига тебе ещё надо найти адрес массива или массивов описания макроблоков.

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
spiiin, ну я находил что-то похожее, когда опускался ниже карты блоков. Изменил один байт - на карте появились какие-то блоки размером 4х4. Наверное, это то, о чём ты говоришь.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Да, это оно. Тебе нужно найти адрес начала этого массива (найти поинтер на него или логически подсчитать - поставить на карту макроблок 0 и найти, какие байты влияют на изменение блоков 4x4 в нем)

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
lancuster
Вообщем, вот тебе конфиг.
Адрес описаний макроблоков сразу за описанием карты - 0x6213.
Ещё нужен адрес описаний бит палитры блоков - 0x65B3. В стандартной форме - для каждого блока 4x4 1 дополнительный байт, в котором по 2 бита описывают индекс палитры каждого из подблоков 2x2 тайлов.

Если откроешь конфиг, то увидишь, что нестандартного в этих блоках ничего нет, блоки и макроблоки загружаются стандартными подготовленными функциями:
 
//сохранение и загрузка блоков, стандартная функция, которая читает 16 байт блока и дополнительно 1 байт индексов палитры к нему
  public GetBlocksFunc        getBlocksFunc() { return Utils.getBlocksFromTiles16Pal1;}
  public SetBlocksFunc        setBlocksFunc() { return Utils.setBlocksFromTiles16Pal1;}
//стандартная функция чтения макроблоков из 4 байт подряд последовательно 
  public GetBigBlocksFunc     getBigBlocksFunc()     { return Utils.getBigBlocksCapcomDefault;}
  public SetBigBlocksFunc     setBigBlocksFunc()     { return Utils.setBigBlocksCapcomDefault;}




Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
spiiin, может, тогда уже и первый уровень добавишь? :cool: Данные я так напишу.
Палитра блоков (весь уровень): 511F-519E.
Сам уровень (в виде спрайтов): 519F-56BE (перед поездом нарисована пустота), низушка - 56E5-5764.
Враги на уровне (тип, расположение): 5767-57E6. Насчёт точности (адреса) последнего не уверен, но это точно враги и их координаты.

Добавлено позже:
Остаётся ещё пещера злодея, но её я чуть позже запощу. :)

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
lancuster
Мне эта игра не интересна, как и хаки на неё. Хочешь делать - делай сам, я показал как.

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
spiiin, a BigBlocks на одноэкранных уровнях не используются? Эту часть можно будет удалить, для составления нового конфига?

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Откуда я знаю? Ты же игру взламываешь, а не я за тебя  :) Если там другой формат, конфиг тоже будет чуть другой. Разберись сам с форматом, а я тебе найду игру, в которой будет такой же из уже подключенных

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
Я так понял, что первый уровень оформлен спрайтами, второй - блоками 8х8, а сцена с магическими предметами и сцена с врагом вообще в rle пожаты. Потому что единственные большие куски, которые я нашёл в роме, не получается отредактировать, как остальные уровни, изображение съезжает.

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
А, да, ты прав, действительно там макроблоки, 1x2 блока размером только, а не 2x2.

Описал тут все форматы уровней в подключенных NES-играх:
https://spiiin.github.io/CadEditor/cadeditor-supported-games.html

Детально расписывать обозначения не буду, но можно посмотреть, что 1) существует не так много вариантов хранения (некоторые, вроде рисования уровня на пустом "холсте", как в марио, пока не добавлены, конечно) и 2) в каких играх форматы одинаковые.

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
А в какой игре уровни построены из обычных блоков 2х2 (не макро), без отдельной карты палитры? Я попробую добавить вторых Читаменов, там строение такое.
И ещё. Где изменить блок (подписать его), чтобы легче было ориентироваться, где какой враг? В Читаменах (да и в других играх Экшн 52) враги задаются на карте блоков, отдельно координатами не задаются.
« Последнее редактирование: 31 Декабрь 2017, 20:44:06 от lancuster »

Оффлайн spiiin

  • Модератор
  • Сообщений: 760
    • Просмотр профиля
Takeshi no Chousenjou - интересный формат уровней. Есть транспонированные блоки 2x2 без палитры. Первый экран описывается в виде 32 блока (2 столбца по 16 блоков сверху вниз), следом за которыми идут 8 байт с описаниями палитры (32 раза по 2 бита - для каждого блока, причём слева направо уже). Больше всего похоже на Moon Crystal из уже добавленных.
Такое описание в редактор добавить не проблема (на скрине 1 полоска с картиной), но редактировать такие полоски (да ещё и слой палитры в отдельном подредакторе), конечно, сильно не удобно - стоило бы сделать отдельный плагин для таких "полосочных" описаний, или же опцию "отображать X экранов друг за другом - вертикально, горизонтально, или заданно по специальной функции" (в Zen intergalactic ninja пригодилось бы для отображения изометрических уровней, там экраны отображаются друг относительно друга со сдвигом в одну строку). Подумаю, как удобнее, опция была бы и для других подредакторов полезна, может через пару версий добавлю такую фичу.

Captain Planet - всё-таки нет там макроблоков, есть блоки 4x8 тайлов, редактировать можно замечательно карту.

Добавлено позже:
Цитата
А в какой игре уровни построены из обычных блоков 2х2 (не макро), без отдельной карты палитры?
В любой игре, в которой AoS(2x2) в графе "блоки", и прочерк в графе "макроблоки".

Отдельные блоки отображать по особому нельзя, если они строятся из графики рома. Можно включить режим отображения номеров блоков (View type -> Block numbers), так будут различаться одинаковые на вид блоки.
« Последнее редактирование: 03 Январь 2018, 14:13:30 от spiiin »

Оффлайн lancuster

  • Пользователь
  • Сообщений: 4256
  • Пол: Мужской
  • A nullo diligitur, qui neminem diligit...
    • Просмотр профиля
spiiin, я взял за основу настройки к уровню для Mickey Mania (благо, там размеры экранов даже совпадают). Но вторых Читов добавить не удалось. Уровень либо грузится туда, где блоки должны находиться, либо не грузится вообще.
Может, я что-то намудрил тут, или есть что-то лишнее. Поправишь? Я потом остальные уровни сам попробую добавить.
P. S.: по поводу надписей. В настройках Super Robin Hood были блоки с надписью object. Можно ли сделать такое и для этой игры как-нибудь, чтоб врагов на уровнях подписать?