Пишу, по большей части, про историю, свою жизнь и немного про программирование. Живу в Казани.

«Гопник-2»: итог выходных

Человек предполагает, а череда неконтролируемых случайностей располагает. Я думал, что все выходные буду тихонечко пилить список запланированных изменений в игре, а на деле пришлось править совсем другое.

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

Баг, доставшийся в наследство от попытки портирования предыдущего автора — не выставляет чёрный цвет фона

Например, у одной моей подруги, которой я прислал «Гопника», программа «Терминал» почему-то имеет белый фон и игра на нём выглядела странно, пришлось это поправить.

Кстати, я не знал какой у неё «Макбук» — на процессоре «Интела» или «Эпла», поэтому пришлось научиться делать так называемые «универсальные бинарники».

Это несложно: компилируем программу дважды, сначала — под «интел» (-target x86_64), потом — под «эпл» (-target arm64-apple-macos11), после чего собираем оба бинарника в один:

lipo gop2-x86 gop2-arm -create -output gop2-universal

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

Автор первой попытки портирования игры из ДОСа в Линукс зачем-то убрал из исходников код сохранения и восстановления состояния героя, мне пришлось писать его самостоятельно. А так как я в коде игры ориентируюсь не блестяще, оказалось, что то, что я принимал за инвентарь, структура, отвечающая за что-то другое.

В общем, нашёл нужную структуру, написал код, который работает с ней без затей, — сохраняет и восстанавливает как есть, вместе с указателями на строки, которые потом обрабатываются дополнительно.

fread(&inv_amount, sizeof(inv_amount), 1, load_file);

inv = (inventory *) malloc(sizeof(inventory) * inv_amount);
fread(inv, sizeof(inventory), inv_amount, load_file);

for (int i = 0; i < inv_amount; i++) {
    size_t len;
    fread(&len, sizeof(len), 1, load_file);

    inv[i].name = (char *) malloc(sizeof(char) * len);
    fread(inv[i].name, sizeof(char), len, load_file);
}

Эти указатели — по сути мусор, но один файл игры занимает сотни байт, а у меня нет всего времени Вселенной, чтобы экономить на спичках.

В общем, из задуманного не сделал ничего, зато поправил некоторые вещи поважнее.

2 комментария
Denis 10 мес

Добрый вечер Евгений! Можно ли как-то протестировать и поиграть в сие чудо?

Евгений Степанищев 10 мес

Не уверен, что это чудо, но конечно ) У вас какая операционная система?

Алексей Копылов 10 мес

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

Попробуйте!

Евгений Степанищев 10 мес

Спасибо, но я пас ) Я люблю тёмные интерфейсы.