Структура кода SS13
Также прочтите: SS13 для опытных программистов и Руководство по маппингу
DreamMaker
Программа, которая потребуется для написания кода и маппинга, состоит из шести основных компонентов. Файловое дерево, дерево объектов, текстовый редактор, редактор иконок, редактор карт и панель отчета об ошибке.
Файловое дерево
Доступно во вкладке 'File' в левой вертикальной панели. Оно отображает файлы, которые составляют код игры, и рассортированы по папкам. Двойной клик по файлу откроет его в соответствующем редакторе. Если вы добавите новый файл в список (в Проводнике Windows), обновите список, нажав на кнопку 'Refresh'. Значок рядом с именем файла означает, что он используется в компилируемом коде. Частая ошибка - забыть импортировать новый файл.
Дерево объектов
О том, что такое объект, читайте ниже в этом руководстве, но пока скажем, что это дерево содержим список всего, что помещается на карту. Они расположены в определенной иерархии. Об этом также читайте ниже в гайде. Кнопка 'Update' внизу обновит дерево и дополнит его новыми спрайтами и объектами, если они были добавлены в любой из отмеченных .dm файлов.
Текстовый редактор
Данный редактор становится доступным, когда вы открываете файл с расширением .dm. Он предназначен для написания и редактирования кода игры.
Редактор иконок
Используется для редактирования иконок и их состояний, доступен, когда открывается файл с расширением .dmi. Отображает список всех спрайтов (часто называемых состояниями иконок) в файле. ПКМ в любом месте оуна отобразит опции для создания новой карты или ролика. Карта - статическое изображение, ролик - состояние иконки в одном из направлении или анимация. Ролик можем иметь одно направление (Юг), четыре (Север-Юг-Восток-Запад) или восемь (компас). Также заметьте, что в одном .dmi файле могут быть только иконки одного определенного размера. Для таких объектов, как сингулярность (которая, набирая силу, увеличивается в размерах), может потребоваться несколько .dmi-файлов.
Редактор карт
Обычно открывается, при запуске DreamMaker или при открытии файла с расширением .dmm. Редактор карт отображает (удивительно!) игровую карту. По умолчанию отображает все 4 основные группы объектов: зоны, мобы, объекты и покрытия. Чтобы выбрать параметры отображения, перейдите на вкладку «Слои» на самой верхней панели инструментов и выберите 'Only show selectable layers' («Показывать только выбираемые слои»), а затем выберите, какие слои вы хотите отображать на той же вкладке. Наиболее часто это используется для скрытия областей наложения. Обратите внимание, что карта не будет отображаться, если в коде .dm есть какие-либо ошибки. Исправьте все ошибки, а затем перекомпилируйте его.
Панель отчета об ошибке
Текстовая панель в нижней части DreamMaker, предназначенная для составления отчетов об ошибках.
Компиляция и запуск
Для компиляции обновленного кода без его запуска, выберите вкладку 'Build' (Сборка) и нажмите 'Compile' (Компилировать). Для компиляции и запуска выберите 'Build' > 'Run'.
Компоненты кода
Переменные
Переменные предназначены для хранения данных. Переменные создаются следующим образом: (без определения значения переменной)
var/i
Чтобы объявить переменную и её значение:
var/i = 5 var/j = "Hello World"
Как только переменная была объявлена, вы можете объявить другую с тем же именем:
var/i i = 2 i = 6 i = 12
Список
Список может быть объявлен одним из трех способов, но переменные, ассоциируемые со списками (len
для получения длины списка), будут доступны только если были объявлены первым способом.
var/list/a var/a[9] var/a = list()
Другие типы
Если вы хотите сохранить монетку где-то в переменных объекта и использовать определенные процедуры или переменные монетки, вам нужно определить переменную, в которой вы храните монету как монету. Второй пример также создает переменную с именем D и заполняет ее новой монетой.
var/obj/item/weapon/coin/C var/obj/item/weapon/coin/D = new/var/obj/item/weapon/coin(src)
Включенные переменные
Переменные, встроенные в сам BYOND и не определяемые нигде в коде:
Атомарные переменные
Клиентские переменные
Datum-переменные
Моб-переменные
Переменные направления (dir)
Север: 1
Юг: 2
Восток: 4
Запад: 8
Северо-восток: 5 (1 + 4)
Юго-Восток: 6 (2 + 4)
Северо-запад: 9 (1 + 8)
Юго-запад: 10 (2 + 8)
Направления пронумерованы таким образом, поскольку используют метод 'bitflag' (битовый флаг). То же в двоичном коде:
0001 для севера
0010 для юга
0100 для востока
1000 для запада
Сложение направлений даст в итоге:
0101 для северо-востока
1001 для северо-запада
0110 для юго-востока
1010 для юго-запада.
Впрочем, другие комбинации (Восток-Запад (1100), Север-Юг (0011), Восток-Северо-Запад (1101) и т.п.) допустимы в особых случаях. (Пример: стены на станции).
Атомарные переменные
Применяются ко всем /obj, /turf, /area, /mob объектам.
Содержимое (Contents): Список объектов, помещаемых в другие объекты. (Баки с плазмой в излучателе, руда в плавильне, и т.п.)
Плотность (Density): Двоичный флаг (0/1): 0 означает возможность пройти через объект, 1 - невозможность преодолеть его
Описание (Desc): Строка - Описание объекта, пишется при подробном осмотре (Examine)
Направление (Dir): 1-10 - Направление объекта
Иконка (Icon): Файл с разрешением .dmi, который содержит спрайт для иконки
Состояние иконки (Icon_state): Название спрайта из файла
Наложения (Overlays): Список изображений, которые наложены на предмет.
Слой (Layer): Если два объекта находятся на одном тайле и у одного из больше номер слоя, то этот объект будет показан над другим.
Координаты (Loc): Позиционирование предмета по X,Y,Z
Свечение (Luminosity): Насколько объект светится?
Название (Name): Название предмета, которое будет отображаться при наведении на него
Прозрачность (Opacity): Можно ли через него видеть?
Смещение по X (Pixel_x), Смещение по Y (pixel_y): Установите, если элемент на карте смещен на несколько пикселей в любую сторону. Используется на ЛКП, Консолях запросов, Пожарных сигнализациях, и т.п.
Тип (Type): Тип - это путь к объекту. У монетки эта переменная примет значение: /obj/item/weapon/coin
Приложенные инструкции
Справочные руководства для прилагаемых инструкций (procs) можно найти по следующим ссылкам:
Area procs
Mob procs
Obj procs
Turf procs
Условные операторы
Условные операторы - это выражения, которые определяют, каким образом будет исполняться код, в зависимости от условия. Чаще всего используется выражение IF (ЕСЛИ).
= и ==
var/a a = 14 if (a == 14) world << "A has the value [a]" else world << "A is not 14"
Одиночный символ равенства = означает присваивание значения справа к переменной слева. (В примере выше переменной a
присваивается значение 14
(a = 14))
Двойной знак равенства == используется для сравнения двух значений. Чаще всего используются именно в выражении IF. В примере выше значение переменной a
сравнивается с 14
(a == 14). Результат сравнения определит, каким образом будет выполняться код.
Выражение IF
В примере был показан простой оператор IF. Оператор IF сначала проверяет, является ли утверждение в скобках (в случае выше a == 14), истинным или нет. Если это правда, он продолжит выполнение кода, который расположен после IF (в приведенном выше случае: world << "A has the value [a]"
). В другом случае, если условие не выполнено, он перейдет к оператору ELSE и выполнит код, который находится после него, если этот оператор присутствует. В примере, если a не равно 14, будет выполнено world << "A is not 14"
Операторы сравнения включают в себя:
== Равенство
!= Неравенство
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
Выражение SWITCH-CASE
Циклы
Оператор WHILE
Оператор FOR
Оператор FOR для элементов списка (FOREACH)
Процедуры
Что такое объект?
SS13 написана на движке BYOND, который использует одноименный объектно-ориентированный язык программирования. Пожалуйста, заметьте, что под объектом далее понимается не внутриигровые объекты, а сущности, которые объявляются в коде.
Каждый определенный путь в игре может быть объектом. Примеры:
/obj/item/weapon/sword /turf/simulated/floor /area/ /atom/
Объект состоит из переменных и процедур
Пример такого объекта:
/turf/simulated/gold_spot var/spawned_gold = 0 name = "Gold Area" desc = "This plot may have spawned gold!" /turf/simulated/gold_spot/proc/spawn_gold() if(prob(50)) new/obj/item/stack/sheet/gold(src) spawned_gold = 1 /turf/simulated/gold_spot/New() ..() spawn_gold()
Иерархия и наследование
Объекты наследуют все родительские переменные и процедуры. Это означает, что объект, определенный как /obj/item/weapon/storage/box
, имеет все переменные от /obj/item/weapon/storage
, /obj/item/weapon
, /obj/item
, /obj
, а также /atom
, но мы вернемся к этому позже. Некоторые процедуры уже определены для всех объектов, вы можете увидеть их здесь. В приведенном выше примере New()
был экземпляром процедуры, унаследованной от родительского объекта. Вот почему New()
не имеет префикса proc/, потому что он уже определен в родительском объекте. Однако вы должны знать, что New()
был переопределен в этом объекте, поэтому он больше не работает так же, как в родительских объектах, а следует описанной логике.
Пример унаследованной переменной - переменные name
и desc
. Обе были переопределены в дочернем объекте. spawned_gold
же является новой переменной, которая отсутствует у родителя.
Если мы определим следующие два объекта:
/turf/simulated/gold_spot/plot1 /turf/simulated/gold_spot/plot2
то мы определим два потомка объекта /turf/simulated/gold_spot
, которые унаследуют все переменные и процедуры объекта /turf/simulated/gold_spot
, включая те, которые объект /turf/simulated/gold_spot
унаследовала от родителя /turf/simulated
.
..()
..()
- это то, что вы чаще всего будете видеть в коде. В других языках программирования подобная конструкция обычно называется super(), она вызывает процедуру с таким же именем из родительского объекта. В отличие от некоторых языков, он не выполняется автоматически, даже если не добавлен, если только не требуется, чтобы он был в начале процедуры. Обычно они добавляются в процедуры New(), Del() и Attackby(), чтобы получить исходное определение в общем родителе. Эти общие определения обеспечивают правильную работу кода.
Организация основных объектов
/datum /atom /area --Объекты-зоны, которые используются в маппинге для определения пространства, покрываемого ЛКП, освещением, атмосферой и т.д. /mob /dead --госты, призраки, наблюдатели /living /carbon --люди и гуманоиды /silicon --ИИ и киборги /obj /effect --Отметки, триггеры, эффекты и декали /item /clothing --Большая часть надеваемой одежды, ремни и рюкзаки ищите в obj/item/weapon/storage /devices --электронные устройства /stack --складываемые предметы: стержни, плитки и материалы /weapons --Большинство поднимаемых предметов /machinery --машины, используемые электроэнергию, обрабатываются каждый тик и в основном неперемещаемые /structure --Объекты, которые не требуют обрабатывания каждый тик или питания, примеры - окна, решетки, книжные полки, стеллажи и пр. /turf /simulated /floor --полы с атмосферой /airless --полы без атмосферы (ВСЕГДА используйте для зон в открытом космосе) /plating --обшивка с атмосферой /airless --обшивка без атмосферы /wall --стены /r-wall --усиленные стены /space --просто космос /unsimulated --все на ЦК и прочих местах, где движение воздушных масс не симулируется
Как внести свой вклад? | |
---|---|
Общее | Руководство по разработке |
Сервер | Настройка базы данных, Запуск локального сервера |
Код | Структура кода SS13, SS13 для опытных программистов, Форматирование текста |
Маппинг | Руководство по маппингу |
Спрайтинг | Руководство по спрайтингу |
Вики | Руководство по редактированию вики |
Перевод | Как делать перевод игры |