Проект Historical Source опубликовал (https://github.com/historicalsource?tab=repositories) исходные тексты игровых приложений, выпущенный компанией Infocom (https://en.wikipedia.org/wiki/Infocom), просуществовавшей с 1979 по 1989 год и специализировавшейся на создании текстовых квестов. Всего опубликованы исходные тексты 45 игр, включая Zork Zero (https://github.com/historicalsource/zorkzero), Zork I (https://github.com/historicalsource/zork1), Zork II (https://github.com/historicalsource/zork2), Zork III (https://github.com/historicalsource/zork3), Arthur (https://github.com/historicalsource/arthur), Sh... (https://github.com/historicalsource/shogun), Sherlock (https://github.com/historicalsource/sherlock), Witness (https://github.com/historicalsource/witness), Wishbringer (https://github.com/historicalsource/wishbringer), Trinity (https://github.com/historicalsource/trinity) и The Hitchhiker's Guide to the Galaxy (https://github.com/historicalsource/hitchhikersguide).
Опубликованный код отражает срез состояния системы разработки Infocom на момент закрытия данной компании. Код предназначен для изучения методов разработки старых игр, обсуждения и исследований в области истории компьютерной техники (лицензия на код не является открытой). Разработка игр велась на мэйнфрейме c ОС TOPS20 (https://en.wikipedia.org/wiki/TOPS-20), для сборки применялся компилятор ZILCH (https://en.wikipedia.org/wiki/Z-machine).
URL: https://news.ycombinator.com/item?id=19672436
Новость: https://www.opennet.dev/opennews/art.shtml?num=50525
Теперь скоро сообщество выпустит порты этих игр на GNU/Linux, Vulkan и Wayland - это лишь вопрос времени.
Вначале консоль, работающую поверх Vulkan и Wayland, придётся допилить. Игры то текстовые.
> Вначале консоль, работающую поверх Vulkan и Wayland, придётся допилить. Игры то текстовые.alacritty
Плюсики теперь норм выглядят.
На кой хр.н там этот Vulkan, игры-то текстовые. Оно и поверх Xorg нормально побежит.
Не выпустит. Портирование на современные платформы не является "исследованием в области истории компьютерной техники", а это единственное, что они разрешили делать с этим кодом.
Почему это вдруг? Как раз портирование на какой-нибудь вулкан под холодильник - и есть исследование. А потом попытаться это продать - вот это уже запрещено.
Портировали тыщу лет назад.
Уже и на Расте запилили. С голосовым управлением и поддержкой WASM прямо в браузере.
Ура, товарищи!
p.s. новый дизайн - отстой.
Ну вот Zork (кажется весь) доступен на GOG, интересно, есть ли шансы получить нормальный обновленный билд под современные системы?
Хмм, посмотрев поближе на то, что выложено в Гитхабе напрашивается вывод, что нет.
Да ладно, всё не так плохо. Там внутре lisp, только он вместо () иногда использует <>. Всё что надо, это написать к нему read, а затем научить современный лисп работать с теми сорцами.Например:
<DEFINE20 PSEUDO ("TUPLE" V)
<MAPF ,PLTABLE
<FUNCTION (OBJ)
<COND (<N==? <LENGTH .OBJ> 3>
<ERROR BAD-THING .OBJ PSEUDO>)>
<MAPRET <COND (<NTH .OBJ 2>
<VOC <SPNAME <NTH .OBJ 2>> NOUN>)>
<COND (<NTH .OBJ 1>
<VOC <SPNAME <NTH .OBJ 1>> ADJ>)>
<NTH .OBJ 3>>>
.V>>Тут сложно сказать, что к чему -- макрос это объявляется или функция? если функция, то к чему , перед PLTABLE? И что значат точки -- это такой способ вызывать symbol-value? Но так или иначе, мне кажется, что если пару дней поломать голову над этими сорцами, то можно понять что к чему, и ещё за пару дней написать подходящий lisp, который это сможет прожевать. Потом, правда, можно отлаживать это всё месяц, но это другой вопрос.
А если вместо того, чтобы ломать голову над сорцами найти мануал к тому lisp'у, на котором всё это написано, то можно отлаживать не месяц, а за пару недель справится. Или даже быстрее -- сложно сказать. Главное писать на lisp'е, не переизобретая lisp. Не важно на каком -- common lisp, scheme, racket, elisp -- главное на lisp'е. Потому что если не на lisp'е, то придётся начать с написания lisp'а. То есть, в любом случае придётся начать с написания lisp'а, но написать lisp на lisp'е -- это как два пальца об асфальт, а вот на C написать лисп -- это уже хороший такой студенческий проект для постижения дзена.
> на C написать лисп -- это уже хороший такой студенческий проект для постижения дзена.Ну это вы загнули. Лисп тем и отличается от языков со сложной грамматикой и хитростями, что его базовый интерпретатор написать несложно всегда, и вам не нужен для этого лисп. На C не то чтобы сильно сложнее (чуток заморочек с токенизацией и управлением памятью, но ничего особенно сложного там нет).
В качестве доказательства гуглится, например, это: https://carld.github.io/2017/06/20/lisp-in-less-than-200-lin...
Да, ограничено, но тем не менее. А если взять язык выше уровнем, типа питона то на нем вообще халява.Между прочим, "напишите реализацию лиспа (либо пролога)" на каком-нибудь языке (а можно просто каждого из них на другом) это вполне стандартное задание в рамках курса, где учат лисп (напр. матлогика в университете). И никакого "постижения дзена", обычное задание.
PS а для ответа на вопрос о том, что тут объявляется, можно смотреть спецификацию языка MDL: https://en.wikipedia.org/wiki/MDL_(programming_language)
>> на C написать лисп -- это уже хороший такой студенческий проект для постижения дзена.
> Ну это вы загнули. Лисп тем и отличается от языков со сложной
> грамматикой и хитростями, что его базовый интерпретатор написать несложно всегда, и
> вам не нужен для этого лисп. На C не то чтобы
> сильно сложнее (чуток заморочек с токенизацией и управлением памятью, но ничего
> особенно сложного там нет).
> В качестве доказательства гуглится, например, это: https://carld.github.io/2017/06/20/lisp-in-less-than-200-lin...
> Да, ограничено, но тем не менее.Ну это *очень* ограничено. Во-первых, в глаза бросается, оно без сборки мусора, то есть заполняет память пока не упадёт с ООМ. А сборка мусора -- это значит выкидываем libc'овый malloc, расчехляем mmap и пишем свой аллокатор. Во-вторых, там нет очень многих вещей, которые для лиспа -- норма. Скажем целочисленных значений, массивов, хештабличек, компиляции/оптимизации -- оно ж убъётся что либо делать в том формате, в котором есть, и например к любой локальной переменной добираться через поиск этой локальной переменной по имени списке. Это может и мелочи, но этих мелочей наберётся, и однобитного тега уже не хватит, придётся держать там один бит под сборщик мусора, пару бит под тег (на 64-битной платформе проще, там больше ненужных битов в указателе, можно хоть все встроенные типы закодировать тегом), и в этой паре одно из значений будет намёком на то, что объект содержит в себе ссылку на другой объект, который определяет тип этого объекта. Это может быть просто символ, скажем 'integer, или 'float, хотя под int, как правило, всё же выделяют специальное значение тега, и оставшиеся биты "указателя" используют как значение этого int'а, чтобы не выделять из кучи место под каждый int. Но тут встаёт вопрос о том, что хотелось бы в int'е иметь максимум битов свободными, и тут мы приходим к сложному кодированию для тега (мультибитному -- переменному числу бит на тег), чтобы int определялся бы одним битом, а остальные типы больше использовали бы. Аррргх... Это очень любопытно всё собрать воедино и заставить работать.
> А если взять язык выше уровнем, типа питона то на нем вообще халява.
Ну да, я согласен, я как-то забыл случайно про то, что помимо lisp'а бывают и другие языки со сборкой мусора и динамической типизацией, которые могут снять все основные замороки и свести таким образом написание lisp'а, по-сути, к написанию парсера.
> Ну это *очень* ограничено. Во-первых, в глаза бросается, оно без сборки мусора,
> то есть заполняет память пока не упадёт с ООМ. А сборка
> мусора -- это значит выкидываем libc'овый malloc, расчехляем mmap и пишем
> свой аллокатор. Во-вторых, там нет очень многих вещей, которые для лиспа
> -- норма. Скажем целочисленных значений, массивов, хештабличек, компиляции/оптимизации
> -- оно ж убъётся что либо делать в том формате, в
> котором есть, и например к любой локальной переменной добираться через поискЭто так, но... если с практической точки зрения в этой задаче - сколько там памяти может захотеть программа 80 года, работавшая на 8-битных железках с 64 КБ памяти? Мусор можно не собирать, а хэштаблицы и оптимизации для кода, который мог выполняться на 1 МГц процессоре?
> сколько там памяти может захотеть программа 80 года, работавшая на 8-битных железках с 64 КБ памяти?Сложно сказать. Тут можно только приблизительно прикинуть. Допустим вызовы функций в среднем имеют один аргумент. Допустим что это приводит к выделению одного cons из двух указателей, то есть 4 байта. Это значит, что 256 выполненых вызовов функций отожрут 1Kb под мусор. Имея гигабайты памяти можно перетерпеть.
> Мусор можно не собирать, а хэштаблицы и оптимизации для кода, который мог выполняться на 1 МГц процессоре?
Именно поэтому я и говорю, что надо писать на lisp'е. Рассуждения вида "если оно не тормозит, значит можно сделать тормознее" и приводят к тому, что сегодня тормозит всё. Если писать на lisp'е, ты получшь хэштаблички, оптимизирующую компиляцию в native код, сборку мусора и все прочие плюшки бесплатно, просто потому, что ты пишешь lisp на lisp'е, то есть компилируешь один lisp в другой lisp. Отказываться от бесплатных плюшек и писать на C, просто потому что можно сделать тормознее?
С другой стороны, что любопытно, современный lisp (типа sbcl, например) отожрёт больше памяти чем весь этот zork без сборки мусора. Там речь пойдёт про десятки мегабайт потребляемой памяти. Я думаю, меньше не выйдет. И вот это реально делает кейс интересным. Провоцирующим когнитивный диссонанс.
> в глаза бросается, оно без сборки мусораНу, для этого, в принципе, можно просто libgc взять.
> Скажем целочисленных значений
gmp
> массивов, хештабличек
Массивов не было в scheme ... очень долго.
> оно ж убъётся что либо делать в том формате, в котором есть, и например к любой локальной переменной добираться через поиск этой локальной переменной по имени списке.
В конце 80-х так и делали, посмотрите на какой-нибудь siod 1.x. Тоже сейчас можно заменить, используя какую-нибудь готовую библиотеку.
Короче, действительно ничего сложного - в заявленный объем вполне могла влезть реализация scheme с define/set!, if, quote, lambda и даже макросами.
> Массивов не было в scheme ... очень долго.
> В конце 80-х так и делали, посмотрите на какой-нибудь siod 1.x.
> Тоже сейчас можно заменить, используя какую-нибудь готовую библиотеку.И мне будут рассказывать, что Electron -- это бездарное разбазаривание ресурсов...
Это можно записывать как признание в том, что electron - студенческая поделка?
"Electron -- это студенческая поделка" -- это заявление, которое имеет очень косвенное отношение к тому, чтобы отразить реальное положение дел. Это заявление преследующее политическую цель, опорочить в глазах других социальное явление, которое кому-то там не по душе. Это заявление, чья цель -- навязать другим свои личные предпочтения. Предлагать мне согласиться с заявлением сделанным в политических целях -- совершенно бесполезно. С политическими заявлениями вам лучше в госдуму, туда в это сборище неудачников, вышвырнутых из уважаемых профессий за профнепригодность.
> Это заявление преследующее политическую цельЭто была шутка.
> это сборище неудачников, вышвырнутых из уважаемых профессий за профнепригодность.
Чтоб я так жил, как эти неудачники.
>> Это заявление преследующее политическую цель
> Это была шутка.Если это была шутка, это не значит, что это была не политика. Я бы сказал наоборот, что это скорее свидетельство в пользу политичности заявления, нежели против неё.
https://lesswrong.ru/w/%D0%A4%D0%B0%...
>> это сборище неудачников, вышвырнутых из уважаемых профессий за профнепригодность.
> Чтоб я так жил, как эти неудачники.Неужели у тебя в жизни всё так плохо? Любимая работа, любимая женщина, план как захватить мир и работа над ним -- неужели у тебя нет всего этого? А если есть, то зачем тебе жизнь политика, сводящаяся к тому, чтобы лизать задницу нужным людям, избегать бесполезно ссориться с ненужными людьми, и демонстративно воевать с теми, с кем выгодно воевать? Зачем тебе нужна жизнь человека, который продал душу PR'у и теперь шагу ступить не может самостоятельно?
> Неужели у тебя в жизни всё так плохо? Любимая работа, любимая женщина,
> план как захватить мир и работа над ним -- неужели у
> тебя нет всего этого?У меня есть еще нелюбимая работа, чтобы обеспечивать весь этот сабж и не сдохнуть при этом с голоду.
Впрочем, хватит оффтопика. Табличку сарказм я все-равно дома забыл.
>А сборка мусора -- это значит выкидываем libc'овый malloc, расчехляем mmap и пишем свой аллокатор.О как, а мужики-то и не знали, что делать GC-кучи на malloc оказывается нельзя
>>А сборка мусора -- это значит выкидываем libc'овый malloc, расчехляем mmap и пишем свой аллокатор.
> О как, а мужики-то и не знали, что делать GC-кучи на malloc
> оказывается нельзяРасскажи им обязательно, что glibc'овая куча даст им лишь ненужный оверхед. В качестве бесплатного бонуса mmap'а они могут получить возможность контролировать раскладку памяти и выдерживать во всех указателях часть битов константными, а это значит их можно использовать под что-то ещё.
И ещё скажи им, что харе пиво бухать в рекламе, вместо самообразования, тогда реже придётся сталкиваться с ситуаций "а мы не знали".
10 правило гринспена (есть на вики):Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.
--
В том числе и сам COMMON LISP.
Ждьом появления в Steam со скидкой...
ftp://ftp.ifarchive.org/
> лицензия на код не является открытойНу народ…
На ifarchive.org и его зеркалах туча реализаций в т.ч. инфокомовских игр.
Какая-то феноменальная жадность - код, которому от 40 до 50 лет и который, по сути, является давно протухшим никому не нужным говном мамонта, все равно прятать за проприетарной лицензией.Я этого не могу понять никак.
>The source code was contributed anonymouslyможно предположить, что до копирайтодержателей достучаться - задача для частного лица невыполнимая. При этом один из них может оказаться "феноменально жадным" и аннулировать согласия, полученные от всех остальных.
Студентам за зачет ) Быстро конвертируют на благословенный Rust/Go
Фу, Кеша, и ты туда же. Я о тебе лучше думал.
Дружище, это был сарказм ) Я не туда же! Ни в коем случае! ;)
а текстурки как всегда зажмут.
Какие там ваще текстурки, почитай новость внимательнее, г-н Неадекват.
> а текстурки как всегда зажмут.В смысле – буковки будут в виде голой сетки каркаса?
______ ______ ______ __ __ __
/\___ \ /\ __ \ /\ == \ /\ \/ / /\ \
\/_/ /__ \ \ \/\ \ \ \ __< \ \ _"-. \ \ \
/\_____\ \ \_____\ \ \_\ \_\ \ \_\ \_\ \ \_\
\/_____/ \/_____/ \/_/ /_/ \/_/\/_/ \/_/
0_o
> компанией Infocom, просуществовавшей с 1979 по 1989 годReturn to Zork
Publisher: Infocom
Release: September 15, 1993Поясните
> Return to ZorkХорошая была игра. У меня фирменный диск есть.
вики пояснит
В 1986 году компания была скуплена, в 1989 расформирована, от неё осталась только торговая марка.
В опенсорсе всегда есть во что поиграть!
Не во что, а с чем.