Главная Юзердоски Каталог Трекер NSFW Настройки

Gamedev

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 66 55 22
Компилируем первый NetHack Аноним 17/06/23 Суб 19:08:57 881857 1
1624931413660.png 97Кб, 751x683
751x683
1657655728649.png 25Кб, 888x566
888x566
1662082060305.png 27Кб, 874x191
874x191
1583273211443.png 43Кб, 1014x312
1014x312
В этом тредике компилируем NetHack
А точнее его прародителя, самый первый рогалик Hack
(не считая самого Rogue)

Попутно выясняя:
-Насколько сильно изменился Си со времен K&R, ведь можно было как в питончике вызывать необъявленные
функции, не писать типы переменных и возврата.
-Как вообще у олдов что-то работало с таким количеством СегФолтов и без тестов
-Почему он занимает столько места, 200-300кб, там ведь не так много логики, и почему его никто не пытался ужать до 48-64кб для Спектрума/C64
-Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки

Уже скомпилированы и опробованы:
NetHack 1.3d, первая доступная версия нетхака
Hack 1.0.3, собирается с парой изменений, доступен в BSD
Hack 1.0, падает при генерации
Hack для PDP-11, самые ранние доступные исходники.
Он и будет основным объектом интереса.
Собирается с переписанным терминалом, часто падает.
Также в отдаленном будущем будут изучены
NetHack 3.0.4, первая версия с цветными буковками
NetHack 3.1.x, версии для MS DOS с оверлеями,
то есть возможностью выгружать и подгужать отдельные модули логики.
Аноним 17/06/23 Суб 19:30:10 881859 2
бамп амулетом йендора
Аноним 17/06/23 Суб 23:24:21 881877 3
1648042366317.png 75Кб, 1133x342
1133x342
Ухх могли деды, мощно.
Аноним 18/06/23 Вск 01:05:08 881887 4
>>881877
Что происходит на пике?
Аноним 18/06/23 Вск 01:10:22 881888 5
Аноним 19/06/23 Пнд 08:47:19 882010 6
1556139116215.png 23Кб, 721x552
721x552
1545381044900.png 52Кб, 994x331
994x331
1539909839696.png 28Кб, 884x560
884x560
1538178274186.png 35Кб, 882x558
882x558
Часов 6-8 сегодня ушло на отладку.
В письмах есть инфа что эти исходники еще довольно багованные.
Одна проблема была в том, что для древнего компа игра и генератор разделены на две программы.
Но в сохранения пишутся указатели, что приводит к мусору при загрузке.

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

Геймплейно по ощущениям отличается от поздних NetHack
Комнаты освещаются сразу целиком, коридоры часто идут в 2 клетки и вдоль периметра комнат.
Двери визуально не открываются, нельзя входить по диагонали.
Если пойти на собачку-спутника, персонаж ее ударит, а не подвинет.
Эти два факта причиняют определенные неудобства.
В остальном же очень похоже, слоняешься, бьешься о стены, промахиваешься мимо летучих мышей.

Следующие багфиксы по плану
-Генерить новый уровень при спуске по лестнице.
Видимо, после рефакторинга где то надо создавать файл с новым именем.
-Встречаются только летучие мыши (нулевой монстр).
До рефакторинга попадались кобольды и хобгоблины.
-Изменить шаблоны printf на более современные.
Можно взять из более поздних версий.
-Еще падает таблица рекордов.
-Сохраненный уровень с магазином упал, скорее всего не загрузился продавец.
-Покупка, похоже, тоже не работает.
Аноним 19/06/23 Пнд 15:10:12 882036 7
1628179693604.png 5Кб, 348x48
348x48
Суровая игра проверяет что сейчас рабочее время, а не выходные.
Аноним 19/06/23 Пнд 18:27:04 882073 8
1562108527933.png 20Кб, 713x478
713x478
1632122691603.png 21Кб, 863x474
863x474
1603939284330.png 31Кб, 973x114
973x114
1684794692141.png 28Кб, 841x562
841x562
В основном сейчас кусаются две проблемы.
1) Функции без прототипов. Компилятор встретив функцию думает что это int foo(), а на самом деле она может быть char* foo().
2) Указатели в сейве. Пришлось временно отключить сохранение списков строк, потом надо тоже порефакторить.
>Решение было подсмотрено в более поздних нетхаках - сохранять не голый указатель, а индекс в таблице.
Эту идею я не совсем точно понял. Это не сработало, потому что кроме массива есть еще разбросанные по коду структуры. Хитрые смещения я делать не захотел, так как все время перекомпилирую и расстояние между структурами тоже может измениться. Так что сделал свою табличку индексов.

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

Покупка и продажа, на самом деле, работали.
Надо пофиксить принтфы, а то непонятно, сколько на самом деле золота. Кажется, цены перепутаны.
А не работало сбрасывание предмета, видимо действительно исходники не вполне рабочие.
Разыменование указателя в начале функции, притом, что по API туда передается 0.
Аноним 19/06/23 Пнд 19:54:33 882082 9
Мне последнее время тоже нравится Си. Он какой-то более чистый и стабильный, что ли. То есть можно взять программу сорокалетней давности и без особых проблем скомпилировать под новые платформы. Хочу тоже делать что-то "на века".
Аноним 19/06/23 Пнд 20:19:38 882085 10
>>882082
Я б не сказал, что совсем без проблем. С проблемами, вот, много воевать приходится.

>Компилятор встретив функцию думает что это int foo(), а на самом деле она может быть char* foo().
Сейчас подумал, что тут проблема, скорее всего, в 64 битном указателе, ведь он не влезает в int.
В отладчике я видел обрезанные значения, типа 000000005555fa90 вместо 000055555555fa90. Очевидно, в их время int проблемы не вызывал.
Аноним 20/06/23 Втр 07:47:52 882117 11
1539107871840.png 16Кб, 658x496
658x496
Поправил еще пару NULL, теперь можно ходить вверх вниз по лестницам, пока что критичные баги закончились.
Из предыдущего списка осталось только таблицу рекордов поправить.
Конечно, в процессе могут найтись еще.
Аноним 20/06/23 Втр 07:54:48 882118 12
1570338781320.png 32Кб, 688x233
688x233
А, на самом деле и таблица рекордов починилась.

Заметил, что персонажа есть только сила. Оказывается, остальные (ловкость, интеллект и т.д.) только в NetHack 3.0 добавили.
Аноним 21/06/23 Срд 14:42:56 882218 13
Анонче, есть ссылка на твой реп с фиксами или исходниками от автора? сам хочу поковыряться
Аноним 21/06/23 Срд 15:25:06 882227 14
Единственный интересный тред на доске.
Аноним 21/06/23 Срд 15:40:58 882231 15
>>882227
Не знаю что ты нашел интересного. Я вот вообще нихуя не понимаю, что это за игра, как должна играться, и кто её сделал? Это мод на уже готовом, или что?
Аноним 21/06/23 Срд 16:27:13 882236 16
>>881857 (OP)
>Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки

Он имел в виду - удачи дозвониться, т.к. телефонная линия занята либо модемом, либо младшей сестрёнкой.
Аноним 22/06/23 Чтв 04:06:42 882286 17
>>882218
Почему бы и нет
https://anonymfile.com/m1351/hackjf.zip
Там гит с 3 коммитами - оригинальные исходники, минимальные фиксы чтобы компилировалось, более-менее рабочая версия.
Лицензии на эту версию нет, но потом стала GPL
Аноним 22/06/23 Чтв 04:07:22 882287 18
>>882286
Алсо она работает на линуксе, если на винде надо еще какие-то изменения из поздних нетхаков брать, переводить на ncurses
Аноним 22/06/23 Чтв 04:25:31 882288 19
1562720028873.gif 200Кб, 540x300
540x300
>>882231
>кто её сделал
Ее сделали школьники из Массачусетса в 82-84 годах.
Если ещ копнуть, то игры Hack-PDP и Hack 1.0 - от авторов утилит sed и tar, которые до сих пор используются в Линуксе, при установке и обновлении например.

Они попросили у авторов Rogue исходники, те не дали, тогда еще GPL/BSD только зарождались, школьники написали клон.
Вот тут есть глава из книжки про рогалики https://www.gamedeveloper.com/design/dungeon-hacks-chapter-5-when-the-inmates-run-the-asylum---hack-ing-at-lincoln-sudbury-high-school

>что это за игра, как должна играться
Это самые ранние доступные исходники рогалика (Net)Hack.
Играется он примерно так же, как и последние лет 30.
Позднее нетхак стал обрастать действиями, там задействована почти вся клава и с комбинациями Shift, Ctrl, Alt это около 120 команд.
И в сторону взаимодействия всего со всем. Макать стрелы в бутылочки с ядом, кидать бутылочки в монстров, приносить трупы в жертвы богам, превращаться в разных существ и получать их способности, заматывать глаза полотенцем чтобы не ослепнуть от вспышки.
В инете много инструкций к прохождению, они состоят из описаний наподобие: свиток телепортации сможет перенести вас на дргой этаж, но только если он был проклят или вы контужены когда читали.
Аноним 22/06/23 Чтв 04:28:24 882289 20
>>882218
Сами исходники я брал по ссылками с вики
https://nethackwiki.com/wiki/Jay_Fenlason%27s_Hack
И потом распаковывал, что-то патчил руками. Благо они просто как текст емейла рассылались.
Самые доступные исходники это наверное hack 1.0.3
Потому что они в линуксе лежат в пакете bsdgames
И их можно скачать командой apt get sources
Аноним 22/06/23 Чтв 06:23:40 882299 21
>>882288
сколько же там говнокода, уффффф
Аноним 22/06/23 Чтв 09:09:56 882309 22
>>882299
Не так уж и много. В PDP версии 9900 строк, в 1.0 - 13400, в 1.03 - 19500, в nethack1.3d - 26200
На самом деле не такой там и говногод, особенно учитывая что писали школьники, и на древних компах.
Архитектура да, страдает, но опять же у них из удобных инструментов были только тетрадки для рисования схем.
А так, даже интересно изучать развитие архитектуры. Захотел новый вид комнаты или действие - впендюрил в свитч, потом потомки пустай обобщают и переносят в другой файл.
Аноним 22/06/23 Чтв 09:11:40 882310 23
1617832460439.png 119Кб, 1329x616
1329x616
Тем временем, начал переносить код на C64.
Генератор комнат и коридоров, похоже, отработал успешно.
Буду добавлять фичи по частям, пока память не кончится, потом пооптимизирую раза в 2.
Надо дописывать нехватаюшие вещи на ассемблере.
Аноним 22/06/23 Чтв 09:35:35 882313 24
>>882288
Позволь тогда нескромный вопрос, а какой смысл от этой игры сейчас? Зачем она нужна?
Как история окей, но кто будет играть в это?
Аноним 22/06/23 Чтв 15:55:16 882349 25
1684779829571.png 54Кб, 900x520
900x520
1557818134311.png 231Кб, 1243x586
1243x586
>>882313
В сам нетхак вполне себе играют.
Например, распространены публичные серверы, где спидранеры стараются попасть в онлайн таблицу рекордов.
Вот например график с одного такого. Похоже что онлайн стабилен И список последних игр.
Конечно, более современные рогалики, такие как Brogue и Dungeon Crawl Stone Soup, постепенно стали более популярными.

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

Нетхак используется как полигон для обучения нейронок фейсбуком. https://github.com/facebookresearch/nle/

Конкретно первая версия имеет больше исторический и исследовательский интерес. Конкретно мне интересно, что с ней можно сделать современными инструментами компиляции, на что есть намек в посте выше.
Аноним 22/06/23 Чтв 15:58:04 882351 26
>>882349
>умер, поскользнувшись, пытаясь оседлать пони
>убит хамелеоном, имитирующим вихрь энергии
По-моему, уже этого достаточно, чтобы понять, почему люди продолжают в нее играть.
Аноним 26/06/23 Пнд 06:18:56 882717 27
1679014124368.png 25Кб, 716x537
716x537
Много занимался, но прогресс пока небольшой.
Приближаюсь к моменту когда начнет ходить по пустым комнатам.
Много времени ушло еще, потому что делал временный режим вывода в половинные символы в битмап. Потом переделывать на скролл, но сейчас для простоты чтобы игра выглядела 1 к 1 как на Пеке. Пока решил переносить, а фичи новые не пилить, чтобы не вносить новых багов пока не закончу перенос. Но все же добавил миникарту, потом будет нужна.
Из веселого была борьба с компилятором, который оказывается менял состояние процессора после загрузки. В результате часть памяти не менялась, хотя я в нее пишу, а часть наоборот менялась сама, потому что там оказался стек и куча, а часть перезаписывалась поверх.
Еще прикрутил упаковщик. Вообще он не нужен на этом этапе, но вроде бы загрузка и распаковка быстрее чем загрузка несжатого. Но скорее всего можно ускорить загрузку на эмуляторе и без этого. Включив какое нибудь ускорение или вообще снепшот загружать.
Отладка сейчас уже неудобная. Уже сложно соотносить Си и ассемблер, да и отладчик будет только по ассемблеру ходить. Писать свой не хочу. Отлаживаю принтами, бесконечными циклами, расставляя методом бинарного поиска. Так ищу точку после которой происходит порча памяти.
Аноним 26/06/23 Пнд 06:28:14 882718 28
1658556423106.png 3Кб, 612x240
612x240
1551755599567.png 20Кб, 794x163
794x163
>>882717
Еще из забавного - не хотел тратить время на рисование шрифта, взял за основу готовый. Но некоторые символы надо было поправить. Оказалось, что проще всего такие маленькие символы отредактировать прямо в 16-ричных цифрах.
Все очевидно же, символы 3 на 6, значит
7 это 1+2+4 то есть ###
5 это 1+4 то есть # #
И так далее.
Символы продублированы чтобы не делать сдвиги которые на 8 битных медденные. Но это за счет лишней памяти, пол килобайта. Вообще сам видеорежим битмапа лишние 8 кб жрет.
Потом все таки переделаю на скроллинг, опять же тогда потенциально можно думать о спектруме и денди - у них экран только 256 в ширину, а не 320, а значит 80 символо все равно не влезет, только 64. К тому же в таком режиме не получится нормально раскрашивать буквы - ведь можно раскрасить только клетку с парой букв.
Аноним 26/06/23 Пнд 09:45:15 882739 29
1573210582114.webm 63Кб, 700x500, 00:00:29
700x500
И, оно работает! Пока пусто, нет предметов и врагов, но ходить уже можно, дверки открываются, в стены упирается.
Аноним 26/06/23 Пнд 09:53:25 882740 30
оп, а добавь возможность грабить корованы
Аноним 26/06/23 Пнд 11:30:31 882745 31
>>882739
Нихуя ты баклажан.
Аноним 26/06/23 Пнд 11:50:57 882748 32
>>882349
Лично я не понимаю, зачем при наличии даже не простых игр которые клепают студии, а весьма интересных инди в количестве овер 100500 штук играть в такое.

>В сам нетхак вполне себе играют.
В любую игру, найдутся игроки, какая бы она не была, сложно принять это за аргумент.

И я больше кидаю претензию не в плане: ха-ха кому нужно играть в консоли, смотря на аски символы, уноси это старое говно. А в смысле, должна же быть фишка у игры из-за который игроки будет делать поблажки на тот же визуал и геймплей.

Может расскажешь за какие-то уникальности которые хочешь сделать? Просто бродить, драться это весело, но интересуют именно уникальные фишечки.
Аноним 26/06/23 Пнд 18:58:37 882793 33
>>882748
Честно говоря, сложно ответить что-то больше, чем было в предыдущем ответе и названии треда.
Ты как будто пытаешься бежать впереди лошади и переживаешь о несущественных на данном этапе вещах.
Может быть, ты невнимательно читал, сейчас все на стадии как и что урезать, где найти 2 килобайта чтобы влезли объекты, а монстры еще даже не близко. А ты каких то игроков ищешь, доавление новизны, и конкуренцию с ААА играми.
Аноним 26/06/23 Пнд 19:52:19 882808 34
1540500492959.png 19Кб, 631x436
631x436
Начал добавлять минимально объекты, их подбор.
Память уже заканчивается, дальше надо брать лопату в руки, 8 кб еще можно выжать, но надо будет написать свои принтфы, а дальше смотреть в ассемблер и разбираться как помогать компилятору си оптимизировать.
Но я думаю что эту версию все таки получится втиснуть с монстрами без большой крови. А вот с последующими уже интересно.
Аноним 27/06/23 Втр 00:04:14 882837 35
>>882748
А вообще, что ты предлагаешь? Делать свой клон но с нескучными твистами? Типа как есть куча рогаликов, но не про фентези. а про скайфай или думгая? но они редко взлетают выше оригиналов.
Да даже у самого нетхака есть моды и форки с ребалансом, но они менее популярны
Я видел кто то делал клон цивы на C64, но он конечно писал с нуля и с учетом платформы. Но писать все вручную и продумывать новые механики с кучей взаимодействий - это все же сложнее, чем оптимизировать готовый код, и займет времени намного больше, а будет ли заметно - еще вопрос, а так сразу несколько комьюнити порадуется, и 8-битных компов, и нетхака, и компилятора.
https://www.youtube.com/watch?v=iHA2Qvah0uM
Аноним 27/06/23 Втр 01:58:27 882840 36
>>882837
>А вообще, что ты предлагаешь?
Я ничего не предлагаю. Если прочитаешь беседу сверху то поймёшь суть.
Аноним 28/06/23 Срд 06:19:28 883036 37
1659422636296.webm 181Кб, 700x500, 00:00:58
700x500
Отрефакторил некоторые моменты платформы.
Выкинул полуширинный битмап и шрифт, как и задумал.
Теперь есть псевдоскролл, который показывает левую или правую половину уровня, и миникарта.
Потом можно сделать скролл поумнее, который центруется на персонаже.

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

Дальше в планах - минимально добавить монстров, минимально добавить действия, атаку, потом пробовать расширять ассортимент.

Пару раз был покусан Си. Когда написал var != var вместо var = !var. В другой раз, в конвертере сканкодов в ASCII была строка символов, разбавленная \0. В одном месте получилось "\02\0" когда нужно было "\0" "2" "\0".
Еще не все баги с размерами аргументов исправлены, что можно заметить в printf хитпоинтов.

Осталось до начала суровых оптимизаций: 16кб.
Пока рано об этом думать, но получится ли всунуть минимальный хелп? Звуки? Процедурную музыку? Хотелось бы 2 кб на такое оставить.
Аноним 29/06/23 Чтв 20:36:56 883308 38
1636402768367.mp4 17877Кб, 650x480, 00:02:21
650x480
Сегодня лень что-то делать, бампану процедурной музыкой для вдохновения.
Аноним 29/06/23 Чтв 23:57:00 883367 39
1643755346986.png 20Кб, 706x516
706x516
Провел немного невидимой работы по оптимизации
1. Еще разок переписал printf. В общем игре не нужен универсальный форматтер. Карта рисуется putchar, а printf нужен в основном для паддинга цифр в интерфейсе.
Но вывод цифр я могу сделать быстрее, чем стандартный itoa, к тому же у меня не терминал, я могу сам управлять позицией вывода. Сэкономлен ~1кб
2. Вспомнил дедовский способ компиляции - сначала слить cat все .c исходники в один файл. LTO (оптимизация во время линковки) делает хорошую работу, но так у компилятора еще больше простор для оптимизаций. Сэкономлено 2кб.
Также это пригодится для cflow которой я хочу построить граф вызовов и найти рекурсивные функции. От них надо избавиться или хотя бы пометить остальные как non-reentrable. Это поможет компилятору не выделять для них лишние временные переменные на стеке.
3. Пересмотрел распределение по банкам памяти. Теперь игра работает без отключения прерываний (это понадобится когда я доберусь до записи/загрузки с диска и музыки) и меньше дрочит переключение банков памяти.
На этом я потерял 4кб, так что в сумме 0. Эти 4 кб резеврные, ими теоретически можно воспользоваться, но постоянно включать-выключать банки памяти. Может быть буду хранить там какие то редко используемые данные.
Аноним 30/06/23 Птн 00:21:40 883370 40
>>883308
Как можно просто сделать с помощью нейросетки или другим средством такую дженерик музыку фоном? Для своих игр бы использовал.
Аноним 30/06/23 Птн 00:29:04 883373 41
>>883370
Про нейросетки не знаю, то один гений делал - у него вся музыка и арт уместилась 256 байт. Нейросетке хз сколько гигов на такое понадобится.
Аноним 30/06/23 Птн 00:37:30 883374 42
Аноним 01/07/23 Суб 07:46:30 883565 43
1663267764516.webm 183Кб, 700x500, 00:00:54
700x500
1659054064162.png 74Кб, 524x588
524x588
1686637453632.png 65Кб, 461x577
461x577
1604593580330.png 113Кб, 957x452
957x452
Включил базово действие атаки, и теперь можно ходить и крошить монстров, которые честно загружены.

Враги пока не ходят, где-то указатель утек и все зависает.

Вот теперь памяти точно под завязку, а еще не реализованы действия с зельями и остальным.

Два дня плотно ходил по граблям. Снова перелопатил банки памяти. Сложность в том, что в одном месте посередине RAM выковырена дырка под ввод-ввывод.
Пришлось курить ld-скрипты линкера, заводить секции для си.
Обычно линкер просто набивает все функции в секцию .text, но в таких случаях можно вручную перетасовывать какая функция попадет в какую область памяти.

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

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

Буду пореже писать, в планах доотлаживать монстров, и в принципе это близко к минимальной демке которую я хотел. Дальше конечно можно годами улучшать, оптимизировать, переписывать части на ассемблере.
Аноним 01/07/23 Суб 08:11:56 883567 44
1636725381911.png 207Кб, 1352x609
1352x609
1629527454852.png 23Кб, 905x150
905x150
>>882717
>скорее всего можно ускорить загрузку на эмуляторе
Кстати, так и вышло. Я просто сделал снепшот свеже запущенного эмулятора, а потом скриптом подменяю его память на билд игры, и чуть чуть подшаманиваю регистры процессора - и все запускается мгновенно, без долгой эмуляции загрузк с дискеты. Благо, на линуксе нашлись удобные утилиты для работы с байтами.
Хотя я и питон для некоторых рассчетов адресов использовал.

А, вспомнил, я еще планирую выкинуть malloc. И попробовать массивы структур, под монстров, под объекты и так далее.
Аноним 01/07/23 Суб 17:51:20 883659 45
image.png 56Кб, 1905x653
1905x653
image.png 103Кб, 1195x897
1195x897
Мне больше форк UnNetHack нравится. Как раз сейчас перевожу ее на русский язык.
Аноним 01/07/23 Суб 18:21:30 883663 46
1686136724670.png 10Кб, 631x98
631x98
1643412636643.png 54Кб, 561x484
561x484
1657656703015.png 9Кб, 446x61
446x61
1660550123444.png 29Кб, 790x187
790x187
>>883659
Форков много, даже попадались рейтинги (субъективные).
Вот например https://www.reddit.com/r/nethack/comments/w1m1bm/ascending_every_nethack_variant_my_review/
С другой стороны он низко оценил SporkHack, а в другом месте его наоборот нахваливали.
Так что, видимо, это вопрос вкусов.

Современные нетхаки довольно навороченные, там уже и компиляторы уровней со своими скриптами, и Lua-скрипты.
Мне же было интересно прикоснуться к минимальной версии, к основам так сказать.

Любопытно, что они прямым текстом делали отсылки к D&D. Например, сила выражалась в 18/99. Или, например, классические монстры. Да и вообще сама атака похожа на бросок d20 и THAC0.
Аноним 05/07/23 Срд 17:31:59 884441 47
ОП ну что там, игра делается? Или что?
Аноним 05/07/23 Срд 22:41:07 884495 48
>>882748
Фишка конкретно Nethack - это, как уже ОП сказал, огромный упор на интерактивность и взаимодействие с предметами и монстрами. Например, ты можешь написать на полу "Elbereth", и тогда монстры не будут тебя трогать, пока ты стоишь на этом квадрате, но если ты писал пальцем в пыли, то надпись быстро сотрется, а кинжалом ее ковырять ужасно долго и кинжал после этого затупится в говно, а можно взять волшебную палочку огня и выжечь надпись, но на это тратятся заряды. Если найти эльфийский кинжал, то можно назвать его "Жало" и тогда он превратится в артефакт с бонусом против орков, но тогда другие артефакты тебе будут реже попадаться, а они получше будут. А если макать меч в фонтан, то он может превратиться в Экскалибур, а может заржаветь. А можно найти в подземелье кухонную раковину и пинать ее, тогда тебе напишут "Вернулась посудомойка", придет суккуб и можно ее выебать и получить рандомный бонус, при этом она тебя будет раздевать, и если это займет слишком долго, то она перехочет ебаться, а если у тебя есть в инвентаре кольцо привлекательности, она попытается на тебя его надеть, а если твой персонаж - телка, то придет инкуб. Только вместо тянки из раковины может вообще вылезти черная слизь и ты заебешься с ней воевать. И такого там дохуя:
https://tvtropes.org/pmwiki/pmwiki.php/DevelopersForesight/NetHack
Аноним 06/07/23 Чтв 06:19:20 884518 49
1562368118065.webm 122Кб, 700x500, 00:00:51
700x500
1536857240866.png 885Кб, 1438x4092
1438x4092
>>884441
Разработка ведется, но времени стало меньше, задачи сложнее, так что писать буду реже.

1. Добавлены простые команды - бег по прямой, пропуск хода, поиск скрытых дверей.
2. Монстры уже могут убить.
3. Наконец то написал свой getchar(). Таким образом, вместе с printf(), atoi() и компанией, больше нет нужды в ROM, а значит, и в переключении банков. До тех пор, пока мне не понадобятся последние 4кб RAM с медленным доступом, конечно.
Оказывается, 8 битные компьютеры тратят на сканирование клавиатуры довольно много тактов CPU. Они должны по очереди замыкать 1 из 8 контактов, и по битам считывать 8х8 комбинаций для 64 клавиш. Далее надо отделить модификаторы (шифт), и конвертировать в ascii. Тут есть место для оптимизации.
4. Хотелось придать немного живости игре и добавить мигающий курсор. Благо предыдущий пункт упростил написание своих прерываний. Но пока не разобрался, как делать это на Си - какие-то внутренние регистры затираются.
5. Было найдено единственное использование sprintf(). Заменил его на копию своего printf, что освободило целых 2 килобайта. Потом вообще объединю их в одну функцию.

Заметил несколько проблем, требующих много отладки. Ловушки пока зависают, монстры не ходят, при этом не удаляются после смерти, проблемы с надписями в верхней строке, при беге не перерисовывается миникарта.
Осталось памяти - неизвестно, почти нисколько.
Аноним 06/07/23 Чтв 16:18:43 884572 50
1569249386290.png 15Кб, 396x131
396x131
Ошибка "program disorder" оказалась ложной, когда отлаживал, забыл заключить блок в фигурные скобки.
Тут бы помогло предупреждение от компилятора, но на такой старой кодовой базе их слишком много, чтобы искать в этом шуме.
Аноним 07/07/23 Птн 10:17:07 884704 51
1548703883025.webm 4029Кб, 720x544, 00:03:59
720x544
1648422931047.png 51Кб, 319x553
319x553
1553827784276.png 43Кб, 806x401
806x401
Первая проба в процедурной музыке
Аноним 07/07/23 Птн 11:36:06 884718 52
>>884704
лучше кадилак на фоне чем эта какафония
Аноним 07/07/23 Птн 17:13:54 884753 53
>>884718
Да фильтров сверху навернуть и збс
Аноним 10/07/23 Пнд 04:40:00 885304 54
1585359070940.png 26Кб, 487x142
487x142
1537212917920.png 26Кб, 480x134
480x134
Доработал скрипт, который измеряет сколько еще свободного места остается. Полистал листинг ассемблера. И, как и думал, нашел штуку которая освободила кучу места.
Это был инлайн rand(). В рогалике, где рандом вызывается сотни раз, и это не преувеличение (поиск показал 363).
8 килобайт как с куста, приятно.
Аноним 10/07/23 Пнд 04:45:55 885305 55
>>885304
Вообще интересно, что компилятор это профукал. 8000/343 = 22 байта, наверное посчитал что мелочь, недостойная флага оптимизации -Os
Аноним 10/07/23 Пнд 08:09:27 885311 56
1595590946985.webm 169Кб, 700x500, 00:00:58
700x500
А это значит, что шоу продолжается.
Добавлен инвентарь, подбор предметов, сброс предметов, смена оружия.
Вылезли какие-то проблемы в printf/atoi, так что цифры пока печатаются неверно, потом буду разбираться.
Аноним 10/07/23 Пнд 21:27:51 885476 57
Молодцом оп.
А куда и как ты картинку выводишь?
Аноним 11/07/23 Втр 07:19:03 885509 58
1587380514619.webm 125Кб, 700x500, 00:00:59
700x500
>>885476
Если вопрос про разработку, то это просто эмулятор. Мой комп давно навернулся, сейчас бы я его починил. но он остался в другом городе, не факт что сохранился.
А покупать пока не хочется, оригинальные спектрумы и коммодоры стоят 10-20к рублей (а еще надо кардридер вместо дисковода). Конечно, потом хотелось бы проверить на реальном железе, но эмуляция на высоте, очень точная.

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

А если про саму платформу, то там все довольно просто, примерно как в DOS.
Я пробовал графические режимы, но смирился, что при постоянной нехватке памяти единственный вариант - простейший текстовый режим, со встроенным набором символов.
Есть блок памяти для символов, и такой же для пары цвет/фон. Адресация BASE + x + y * WIDTH (40). Сама игра 80, так что нужен скролл окна.

Миникарта рисуется спрайтом. Это легкая продвинутая техника - менять биты в самой картинке спрайта. На такой размер нужно 4 спрайта, это 1/4кб и столько же на код.

Хотел написать скроллинг, но закопался, там надо вообще все переделывать, плавный скролл всего экрана и выводить только новый столбец, иначе все тормозит или мигает, или забывает обновиться, даже мигающий курсор становится нетривиальным.
Пока оставил простой вариант, в завимости от положения игрока, рисуется левая, правая часть или центр.
Аноним 11/07/23 Втр 21:16:26 885654 59
1645551613298.png 23Кб, 446x231
446x231
1653974927134.png 24Кб, 497x229
497x229
Освободил 0.4кб переставив поля в структуре
Сама структура, понятно, меньше места занимать не стала.
А вот код явно упростился, даже без заглядывания в дисассемблер понятно, что в первом случае надо сделать 5-10 лишних команд - сдвинуть, сделать AND с маской и OR со сдвинутым вторым байтом. И это при доступе к каждой клетке поля.
Аноним 11/07/23 Втр 21:27:00 885655 60
1683220788571.png 56Кб, 542x430
542x430
>>885654
Прошелся по аналогичным местам и освободил еще 1кб. Вот так бывает, думали что экономят 5 бит, а на деле потеряли на несколько порядков больше.
Аноним 12/07/23 Срд 02:16:00 885695 61
hqdefault.jpg 12Кб, 480x360
480x360
>>885654
>Освободил 0.4кб переставив поля в структуре
Я всегда считал что в структурах не происходит оптимизаций, выравниваний и всяких перестановок. В плюсах есть даже такое понятие POD (Plain Old Data). Может ты с ключами оптимизации что-то перемудрил? Не должно же по идее такого происходить
Аноним 12/07/23 Срд 02:17:21 885696 62
>>885695
>>885654
>Сама структура, понятно, меньше места занимать не стала.
Я в глаза долблюсь. Вопрос снят
Аноним 12/07/23 Срд 03:04:53 885698 63
>>885695
В этом проекте я в основном пишу про размер кода (.text) а также статических переменных (.bss), кучей я практически не занимаюсь пока, там выделено что-то символическое, типа пары кб чтобы запускалось. Тут получается ситуация, чем больше я соптимизирую, тем больше предметов может быть в игре.
А там речь была про битовые поля. То есть, если написано
scrsym: 7
То код будет примерно таким
lda $byte1 ; acc = *byte1
lsr ; acc >> 1
А в случае scrsym: 7; typ: 6; попадает на границу байтов. Поэтому
lda $byte1
ror; acc >> 1 to carry flag
lda $byte2
ror;
ror; acc >> 2 from carry flag
and #00111111b
И поскольку доступ к переменной напрямую, без геттера или проперти, то такое компилятор инлайнит на каждый доступ.
Аноним 12/07/23 Срд 03:10:29 885699 64
>>885698
Ну и да, компилятору скорее всего нельзя переставлять поля местами, потому что вдруг программист обратился ко второму байту структуры по указателю.
Аноним 27/10/23 Птн 12:49:21 910544 65
>>881857 (OP)
Тоже занимался подобными вещами. Только я не пытался сделать прямой форк, а старался из кода rogue и нетхака использовать только то, что мне нужно. В итоге все равно наизобретал велосипедов. Тоже все хочу сделать что-то под спек и нес, но скиллов маловато. Все безбожно тормозит и не влезает

> -Насколько сильно изменился Си со времен K&R, ведь можно было как в питончике вызывать необъявленные
> функции, не писать типы переменных и возврата.
Не очень понятно что имеется ввиду. Не объявлять функции это порок, который тогда просто еще не осознали. А типы в си все сводимы к одному числовому. Плюс указатели можно по-разному использовать, главное - выделить достаточный участок памяти

> -Как вообще у олдов что-то работало с таким количеством СегФолтов и без тестов
Большинство из них большую часть времени фигачило в асме, а кое-кто и в машинных кодах. Тут хочешь не хочешь все в уме держать будешь. Особенно если не объявлять функции, и постоянно все запутывать с типами

> -Почему он занимает столько места, 200-300кб, там ведь не так много логики, и почему его никто не пытался ужать до 48-64кб для Спектрума/C64
На спеке никто особо не пытался писать на сишке, писали на асме. Ну и рогалики это гиковская, не спековская тема. Просто культура другая, на спеке больше по аркадам, причем до сих пор. За коммодор не скажу, но наверно что-то подобное

> -Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки
Дима Башуров оставлял в контактах рабочий почтовый ящик засекреченного ядерного, блядь, центра в совке

>>882085
Потому что k&r стандарт еще очень сырой был, многое еще не продумали, многое еще не пофиксили. Вот с ansi можно жить

>>882739
Скорость хорошая, ничего так

>>882748
На самом деле, было бы круто, если кто-то сделал просто порт классической игры под классические платформы

>>881857 (OP)
Оп, раз уж ты забросил это все. Не мог бы ты выложить свои наработки? Хочется увидеть как должен выглядеть нормальный код под 8-бит
Аноним 27/10/23 Птн 19:07:57 910680 66
1635223323630.png 318Кб, 474x355
474x355
>>910544
Функции не объявляли по простой причине, на железе под которое изначально писалось, все аргументы int (неважно сколько их), и указатели int.

Наработок показывать особо нет, это реально форк где выполняется тот самый оригинальный код. Свои вставки я показывал, например, тут, ничего особенного. >>884518

Пока забросил, хотел переосмыслить подход, но актуальные проекты и работа поглощают все время.
Просто написать собственный вариант на тему с нуля не проблема, такие игры есть. И даже в 83-м какой-то рогалик был, Sword of Fargoal
Было желание, чтобы работал именно тот код, та логика, тогда будет преемственность и тот самый Nethack.
Одна из идей - перенести все по функциям руками в асм. Это даже не то чтобы сложно, просто трудоемко и потом тяжело редактировать, если появится новая идея. Может быть, как-то автоматизировать получится, или взять асм с макросами.
Ответить в тред Ответить в тред

Check this out!

Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов