Структура кода SS13

(перенаправлено с «Understanding SS13 Code»)

Также прочтите: 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 для опытных программистов, Форматирование текста, Как делать перевод игры
Маппинг Руководство по маппингу
Спрайтинг Руководство по спрайтингу
Вики Руководство по редактированию вики