Автор Тема: Пишем ромхакерский/хоумбрюерский софт.  (Прочитано 754 раз)

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

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Собираюсь я тута написать небольшую совсем-совсем простенькую утилитку для конвертации 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

  • Пользователь
  • Сообщений: 3245
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #1 : 23 Февраль 2025, 11:56:41 »
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.
Попроси ChatGPT помочь. Он быстрее вкурит, что у тебя тут не так.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #2 : 23 Февраль 2025, 12:16:39 »
Не сильно в код углубился, но ты походу пытаешь читать конец файла, а там уже ничего нет.

Спасибо! Именно так оно и оказалось.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #3 : 25 Февраль 2025, 17:43:16 »
Ну а вот и сам инструментик готов! У кого есть аккаунт на Romhacking.net, прошу заодно залить туда - а то меня, видимо, при попытке регистрации администрация так и не одобрила.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1319
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #4 : 25 Февраль 2025, 18:14:26 »
Нету больше romhacking.net, теперь он только ридонли.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3245
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #5 : 26 Февраль 2025, 11:56:04 »
На ромхак плазу лей тогда уже.
Я лучше аналога ромхакинга.нет не нашел :neznayu:
https://romhackplaza.org/utilities/

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #6 : 02 Март 2025, 06:57:29 »
Аналогичная для конвертации на этот раз уже в 8-битные тайлы 4x4 (во веки веков не надивлюсь безумию древнекорейской инженерии!), использовавшиеся для формирования юзерского интерфейса и псевдоспрайтов в игре Double Point.

Добавлено позже:
Последний формат графики пойдёт на Sails of Charon - конретно на моменты тома 7 "Всё, что было после" уже во время миссий, действие которых происходит не раньше Второй Иракской, когда игроку даётся немного подрасслабиться через геймплейное чередование стратегии с эротической 1+2-подобной головоломкой, посвящённой уютной семейной жизни одного из "Хароновых парусов".
« Последнее редактирование: 08 Март 2025, 18:11:12 от ghostdog3 »

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3245
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #7 : 02 Март 2025, 17:07:38 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #8 : 08 Март 2025, 17:57:58 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)
Чо софтины то плодить одинаковые?

А как считывание аргументов правильно оформлять?

Например, вот эти строчки
if(argv[2]=="-v") orientation=1;
else orientation=0;

почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1629
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #9 : 08 Март 2025, 18:25:28 »
А как считывание аргументов правильно оформлять?
Посмотри в чужих исходниках.

Например, вот эти строчки
if(argv[2]=="-v") orientation=1;
else orientation=0;

почему-то не работают вообще никак - значение orientation при любом раскладе остаётся нулём.
Ты сравниваешь адреса двух строк.  :)

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #10 : 08 Март 2025, 18:39:19 »
Ты сравниваешь адреса двух строк.  :)

А сами строки - как?

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5196
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #11 : 08 Март 2025, 20:40:54 »
А сами строки - как?
На C https://en.cppreference.com/w/cpp/string/byte/strcmp, if (strcmp(argv[2], "-v") == 0). На C++ можно использовать std::string, тогда просто ==.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #12 : 09 Март 2025, 09:09:14 »
Возникла проблема со строчкой if((strcmp(argv[2],"-edi")==0)||argc<3) format=0;Если аргумент -edi будущее обновление NeoPlan понимает ещё правильно, то отсутствие аргументов (при котором в качестве дефолтного формата графического рома на конвертацию должен выбираться формат бэк- и мидграундов для железа Steel Force) - уже чё-то нет.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5196
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #13 : 09 Март 2025, 11:38:56 »
Возникла проблема со строчкой
Так не пишут. Обычно используют готовые библиотеки, где нужно только описать параметры/аргументы. Вот мой шаблон простого парсинга аргументов командой строки. 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

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #14 : 13 Март 2025, 08:20:33 »
Сделал бы всё в одном, просто аргументом чтоб переключать формат :)

По итогу именно так и сделал.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 848
  • Пол: Мужской
    • Просмотр профиля
Пишем ромхакерский/хоумбрюерский софт.
« Ответ #15 : 16 Март 2025, 08:26:34 »
Как бы так правильно оформить базу аргументов примерно такого вида?
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"};