| Разработка и ромхакинг > Программирование |
| Пишем ромхакерский/хоумбрюерский софт |
| (1/1) |
| Томахомэ:
Собираюсь я тута написать небольшую совсем-совсем простенькую утилитку для конвертации BMPшек глубиной цвета в 4 бита в набор 4-битных linear тайлов размером 16 на 16 - формат, использовавшийся в некоторых игровых автоматах (например, Strikes of 1945 и парочке корейских железячек с сильными подозрениями на его клонизм). Однако почему-то даже проверка по сигнатуре не работает как надо - вместо стоящих первыми 2-мя байтами букв B и M утилитка в любой скормленной BMPшечке видит нули. Как так получается? --- Код: ---#include <stdio.h> #include <stdlib.h> #include <fcntl.h> FILE *fpin, *fpout; long len; long i,n; int main(int argc, char *argv[]) { if (argc != 2 ) { printf("Bitmap converter to 4bpp 16x16 tile data.\n"); fprintf(stdout,"Usage: %s [srcfile].bmp\n",argv[0]); exit(1); } if ( (fpin=fopen(argv[1],"rb") ) == NULL ) { printf("Can't open input file\n"); exit(1); } /* * Now we try to determine the size of the file * to be converted */ if (fseek(fpin,0,SEEK_END)) { printf("Couldn't determine size of file\n"); fclose(fpin); exit(1); } len=ftell(fpin); unsigned short bytStr[len]; fread(bytStr, 1, len, fpin); printf("The first byte is %x.\n",bytStr[0]); fclose(fpin); exit(1); } --- Конец кода --- |
| Segaman:
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет. Попроси ChatGPT помочь. Он быстрее вкурит, что у тебя тут не так. |
| Томахомэ:
--- Цитата: Segaman от 23 Февраль 2025, 11:56:41 ---Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет. --- Конец цитаты --- Спасибо! Именно так оно и оказалось. |
| Томахомэ:
Ну а вот и сам инструментик готов! У кого есть аккаунт на Romhacking.net, прошу заодно залить туда - а то меня, видимо, при попытке регистрации администрация так и не одобрила. |
| DrMefistO:
Нету больше romhacking.net, теперь он только ридонли. |
| Segaman:
На ромхак плазу лей тогда уже. Я лучше аналога ромхакинга.нет не нашел :neznayu: https://romhackplaza.org/utilities/ |
| Томахомэ:
Аналогичная для конвертации на этот раз уже в 8-битные тайлы 4x4 (во веки веков не надивлюсь безумию древнекорейской инженерии!), использовавшиеся для формирования юзерского интерфейса и псевдоспрайтов в игре Double Point. Добавлено позже: Последний формат графики пойдёт на Sails of Charon - конретно на моменты тома 7 "Всё, что было после" уже во время миссий, действие которых происходит не раньше Второй Иракской, когда игроку даётся немного подрасслабиться через геймплейное чередование стратегии с эротической 1+2-подобной головоломкой, посвящённой уютной семейной жизни одного из "Хароновых парусов". |
| Segaman:
Сделал бы всё в одном, просто аргументом чтоб переключать формат :) Чо софтины то плодить одинаковые? |
| Томахомэ:
--- Цитата: Segaman от 02 Март 2025, 17:07:38 ---Сделал бы всё в одном, просто аргументом чтоб переключать формат :) Чо софтины то плодить одинаковые? --- Конец цитаты --- А как считывание аргументов правильно оформлять? Например, вот эти строчки --- Код: ---if(argv[2]=="-v") orientation=1; else orientation=0; --- Конец кода --- почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём. |
| Mr2:
--- Цитата: Томахомэ от 08 Март 2025, 17:57:58 ---А как считывание аргументов правильно оформлять? --- Конец цитаты --- Посмотри в чужих исходниках. --- Цитата: Томахомэ от 08 Март 2025, 17:57:58 ---Например, вот эти строчки --- Код: ---if(argv[2]=="-v") orientation=1; else orientation=0; --- Конец кода --- почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём. --- Конец цитаты --- Ты сравниваешь адреса двух строк. :) |
| Томахомэ:
--- Цитата: Mr2 от 08 Март 2025, 18:25:28 ---Ты сравниваешь адреса двух строк. :) --- Конец цитаты --- А сами строки - как? |
| Sharpnull:
--- Цитата: Томахомэ от 08 Март 2025, 18:39:19 ---А сами строки - как? --- Конец цитаты --- На C https://en.cppreference.com/w/cpp/string/byte/strcmp, if (strcmp(argv[2], "-v") == 0). На C++ можно использовать std::string, тогда просто ==. |
| Томахомэ:
Возникла проблема со строчкой --- Код: ---if((strcmp(argv[2],"-edi")==0)||argc<3) format=0; --- Конец кода --- Если аргумент -edi будущее обновление NeoPlan понимает ещё правильно, то отсутствие аргументов (при котором в качестве дефолтного формата графического рома на конвертацию должен выбираться формат бэк- и мидграундов для железа Steel Force) - уже чё-то нет. |
| Sharpnull:
--- Цитата: Томахомэ от 09 Март 2025, 09:09:14 ---Возникла проблема со строчкой --- Конец цитаты --- Так не пишут. Обычно используют готовые библиотеки, где нужно только описать параметры/аргументы. Вот мой шаблон простого парсинга аргументов командой строки. 2 позиционных параметра (обязательны, INPUT и OUTPUT), также необязательные параметры (опции) со значением по умолчанию: выбор из двух опций (-c или -d) и параметр со значением (-p число). Примеры команд: --- Код: ---arg_example.exe in.bin out.bin arg_example.exe -d in.bin out.bin -p 128 arg_example.exe in.bin out.bin -d -c // Будет -с, т. к. последним указан arg_example.exe in.bin -p 0xFF out.bin --- Конец кода --- |
| Томахомэ:
--- Цитата: Segaman от 02 Март 2025, 17:07:38 ---Сделал бы всё в одном, просто аргументом чтоб переключать формат :) --- Конец цитаты --- По итогу именно так и сделал. Добавлено позже: Как бы так правильно оформить базу аргументов примерно такого вида? --- Код: ---const ... argsBase[] = {NULL, "-psikyo_g1_h", "-mincorp", "-tc0180vcu_8x8_12b_pal", "-tc0180vcu_16x16_12b_pal", "-tc0180vcu_8x8_flip_12b_pal", "-tc0180vcu_16x16_flip_12b_pal"}; --- Конец кода --- |
| Томахомэ:
Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования? |
| Segaman:
--- Цитата: Томахомэ от 12 Май 2025, 06:23:39 ---Как бы так получше отконвертировать стандартный 8-битный PCM со знаком в 12-битный для Namco C140 (т. е. формата $xxx0), чтобы результат не засорялся шумами квантования? --- Конец цитаты --- Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было. Хотя я не звукарь, мне в детстве медведь на ухо наступил. :) |
| Томахомэ:
--- Цитата: Segaman от 12 Май 2025, 09:50:56 ---Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было. Хотя я не звукарь, мне в детстве медведь на ухо наступил. :) --- Конец цитаты --- Из "исконно" 16-битных форматов PCM у меня на примете пока только BSMT2000, но до него очередь ещё дойдёт. А щас в фокусе Seta X1-010, Irem/Nanao GA-20 и Gaelco GAE1 - чтобы для Operation Fireweb взять музыкальные сэмплы, соответственно, из Battletoads Arcade, Arbalester, Gunforce II и Alligator Hunt. |
| Томахомэ:
--- Цитата: Segaman от 12 Май 2025, 09:50:56 ---Апскейлить качество такое себе. А вот если бы брал за исходник 16-битный и даунскейлил до 12-бит, вот тогда точно проблем бы не было. Хотя я не звукарь, мне в детстве медведь на ухо наступил. :) --- Конец цитаты --- А причина оказалась внезапно вот в чём: задумался я в какой-то момент - может, с endianity что-нибудь напортачил? Полез в раздел дебаггера "Namco C140 ':c140' rom space memory" и параллельно открыл в HEX-редакторе сам файл рома, чтобы сравнить значения. И знаете, что оказалось? Что не знаю, во всех-не во всех, но в большинстве игр для Namco System 2 структура PCM-рома, по сути, 8-битная, только каждый байт загружается как старший в соответствующем слове для C140 (Использующийся у этих игр метод загрузки ROM_LOAD16_BYTE, который я нашёл в драйвере namcos2.cpp, только внёс окончательную ясность. Впрочем, ничто не мешает для дебага и тестировки Operation Fireweb узким закрытым кругом разработчиков использовать конкретно для конкретно её рома, занесённого в специальную приватную сборку MAME, альтернативный загрузчик, а когда придёт пора выпускать игру на непосредственно автоматах, реализовать этот загрузчик железно, чтобы не давать младшим ниблам PCM-сэмплов простаивать.). Поэтому-то, когда я давал MAME PCM-ром в отконвертнутом 16-битном виде, начала идти звуковая чересполосица - "слово со звуковыми данными-слово пустое", которая и порождала этот странный уродливый шум. Вот по итогу обновлённый ромсет на заценку. |
| Томахомэ:
Следом проверку успешно прошли форматы для Konami K007232 и Irem GA-20. Следующим будет тестанут формат для Gaelco GAE1, с которым сложность в том, что звуковые данные там читаются задом наперёд. |
| Навигация |
| Главная страница сообщений |