Структура кода 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 --все на ЦК и прочих местах, где движение воздушных масс не симулируется