[Из песочницы] История о том, как я ОС в Minecraft писал
В далеком 2011 году мир увидел такую игру как Minecraft — воксельную песочницу, где каждый творит все, что душе угодно. Спустя некоторое время народные умельцы стали писать различные модификации для нее, делающие геймплей более разнообразным. Не так давно появился мод под названием «OpenComputers», добавляющий полноценные компьютеры, программируемые на скриптовом языке Lua. И в этой статье я хочу поделиться с вами небольшим опытом, приобретенным при изучении этого крайне интересного мода.
Изучаем мод
Если поставить перед собой компьютер и установить на него стандартную консольную ОС с местных дискет, то можно слегка разочароваться в функционале мода. По сути на старте мы имеем командую строку с довольно противно выглядящим интерфейсом, имеем набор стандартных команд по типу ls, edit, remove или mkdir .
Меня все это дело решительно не устраивало, и я решил добавить более приятные цвета к консоли и русифицировать подсказки для мода, благо автор позволил нам редактировать исходный код всех его наработок. Позже я стал писать всякие мелкие программы для контроля дверей или освещения в доме, но все это отдавало душком скуки и простоты. Хотелось хардкора!
Постепенно изучая местные библиотеки и особенности Lua, мы с моим другом смогли делать простенькие GUI-приложения. Пошарив по всяким википедиям, мы нашли несколько алгоритмов работы с цветом — например, для преобразования цвета из RGB в HSB формат или для наложения одного цвета на другой с учетом прозрачности. Немного повозившись, мы сумели реализовать эти алгоритмы на Lua, и так появилась наша первая библиотека для этого мода, мы назвали ее colorlib, а с ее помощью мы смогли накодить вот такую симпатичную палитру:
Решив не останавливаться на достигнутом, мы подумали, что классно было бы сделать графический редактор для этого мода, а также свой формат изображения. Действительно, почему бы нет? Так мы смогли бы легко рисовать красивую графику на мониторе. Провозившись несколько дней, мой товарищ сумел реализовать грамотную структуру файлов будущих картинок, которая кушала крайне мало места на местных жестких дисках, которые, к слову, имеют ограниченный объем в 4 МБ. Аббревиатуру формата мы обозначили как ».pic», а сам формат назвали «OpenComputers Image Format», сокращенно «ocif». После всего этого мы приступили к созданию самого графического редактора, потратив на это около трех дней. В итоге мы имеем вот это:
Структуру файла .pic в шестнадцатеричном виде можно лицезреть на этой картинке:
Первым делом мы добавили в наш графический редактор самые необходимые инструменты — кисть, ластик, а также текст для создания надписей, ведь по сути мы имеем консоль, где каждый пиксель имеет три параметра: цвет текста, цвет фона и символ. Чуть позже вставили алгоритм рекурсивной заливки для более удобного создания картинок. Итак, мы имеем рабочий формат изображения, но не знаем, где его можно применять. Мы стали писать различные приложения под этот мод, например, вот такой симпатичный календарик:
Или приложение, генерирующее цифровой дождь из всем известного фильма:
В конце концов у нас скопилось столько различных скриптов и библиотек, что мы утомились загружать их вручную cтандартным методом через Pastebin.com. Да, мод имеет интеграцию с пастбином, поэтому все наши файлы мы хранили изначально на нем, загружая их по мере необходимости на компьютеры. Но учитывая количество файлов, нами было принято решение о создании программы-инсталлятора, автоматически загружающей список файлов с нашего репозитория на GitHub, а затем скачивающей файлы по списку в нужную директорию. Было довольно много геморроя с переносом файлов с Pastebin’a, но через пару часов мы управились с задачей и приступили к кодингу инсталлятора. В итоге вышло вот что:
Итак, мы уже могли кодить простые приложения с картинками, имели удобный инсталлятор для них, но хотелось чего-то большего! Идея создания операционной системы пришла как-то сама собой, и, недолго думая, я решил сделать несколько набросков иконок для будущей ОС. К примеру, вот так выглядит папка:
Нарисовав основные иконки, я приступил к созданию самой операционной системы, сразу дав ей название «MineOS». Основная концепция очень проста: в папке MineOS/Desktop/ лежат файлы любого типа. С помощью стандартной функции getFileList () мы получаем список файлов, получаем формат файла через обрезку строкового имени файла, а затем рисуем на нашем экране иконки в соответствии с полученным форматом. Вышло что-то вроде этого:
Затем я приделал нижнее меню в стиле Mac OS, добавил меню сверху, накодил библиотеку контекстного взаимодействия — и в итоге мы имеем уже нечто, достойное названия «графическая оболочка», но до полноценной ОС это пока что не дотягивало.
У всего есть свои недостатки: местные «видеокарты», предоставляемые модом, имеют ограниченное количество операций, которые они могут сделать за игровой тик. Под операциями подразумевается изменение цвета текста, цвета фона, установка символа и т.п. Нетрудно себе представить, какое количество операций требовалось на отрисовку наших картинок и уж тем более на отрисовку рабочего стола. Но самая большая печаль заключалась в том, что мне необходимо было перерисовывать рабочий стол полностью, если, например, открыть контекстное меню или запустить какой-нибудь файл. Но тут на помощь мне пришел еще один товарищ и посоветовал написать алгоритм двойной буферизации изображения. Для тех, кто не в курсе, поясню вкратце его суть: в оперативной памяти у нас находятся два массива изображения: первый содержит информацию о пикселях, которые в данный момент отображены на экране, а второй — информацию о пикселях, которые мы хотим отрисовать. Затем при помощи вызова функции расчета алгоритм сверяет эти два массива и выводит на экран не все пиксели, а только лишь измененные. А затем присваивает первому массиву значение второго.
Также в эту библиотеку я встроил несколько алгоритмов для ускорения работы местных GPU, группирующих соседние пиксели по цветам и объединяющие их в одну строку вместо поочередной отрисовки.
И только теперь моя ОС заработала как надо! Иконки рисовались практически мгновенно, с компьютером стало крайне приятно взаимодействовать. Решив не останавливаться на достигнутом, я добавил несколько функций, симулирующих прозрачность изображения, и с их помощью сумел добиться довольно красивых результатов.
Затем я накодил красивый файловый менеджер в стиле Finder из все той же Mac OS, и интегрировал его в систему. Добавил также сортировку файлов по имени, типу и дате изменения, добавил скрытие формата изображения, добавил меню «избранное». В итоге имеем следующее:
Все это уже выглядит довольно неплохо, но за мной есть такой грешок как сильная любовь к хорошей графике. Поэтому я решил добавить поддержку обоев. Вот несколько примеров:
Итак, наша ОС готова! В совокупности мы имеем порядка 28 собственных библиотек, при этом некоторые из них имеют более 2-х тысяч строк кода. Также мы имеем около 30 качественных GUI-приложений. От начала изучения мода и до нынешнего времени прошел почти год, при этом программировали мы далеко не каждый день и не каждую неделю. Таким вот образом и написалась эта операционная система, а вслед за ней и эта статья.
Как скачать?
Если вам хочется пощупать эту ОС своими руками, то милости прошу, вот краткая инструкция: ставите на землю корпус компьютера, присоединяете к нему монитор, а к монитору прикрепляете клавиатуру. Затем вставляете в корпус лучшую видеокарту, процессор, оперативную память, жесткий диск, Lua-биос, стандартную дискету с OpenOS (скриптами автора мода), а также интернет-карту (не сетевую, а именно интернет).
Затем включаете компьютер, ждете, пока система загрузится с дискеты, а затем вводите в консоль команду install. Далее выбираете цифру жесткого диска, жмете enter, и система поставится. Далее перезагружаете компьютер. Теперь ваш комп готов к установке уже моей операционной системы.
Вводите в консоль команду pastebin run 0nm5b1ju, жмете enter и следуете инструкциям на экране. Желаю приятного использования.
Итог
Зачем, собственно, я писал эту статью? Мне хотелось показать людям, что на любом языке и в любой среде можно создать маленький, не побоюсь этого слова, шедевр. Еще полтора года назад я крайне смутно представлял себе, что такое «функция», «массив» или «класс», а теперь мы с товарищами кодим собственную мини-ОС. Главное — иметь свободное время и желание его потратить с пользой и с удовольствием, лично для меня нет большего кайфа, чем кодить всякую ерунду в любимой игре. Желаю всем начинающим и не очень начинающим программистам творческих успехов!