Дневник разработчика ПК Версии

На данный момент Petter ведёт разработку ПК версии Cell lab, последние новости можно узнать на официальном сайте Cell lab. Ниже будут предоставлены переводы всех постов (скоро).

## Devlog разработки ПК версии Cell lab

##### Запись 1 (2020-?-?)

Была настроена некоторая базовая структура, а графика и логика работают так же, как в версии для Android. Я решил использовать LWJGL для графики и сам реализовал графический интерфейс, что бы мои возможности небыли ограничены какой-либо библиотекой, которую я плохо понимаю. Это было большой проблемой для Android с множеством трудоемких ошибок с графическим интерфейсом. Я сделал несколько базовых классов для кнопок и тому подобного и добавил некоторые настройки для редактора субстрата, чтобы опробовать его. Я также добавил несколько новых графиков, которые показывают статистику субстрата с течением времени.

##### Запись 2 (2020-?-?)

Я начал работать над редактором генома. Он будет сильно отличаться от версии Android:

* Многие просили числовой ввод. Ввод текста сложно реализовать с таким количеством функций, как end, ctrl-a, ctrl-c и многими другими, зависящие от платформы. Я буду реализовывать только некоторые из них.
* Разные настройки разделены на вкладки.
* Предварительный просмотр ячеек в выпадающем списке (теперь это было тривиально, поскольку графический интерфейс полностью основан на OpenGL).
* Добавлены кнопки отмены действия / возврата.
* Было добавлено дерево геномов, который значительно упрощает навигацию.

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

##### Запись 3 (2020-12-6)

Я начал писать скрипты. Они будут использоваться для реализации уровней что бы не засорять код Cell lab разными проверками и изменениями под каждый тип задачи. Раньше прошлый метод не был на столько плох, но этот гораздо лучше, так как игроки смогут сами создавать и решать задачи выходящие за рамки простого подсчета общего количества клеток и так далее. Я думаю, что в долгосрочной перспективе это позволит создавать гораздо более интересные задачи, сохраняя при этом чистоту кода Cell Lab. В первом релизе я сосредоточусь на создании задач и руководств с использованием скриптов. Но в будущем они будут больше похожи на моды, позволяющие запускать моделирование и выводить статистику в файлы или в некоторой степени изменять поведение клеток.

Я остановился на языке программирования Lua и библиотеке Java LuaJ. Раньше я не использовал этот язык, но похоже, что это стандарт для создания очень простых скриптов в играх. Теперь я имею достаточно функциональности для создания задачи «Макрофаги 3». Скрипт Lua для нее приведен ниже, надеюсь, он не требует пояснений. Он может быть изменен, дайте мне знать на форуме, если у вас есть предложения :).

```
-- Challenge Macrophages 3

local goal\_cell\_count = 100
local cell\_budget = 10
local placed\_cell\_count = 0

function start()
    lab.set\_title( challenge.get\_name() )
    lab.set\_description( "Can you make use of the light incident on this Petri dish to get 100 cells?" )
    lab.set\_left\_panel\_mode( lab.left\_panel\_modes.challenge ) -- do not show substrate editor in challenge
    genome\_editor.set\_allowed\_cell\_types( {genetics.cell\_types.phagocyte, genetics.cell\_types.flagellocyte} )
    reset()
end

function reset()
    lab.load\_built\_in\_substrate("algae1.substrate")
    placed\_cell\_count = 0
end

function step()
    local n = substrate.cell\_count()
    local status = "Inserted cells: " .. tostring(placed\_cell\_count) .. " (0 - " .. tostring(cell\_budget) .. ")"
    status = status ..  "\nTotal cells: " .. tostring(n) .. " (" .. tostring(goal\_cell\_count) .. " - ∞)"
    lab.set\_status(status)
    if n >= goal\_cell\_count
    then
        challenge.finish()
    end
end

function place\_organism(organism)
    if # organism + placed\_cell\_count <= cell\_budget
    then
        placed\_cell\_count = placed\_cell\_count + # organism
        return true
    else
        if placed\_cell\_count == cell\_budget
        then
            lab.notify\_cursor("No cells left.")
        else
            lab.notify\_cursor("Only " .. tostring(cell\_budget - placed\_cell\_count) .. " cells left.")
        end
        return false
    end
end

```

##### Запись 4 (2020-12-16)

Я немного работал над визуализацией свойств клеток, которые могут зависеть от сигналов ячеек и не только. Требуется настройка, но основной функционал уже имеется. Также были добавлены кнопки отмены/возврата действия в редакторе генома (довольно уродливые), хотя они пока что не работают. Я также провел некоторое время, экспериментируя с эволюцией, особенно с созданием случайных клеток. Случайные пловцы появляются очень редко по сравнению с самыми ранними версиями CL, хотя сейчас они быстрее. Я расследовал этот феномен.

Похоже, это связано со многими факторами, теперь у нас намного больше режимов, что затрудняет формирование коротких циклов. Также больше настроек определённых клеток, и некоторые из них могут быть вредными для организма. Например отсутствие силы плавания полностью убивает пловца. Непрочный или слишком длинный адгезин, высокий приоритет питательных веществ и др. - все это вредно для организма. Первые четыре из них являются новыми, поэтому вероятность того, что все эти значения приемлемы для всех клеток теперь очень мала (необходима правка: The first four of these are new so the chance that all these values are reasonable for all cells is now very low). На самом деле это неизбежно, да мною и не ожидается, что полностью случайный геном сможет выжить, однако я могу это немного настраивать. Например сосредотачивание рандомных значений вокруг неких "нормальных" значений помогает, однако если переборщить то это перестанет быть случайным.

##### Запись 5 (2020-12-22)

Я продолжил работу над визуализацией настроек, которые зависят от состояния клетки, например сигнальные вещества. Сюжет(?) стал немного лучше, теперь он влияет на редактируемый геном. Оно всё ещё требует доработки, но пока что я остановлюсь на этом, ведь оно уже имеет какой-никакой функционал. Мой план - быстро создать все прототипы, чтобы все заработало. После этого я (надеюсь) вернусь и сделаю все немного более красивее/аккуратнее/функциональнее. В дизайне и коде игры всё еще происходят большие изменения, поэтому я просто всё сломаю, если сразу заставлю их выглядеть красиво. Я так же потратил время на то, что бы задания заработали. Вам понравится, что задачи будут выполнятся за счёт lua скрипта. Вот пример одного из гайдов:

```
-- microscope training 1

local step = 1

instructions = {
    [[Welcome to the Microscope training!
 Here we will here teach you how to use the robotic microscope installed in our lab.
 Select the "Cell inserter" marked with an orange frame]],
    [[Great job!
 Now you have selected the cell inserter and can add cells in the substrate by clicking on it.
 Click in the orange rectangle to insert a cell there.]]
}

function reset()
    lab.load\_built\_in\_substrate("tut1.substrate")
    step = 0
    next\_step()
    lab.set\_description( instructions[step] )
    gui.highlight( gui.views.top.buttons.tools.add )
end

function start()
    lab.set\_left\_panel\_mode( lab.left\_panel\_modes.tutorial ) -- do not show substrate editor in challenge
    genome\_editor.set\_allowed\_cell\_types( {genetics.cell\_types.photocyte} )
    lab.set\_allowed\_tools( {lab.tools.add, lab.tools.remove, lab.tools.move} )
    reset()
end

function next\_step()
    step = step + 1
    lab.set\_description( instructions[step] )
    lab.set\_status( "Step " .. tostring(step) .. " of " .. tostring(# instructions) )
    if step > # instructions
    then
        challenge.finish()
    end
end

function button\_press(button)
    if step == 1 and button == gui.views.top.buttons.tools.add then
        gui.clear\_highlights()
        -- add code for highlighting in substrate
        next\_step()
    end
end

```
Вот как это выглядет на первом и втором шаге:

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

##### Запись 6 (2021-01-24)

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

Я также потратил немало времени на то, чтобы разрабатывать бэкэнд. У меня нет опыта, но вроде как это довольно просто. Думаю, что мне следует использовать какую-то стороннюю базу данных, а не просто постоянно сохранять субстрат в файл. Я хочу что-то такое, что устойчиво к выключению в любой момент (то есть не будет повреждений, если сервер внезапно перезапустится). Он также должен кэшировать файлы в памяти, к которым часто обращаются, и такие функции, как индексирование, были бы полезны. Я решил использовать базу данных sqlite, подключенную к бэкэнду через jdbc. Таким образом, его можно легко заменить другой базой данных sql, если это потребуется в будущем, например, чтобы переместить базу данных на другой сервер, с которого работает серверная часть, если она станет перегруженной. Я начал немного читать о sql из-за этого, это похоже на беспорядок, но я не уверен, что еще использовать :P(Плохой перевод).

##### Запись 7 (2021-02-2)

Я работал и над бэкэндом, и над игровым меню. В меню теперь есть раздел где отображаются все сохранённые, и где можно создать новые чаши петри (верхняя кнопка слева). Обратите внимание, что это всего лишь концепт и дизайн довольно уродливый. Например. кнопка создания нового эксперимента должна отличаться от сохраненных чашек Петри. Они сохраняются здесь из редактора и впоследствии могут быть снова открыты здесь.

Нажатие на кнопку для публикации отправит Субстрат на серверную часть. Серверная часть проверяет квоту хранилища пользователя и, если она подходит, сохраняет некоторые метаданные в базе данных sqlite, а сама чашка Петри сохраняется в отдельном файле. Выйдя из этого меню и перейдя в меню «Опубликованные эксперименты», мы можем искать эту «публикацию». Здесь мы видим сначала пустое поле поиска, затем ищем «звезду». В результате получается только одно попадание, которое мы выбираем в списке совпадений. Нажимаем «скачать», дожидаемся включения кнопки «открыть», и, наконец, открываем загрузку в редакторе.

[ВСТАВИТЬ СКРИНШОТЫ]

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