«Гопник-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);
}
Эти указатели — по сути мусор, но один файл игры занимает сотни байт, а у меня нет всего времени Вселенной, чтобы экономить на спичках.
В общем, из задуманного не сделал ничего, зато поправил некоторые вещи поважнее.
Добрый вечер Евгений! Можно ли как-то протестировать и поиграть в сие чудо?
Не уверен, что это чудо, но конечно ) У вас какая операционная система?
Всегда выставляю в терминале белый фон и черные буквы, в противном случае глаза вытекают на пол.
Попробуйте!
Спасибо, но я пас ) Я люблю тёмные интерфейсы.