Компилируем первый NetHack 881857 В конец треда | Веб
В этом тредике компилируем 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 с оверлеями,
то есть возможностью выгружать и подгужать отдельные модули логики.
2 881859
бамп амулетом йендора
1648042366317.png75 Кб, 1133x342
3 881877
Ухх могли деды, мощно.
4 881887
>>881877
Что происходит на пике?
5 881888
>>881887
происходит sprintf
6 882010
Часов 6-8 сегодня ушло на отладку.
В письмах есть инфа что эти исходники еще довольно багованные.
Одна проблема была в том, что для древнего компа игра и генератор разделены на две программы.
Но в сохранения пишутся указатели, что приводит к мусору при загрузке.

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

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

Следующие багфиксы по плану
-Генерить новый уровень при спуске по лестнице.
Видимо, после рефакторинга где то надо создавать файл с новым именем.
-Встречаются только летучие мыши (нулевой монстр).
До рефакторинга попадались кобольды и хобгоблины.
-Изменить шаблоны printf на более современные.
Можно взять из более поздних версий.
-Еще падает таблица рекордов.
-Сохраненный уровень с магазином упал, скорее всего не загрузился продавец.
-Покупка, похоже, тоже не работает.
1628179693604.png5 Кб, 348x48
7 882036
Суровая игра проверяет что сейчас рабочее время, а не выходные.
8 882073
В основном сейчас кусаются две проблемы.
1) Функции без прототипов. Компилятор встретив функцию думает что это int foo(), а на самом деле она может быть char* foo().
2) Указатели в сейве. Пришлось временно отключить сохранение списков строк, потом надо тоже порефакторить.

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


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

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

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

>Компилятор встретив функцию думает что это int foo(), а на самом деле она может быть char* foo().


Сейчас подумал, что тут проблема, скорее всего, в 64 битном указателе, ведь он не влезает в int.
В отладчике я видел обрезанные значения, типа 000000005555fa90 вместо 000055555555fa90. Очевидно, в их время int проблемы не вызывал.
1539107871840.png16 Кб, 658x496
11 882117
Поправил еще пару NULL, теперь можно ходить вверх вниз по лестницам, пока что критичные баги закончились.
Из предыдущего списка осталось только таблицу рекордов поправить.
Конечно, в процессе могут найтись еще.
1570338781320.png32 Кб, 688x233
12 882118
А, на самом деле и таблица рекордов починилась.

Заметил, что персонажа есть только сила. Оказывается, остальные (ловкость, интеллект и т.д.) только в NetHack 3.0 добавили.
13 882218
Анонче, есть ссылка на твой реп с фиксами или исходниками от автора? сам хочу поковыряться
14 882227
Единственный интересный тред на доске.
15 882231
>>882227
Не знаю что ты нашел интересного. Я вот вообще нихуя не понимаю, что это за игра, как должна играться, и кто её сделал? Это мод на уже готовом, или что?
16 882236
>>881857 (OP)

>Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки



Он имел в виду - удачи дозвониться, т.к. телефонная линия занята либо модемом, либо младшей сестрёнкой.
17 882286
>>882218
Почему бы и нет
https://anonymfile.com/m1351/hackjf.zip
Там гит с 3 коммитами - оригинальные исходники, минимальные фиксы чтобы компилировалось, более-менее рабочая версия.
Лицензии на эту версию нет, но потом стала GPL
18 882287
>>882286
Алсо она работает на линуксе, если на винде надо еще какие-то изменения из поздних нетхаков брать, переводить на ncurses
1562720028873.gif200 Кб, 540x300
19 882288
>>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 команд.
И в сторону взаимодействия всего со всем. Макать стрелы в бутылочки с ядом, кидать бутылочки в монстров, приносить трупы в жертвы богам, превращаться в разных существ и получать их способности, заматывать глаза полотенцем чтобы не ослепнуть от вспышки.
В инете много инструкций к прохождению, они состоят из описаний наподобие: свиток телепортации сможет перенести вас на дргой этаж, но только если он был проклят или вы контужены когда читали.
20 882289
>>882218
Сами исходники я брал по ссылками с вики
https://nethackwiki.com/wiki/Jay_Fenlason%27s_Hack
И потом распаковывал, что-то патчил руками. Благо они просто как текст емейла рассылались.
Самые доступные исходники это наверное hack 1.0.3
Потому что они в линуксе лежат в пакете bsdgames
И их можно скачать командой apt get sources
21 882299
>>882288
сколько же там говнокода, уффффф
22 882309
>>882299
Не так уж и много. В PDP версии 9900 строк, в 1.0 - 13400, в 1.03 - 19500, в nethack1.3d - 26200
На самом деле не такой там и говногод, особенно учитывая что писали школьники, и на древних компах.
Архитектура да, страдает, но опять же у них из удобных инструментов были только тетрадки для рисования схем.
А так, даже интересно изучать развитие архитектуры. Захотел новый вид комнаты или действие - впендюрил в свитч, потом потомки пустай обобщают и переносят в другой файл.
1617832460439.png119 Кб, 1329x616
23 882310
Тем временем, начал переносить код на C64.
Генератор комнат и коридоров, похоже, отработал успешно.
Буду добавлять фичи по частям, пока память не кончится, потом пооптимизирую раза в 2.
Надо дописывать нехватаюшие вещи на ассемблере.
24 882313
>>882288
Позволь тогда нескромный вопрос, а какой смысл от этой игры сейчас? Зачем она нужна?
Как история окей, но кто будет играть в это?
25 882349
>>882313
В сам нетхак вполне себе играют.
Например, распространены публичные серверы, где спидранеры стараются попасть в онлайн таблицу рекордов.
Вот например график с одного такого. Похоже что онлайн стабилен И список последних игр.
Конечно, более современные рогалики, такие как Brogue и Dungeon Crawl Stone Soup, постепенно стали более популярными.

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

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

Конкретно первая версия имеет больше исторический и исследовательский интерес. Конкретно мне интересно, что с ней можно сделать современными инструментами компиляции, на что есть намек в посте выше.
26 882351
>>882349

>умер, поскользнувшись, пытаясь оседлать пони


>убит хамелеоном, имитирующим вихрь энергии


По-моему, уже этого достаточно, чтобы понять, почему люди продолжают в нее играть.
1679014124368.png25 Кб, 716x537
27 882717
Много занимался, но прогресс пока небольшой.
Приближаюсь к моменту когда начнет ходить по пустым комнатам.
Много времени ушло еще, потому что делал временный режим вывода в половинные символы в битмап. Потом переделывать на скролл, но сейчас для простоты чтобы игра выглядела 1 к 1 как на Пеке. Пока решил переносить, а фичи новые не пилить, чтобы не вносить новых багов пока не закончу перенос. Но все же добавил миникарту, потом будет нужна.
Из веселого была борьба с компилятором, который оказывается менял состояние процессора после загрузки. В результате часть памяти не менялась, хотя я в нее пишу, а часть наоборот менялась сама, потому что там оказался стек и куча, а часть перезаписывалась поверх.
Еще прикрутил упаковщик. Вообще он не нужен на этом этапе, но вроде бы загрузка и распаковка быстрее чем загрузка несжатого. Но скорее всего можно ускорить загрузку на эмуляторе и без этого. Включив какое нибудь ускорение или вообще снепшот загружать.
Отладка сейчас уже неудобная. Уже сложно соотносить Си и ассемблер, да и отладчик будет только по ассемблеру ходить. Писать свой не хочу. Отлаживаю принтами, бесконечными циклами, расставляя методом бинарного поиска. Так ищу точку после которой происходит порча памяти.
28 882718
>>882717
Еще из забавного - не хотел тратить время на рисование шрифта, взял за основу готовый. Но некоторые символы надо было поправить. Оказалось, что проще всего такие маленькие символы отредактировать прямо в 16-ричных цифрах.
Все очевидно же, символы 3 на 6, значит
7 это 1+2+4 то есть ###
5 это 1+4 то есть # #
И так далее.
Символы продублированы чтобы не делать сдвиги которые на 8 битных медденные. Но это за счет лишней памяти, пол килобайта. Вообще сам видеорежим битмапа лишние 8 кб жрет.
Потом все таки переделаю на скроллинг, опять же тогда потенциально можно думать о спектруме и денди - у них экран только 256 в ширину, а не 320, а значит 80 символо все равно не влезет, только 64. К тому же в таком режиме не получится нормально раскрашивать буквы - ведь можно раскрасить только клетку с парой букв.
1573210582114.webm63 Кб, webm,
700x500, 0:29
29 882739
И, оно работает! Пока пусто, нет предметов и врагов, но ходить уже можно, дверки открываются, в стены упирается.
30 882740
оп, а добавь возможность грабить корованы
31 882745
>>882739
Нихуя ты баклажан.
32 882748
>>882349
Лично я не понимаю, зачем при наличии даже не простых игр которые клепают студии, а весьма интересных инди в количестве овер 100500 штук играть в такое.

>В сам нетхак вполне себе играют.


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

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

Может расскажешь за какие-то уникальности которые хочешь сделать? Просто бродить, драться это весело, но интересуют именно уникальные фишечки.
33 882793
>>882748
Честно говоря, сложно ответить что-то больше, чем было в предыдущем ответе и названии треда.
Ты как будто пытаешься бежать впереди лошади и переживаешь о несущественных на данном этапе вещах.
Может быть, ты невнимательно читал, сейчас все на стадии как и что урезать, где найти 2 килобайта чтобы влезли объекты, а монстры еще даже не близко. А ты каких то игроков ищешь, доавление новизны, и конкуренцию с ААА играми.
1540500492959.png19 Кб, 631x436
34 882808
Начал добавлять минимально объекты, их подбор.
Память уже заканчивается, дальше надо брать лопату в руки, 8 кб еще можно выжать, но надо будет написать свои принтфы, а дальше смотреть в ассемблер и разбираться как помогать компилятору си оптимизировать.
Но я думаю что эту версию все таки получится втиснуть с монстрами без большой крови. А вот с последующими уже интересно.
35 882837
>>882748
А вообще, что ты предлагаешь? Делать свой клон но с нескучными твистами? Типа как есть куча рогаликов, но не про фентези. а про скайфай или думгая? но они редко взлетают выше оригиналов.
Да даже у самого нетхака есть моды и форки с ребалансом, но они менее популярны
Я видел кто то делал клон цивы на C64, но он конечно писал с нуля и с учетом платформы. Но писать все вручную и продумывать новые механики с кучей взаимодействий - это все же сложнее, чем оптимизировать готовый код, и займет времени намного больше, а будет ли заметно - еще вопрос, а так сразу несколько комьюнити порадуется, и 8-битных компов, и нетхака, и компилятора.
https://www.youtube.com/watch?v=iHA2Qvah0uM
36 882840
>>882837

>А вообще, что ты предлагаешь?


Я ничего не предлагаю. Если прочитаешь беседу сверху то поймёшь суть.
1659422636296.webm181 Кб, webm,
700x500, 0:58
37 883036
Отрефакторил некоторые моменты платформы.
Выкинул полуширинный битмап и шрифт, как и задумал.
Теперь есть псевдоскролл, который показывает левую или правую половину уровня, и миникарта.
Потом можно сделать скролл поумнее, который центруется на персонаже.

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

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

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

Осталось до начала суровых оптимизаций: 16кб.
Пока рано об этом думать, но получится ли всунуть минимальный хелп? Звуки? Процедурную музыку? Хотелось бы 2 кб на такое оставить.
1636402768367.mp417,5 Мб, mp4,
650x480, 2:21
38 883308
Сегодня лень что-то делать, бампану процедурной музыкой для вдохновения.
1643755346986.png20 Кб, 706x516
39 883367
Провел немного невидимой работы по оптимизации
1. Еще разок переписал printf. В общем игре не нужен универсальный форматтер. Карта рисуется putchar, а printf нужен в основном для паддинга цифр в интерфейсе.
Но вывод цифр я могу сделать быстрее, чем стандартный itoa, к тому же у меня не терминал, я могу сам управлять позицией вывода. Сэкономлен ~1кб
2. Вспомнил дедовский способ компиляции - сначала слить cat все .c исходники в один файл. LTO (оптимизация во время линковки) делает хорошую работу, но так у компилятора еще больше простор для оптимизаций. Сэкономлено 2кб.
Также это пригодится для cflow которой я хочу построить граф вызовов и найти рекурсивные функции. От них надо избавиться или хотя бы пометить остальные как non-reentrable. Это поможет компилятору не выделять для них лишние временные переменные на стеке.
3. Пересмотрел распределение по банкам памяти. Теперь игра работает без отключения прерываний (это понадобится когда я доберусь до записи/загрузки с диска и музыки) и меньше дрочит переключение банков памяти.
На этом я потерял 4кб, так что в сумме 0. Эти 4 кб резеврные, ими теоретически можно воспользоваться, но постоянно включать-выключать банки памяти. Может быть буду хранить там какие то редко используемые данные.
40 883370
>>883308
Как можно просто сделать с помощью нейросетки или другим средством такую дженерик музыку фоном? Для своих игр бы использовал.
41 883373
>>883370
Про нейросетки не знаю, то один гений делал - у него вся музыка и арт уместилась 256 байт. Нейросетке хз сколько гигов на такое понадобится.
42 883374
>>883370
Вот этого собираюсь посмореть.
https://www.youtube.com/watch?v=cQqEFNVPD1s
https://www.youtube.com/watch?v=p-lNcpb5ZwE

>Fast forward several years, I started writing my own game engine for unrelated purpose


Лол.
43 883565
Включил базово действие атаки, и теперь можно ходить и крошить монстров, которые честно загружены.

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

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

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

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

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

Буду пореже писать, в планах доотлаживать монстров, и в принципе это близко к минимальной демке которую я хотел. Дальше конечно можно годами улучшать, оптимизировать, переписывать части на ассемблере.
44 883567
>>882717

>скорее всего можно ускорить загрузку на эмуляторе


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

А, вспомнил, я еще планирую выкинуть malloc. И попробовать массивы структур, под монстров, под объекты и так далее.
45 883659
Мне больше форк UnNetHack нравится. Как раз сейчас перевожу ее на русский язык.
46 883663
>>883659
Форков много, даже попадались рейтинги (субъективные).
Вот например https://www.reddit.com/r/nethack/comments/w1m1bm/ascending_every_nethack_variant_my_review/
С другой стороны он низко оценил SporkHack, а в другом месте его наоборот нахваливали.
Так что, видимо, это вопрос вкусов.

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

Любопытно, что они прямым текстом делали отсылки к D&D. Например, сила выражалась в 18/99. Или, например, классические монстры. Да и вообще сама атака похожа на бросок d20 и THAC0.
47 884441
ОП ну что там, игра делается? Или что?
48 884495
>>882748
Фишка конкретно Nethack - это, как уже ОП сказал, огромный упор на интерактивность и взаимодействие с предметами и монстрами. Например, ты можешь написать на полу "Elbereth", и тогда монстры не будут тебя трогать, пока ты стоишь на этом квадрате, но если ты писал пальцем в пыли, то надпись быстро сотрется, а кинжалом ее ковырять ужасно долго и кинжал после этого затупится в говно, а можно взять волшебную палочку огня и выжечь надпись, но на это тратятся заряды. Если найти эльфийский кинжал, то можно назвать его "Жало" и тогда он превратится в артефакт с бонусом против орков, но тогда другие артефакты тебе будут реже попадаться, а они получше будут. А если макать меч в фонтан, то он может превратиться в Экскалибур, а может заржаветь. А можно найти в подземелье кухонную раковину и пинать ее, тогда тебе напишут "Вернулась посудомойка", придет суккуб и можно ее выебать и получить рандомный бонус, при этом она тебя будет раздевать, и если это займет слишком долго, то она перехочет ебаться, а если у тебя есть в инвентаре кольцо привлекательности, она попытается на тебя его надеть, а если твой персонаж - телка, то придет инкуб. Только вместо тянки из раковины может вообще вылезти черная слизь и ты заебешься с ней воевать. И такого там дохуя:
https://tvtropes.org/pmwiki/pmwiki.php/DevelopersForesight/NetHack
49 884518
>>884441
Разработка ведется, но времени стало меньше, задачи сложнее, так что писать буду реже.

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

Заметил несколько проблем, требующих много отладки. Ловушки пока зависают, монстры не ходят, при этом не удаляются после смерти, проблемы с надписями в верхней строке, при беге не перерисовывается миникарта.
Осталось памяти - неизвестно, почти нисколько.
1569249386290.png15 Кб, 396x131
50 884572
Ошибка "program disorder" оказалась ложной, когда отлаживал, забыл заключить блок в фигурные скобки.
Тут бы помогло предупреждение от компилятора, но на такой старой кодовой базе их слишком много, чтобы искать в этом шуме.
51 884704
Первая проба в процедурной музыке
52 884718
>>884704
лучше кадилак на фоне чем эта какафония
53 884753
>>884718
Да фильтров сверху навернуть и збс
54 885304
Доработал скрипт, который измеряет сколько еще свободного места остается. Полистал листинг ассемблера. И, как и думал, нашел штуку которая освободила кучу места.
Это был инлайн rand(). В рогалике, где рандом вызывается сотни раз, и это не преувеличение (поиск показал 363).
8 килобайт как с куста, приятно.
55 885305
>>885304
Вообще интересно, что компилятор это профукал. 8000/343 = 22 байта, наверное посчитал что мелочь, недостойная флага оптимизации -Os
1595590946985.webm169 Кб, webm,
700x500, 0:58
56 885311
А это значит, что шоу продолжается.
Добавлен инвентарь, подбор предметов, сброс предметов, смена оружия.
Вылезли какие-то проблемы в printf/atoi, так что цифры пока печатаются неверно, потом буду разбираться.
57 885476
Молодцом оп.
А куда и как ты картинку выводишь?
1587380514619.webm125 Кб, webm,
700x500, 0:59
58 885509
>>885476
Если вопрос про разработку, то это просто эмулятор. Мой комп давно навернулся, сейчас бы я его починил. но он остался в другом городе, не факт что сохранился.
А покупать пока не хочется, оригинальные спектрумы и коммодоры стоят 10-20к рублей (а еще надо кардридер вместо дисковода). Конечно, потом хотелось бы проверить на реальном железе, но эмуляция на высоте, очень точная.

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

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

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

Хотел написать скроллинг, но закопался, там надо вообще все переделывать, плавный скролл всего экрана и выводить только новый столбец, иначе все тормозит или мигает, или забывает обновиться, даже мигающий курсор становится нетривиальным.
Пока оставил простой вариант, в завимости от положения игрока, рисуется левая, правая часть или центр.
59 885654
Освободил 0.4кб переставив поля в структуре
Сама структура, понятно, меньше места занимать не стала.
А вот код явно упростился, даже без заглядывания в дисассемблер понятно, что в первом случае надо сделать 5-10 лишних команд - сдвинуть, сделать AND с маской и OR со сдвинутым вторым байтом. И это при доступе к каждой клетке поля.
1683220788571.png56 Кб, 542x430
60 885655
>>885654
Прошелся по аналогичным местам и освободил еще 1кб. Вот так бывает, думали что экономят 5 бит, а на деле потеряли на несколько порядков больше.
hqdefault.jpg12 Кб, 480x360
61 885695
>>885654

>Освободил 0.4кб переставив поля в структуре


Я всегда считал что в структурах не происходит оптимизаций, выравниваний и всяких перестановок. В плюсах есть даже такое понятие POD (Plain Old Data). Может ты с ключами оптимизации что-то перемудрил? Не должно же по идее такого происходить
62 885696
>>885695
>>885654

>Сама структура, понятно, меньше места занимать не стала.


Я в глаза долблюсь. Вопрос снят
63 885698
>>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
И поскольку доступ к переменной напрямую, без геттера или проперти, то такое компилятор инлайнит на каждый доступ.
64 885699
>>885698
Ну и да, компилятору скорее всего нельзя переставлять поля местами, потому что вдруг программист обратился ко второму байту структуры по указателю.
65 910544
>>881857 (OP)
Тоже занимался подобными вещами. Только я не пытался сделать прямой форк, а старался из кода rogue и нетхака использовать только то, что мне нужно. В итоге все равно наизобретал велосипедов. Тоже все хочу сделать что-то под спек и нес, но скиллов маловато. Все безбожно тормозит и не влезает

> -Насколько сильно изменился Си со времен K&R, ведь можно было как в питончике вызывать необъявленные


> функции, не писать типы переменных и возврата.


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

> -Как вообще у олдов что-то работало с таким количеством СегФолтов и без тестов


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

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


На спеке никто особо не пытался писать на сишке, писали на асме. Ну и рогалики это гиковская, не спековская тема. Просто культура другая, на спеке больше по аркадам, причем до сих пор. За коммодор не скажу, но наверно что-то подобное

> -Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки


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

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

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

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

>>881857 (OP)
Оп, раз уж ты забросил это все. Не мог бы ты выложить свои наработки? Хочется увидеть как должен выглядеть нормальный код под 8-бит
65 910544
>>881857 (OP)
Тоже занимался подобными вещами. Только я не пытался сделать прямой форк, а старался из кода rogue и нетхака использовать только то, что мне нужно. В итоге все равно наизобретал велосипедов. Тоже все хочу сделать что-то под спек и нес, но скиллов маловато. Все безбожно тормозит и не влезает

> -Насколько сильно изменился Си со времен K&R, ведь можно было как в питончике вызывать необъявленные


> функции, не писать типы переменных и возврата.


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

> -Как вообще у олдов что-то работало с таким количеством СегФолтов и без тестов


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

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


На спеке никто особо не пытался писать на сишке, писали на асме. Ну и рогалики это гиковская, не спековская тема. Просто культура другая, на спеке больше по аркадам, причем до сих пор. За коммодор не скажу, но наверно что-то подобное

> -Нормально ли считалось оставлять в РИДМИ адрес и телефон своей младшей сестренки


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

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

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

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

>>881857 (OP)
Оп, раз уж ты забросил это все. Не мог бы ты выложить свои наработки? Хочется увидеть как должен выглядеть нормальный код под 8-бит
1635223323630.png318 Кб, 474x355
66 910680
>>910544
Функции не объявляли по простой причине, на железе под которое изначально писалось, все аргументы int (неважно сколько их), и указатели int.

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

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

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее