Создание учётных записей на вики в данный момент ограничено. Если у вас нет аккаунта на вики, но вы хотите поучаствовать в улучшении проекта, обратитесь за помощью в канал #wiki нашего дискорд-сервера

SS13 для опытных программистов

Материал из SS220 Paradise Wiki (SS13)
Перейти к навигации Перейти к поиску
Newscaster.pngЭта страница должна быть пересмотрена/обновленаNewscaster.png
Эта статья содержит устаревшие данные, необходимо сверить и обновить информацию.
Причина: Гайд давно не трогали, что-то может не соответствовать реальности. Нужен реальный опыт работы с Paracode


Похожие руководства: Структура кода SS13 и Руководство по маппингу

Значит, вы знаете, как писать программный код на других языках и хотите краткое руководство для понимания кода SS13? Этот гайд для вас. Вероятно, здесь представлена не вся информация, которую вам следует знать, но для начала её будет достаточно.

Синтаксис

  • Точка с запятой в конце строки не является обязательной,
  • Циклы, процедуры, объекты, переменные и т.п. блоки определяются отступами (сходство с Python). Примеры:
 /obj
   var
     i1
     i2
     i3

идентично коду: (Крайне рекомендуется использовать подобный вариант разметки, для упрощения поиска объявлений переменных и процедур в дальнейшем)

 /obj
   var/i1
   var/i2
   var/i3

что в свою очередь эквивалентно:

 /obj/var/i1
 /obj/var/i2
 /obj/var/i3
  • Руководство использует термин объект для любых определенных типов (см. Типы переменных), и obj для производных atom/obj, все из которых являются объектами, которые могут быть размещены на игровой карте.
  • Руководство использует термин 'подконтрольный ИИ' для описания поведения, связанного с игроком в роли ИИ, контролирующего предмет. Термин 'подконтрольный игре' используется, отсылаясь к поведению, которое определяет сам скрипт. (Существ с подобным поведением обычно называют существами, подконтрольными ИИ, или NPC)
  • Все унаследовано от родительских объектов. Если переменная определена в /obj/item, её не нужно будет (на самом деле, нельзя) определять в /obj/item/weapon.

Переменные (Источник)

Переменные - это база. В BYOND переменные общие, не существует большой разницы при определении строковых, числовых, булевых и т.д. (Как в PHP)

Предопределенные переменные (Источник)

В BYOND существует большое количество предопределенных переменных, самые основные из них:

  • src - эквивалентна объекту, содержащему процедуру или переменную. При определении принимает тот же тип, что и этот объект. (Аналогично this из Java или C++)
  • usr - переменная сущности (моба) (var/mob/usr), содержит сущность игрока, исполнившего текущий оператор или чье действие в конечном счете вызвало текущую процедуру. Хорошее правило из практики: никогда не помещать usr в процедуру. Если src не будет верным выбором, лучше отправить другой аргумент в процедуру с необходимой информацией.
  • args - список аргументов, принятых в процедуре или операторе.
  • vars - список переменных-объектов. Если использовать имя переменной в качестве индекса списка, возвращает значение этой переменной.

Больше переменных описано здесь: Предназначение основных переменных в коде SS13

Определение переменных

Базовое определение
 var/j
 var/i = 4
 var/a, b, c
Комплексное определение

Основной синтаксис: var/type/variable_name = value (из источника)

Примеры:

 var/obj/item/I = new/obj/item
 I.name = "Some item"

Определение блока данных (datum) и объявление переменной этого типа данных (test_datum):

 datum/test_datum
   var/test_variable = 0 //объявляем переменную test_variable
   
   proc/set_as(var/i) //объявление процедуры в рамках test_datum
     test_variable = i //присваиваем test_variable значение из аргумента
 
 var/datum/test_datum/TD = new/datum/test_datum //TD будет указателем на блок данных типа test_datum
 TD.test_variable = 4  //Byond не знает о приватных переменных, так что можно присваивать им значение таким образом
 world << TD.test_variable //вернет 4 всем подключенным пользователям
 TD.set_as(10) //Вызовет процедуру set_as в блоке данных TD с аргументом 10
 TD.test_variable //вернет 10 всем подключенным пользователям

Битовый флаг

Битовые флаги (Bitflags) - это переменные, использующие биты вместо чисел для определения условий. Битовые операторы: & (поразрядное И) и | (Поразрядное ИЛИ). Данные операторы используют двоичную систему счисления для определения результата. Таким образом, 13 & 3 вернет 1. (1101 & 0011 = 0001) и 13 | 3 = 15 (1101 | 0011 = 1111) (см. #IF (ЕСЛИ))

Типы переменных

Источник

  • datum - обычный тип объекта (классы из Java)
  • atom - атомарные переменные, превращаются в obj, turf, mob и area
  • turf - плитки, составляющие полов, стен и космоса в SS13
  • area - зоны, сгруппированные локации. Объединяют множество turf с похожими свойствами. Определяют электроснабжение, атмосферу и т.п.
  • mob - живое существо, контролируемое игрой или игроком.
  • obj - объекты, которые могут быть размещены на карте.
  • client - объект клиента, создаваемый при подключении игрока
  • list - список элементов. Первый элемент списка L определяется как L[1]
  • world - переменная, в которой могут быть определены глобальные переменные игрового мира. Переменные в world содержат все атомарные переменные, присутствующие в игровом мире.

Вывод сообщений

Самым простым способом вывода сообщений является использование оператора <<.

 world << "Hello World!" //Выводит сообщение всем клиентам, подключенным к миру.
 usr << "Hello usr" //Выводит сообщение только для пользователя, который вызвал процедуру с данным оператором.
Вывод значений переменных
 var/s1 = "Привет"
 var/s2 = "Мир"
 var/i = 2011
 var/j = 2022
 world << "[s1] [s2], руководство написано в [i], переведено в [j]" //Возвращает "Привет Мир, руководство написано в 2011, переведено в 2022"

Определение типов переменных в коде

Процедура istype() вам пригодится.

Пример:

 var/obj/item/weapon/W = new/obj/item/weapon/baton
 if(istype(W,/obj/item/weapon/baton))
   world << "Это - baton!"

Второй аргумент необязателен, если опущен, переменная будет проверена на соответствие объявленному типу:

 var/obj/item/weapon/W = new/obj/item/weapon/baton
 if(istype(W))
   world << "Это - weapon!"

Стандартный код для получения аргументов из переменных, которые имеют тип, являющийся подклассом типа, с которым их обрабатывает текущая процедура (см. пример любой процедуры Attackby()). Обратите внимание, что приведенный ниже пример относится к процедуре, которая определена глобально и не привязана к объекту. Не имеет смысла делать это так, но это работает в рамках примера. Объекты /obj не имеют переменной 'amount', она определена в /obj/item/stack (как показано в упрощенном определении классов ниже. Также обратите внимание, где var/ используется, а где нет).

 /obj
   var/name = "Object"
 
 /obj/item
   name = "Item"
 
 /obj/item/stack
   name = "Stack"
   var/amount = 50
 
 proc/get_amount(var/obj/O)
   if(istype(O,/obj/item/stack))
     var/obj/item/stack/S = O
     return S.amount

Другой способ проделать такое. Он существует исключительно для демонстрации.

 proc/get_aount(var/obj/S)
   if(istype(O,/obj/item/stack))
     return O:amount

Оператор двоеточия (:) в примере выше сообщает компилятору: "Я знаю, что делаю, не обращай внимание на тот факт, что объект не имеет этой переменной. Я сам проверю, что оно работает." Проблема в том, что люди будут использовать ваш код так, как вы никогда не планировали. Это значит, что что-то может заставить 0:amount выдать исключение в виде ошибки Runtime Error. Некоторые переменные, возможно, в конечном итоге потребуется удалить или заменить, и это будет невозможно, когда они используются с object:variable, поскольку компилятор не выдаст ошибку при удалении переменной. Ошибка станет очевидной только после того, как игра будет запущена на реальном сервере, что может привести к ее сбою. Так что никогда не используйте этот метод.

Вот вам еще несколько источников:

istype() proc:
isarea(variable) = istype(variable, /area)
isicon(variable) = istype(variable, /icon)
ismob(variable) = istype(variable, /mob)
isobj(variable) = istype(variable, /obj)
isturf(variable) = istype(variable, /turf)
isloc(variable) = ismob(variable) || isobj(variable) || isturf(variable) || isarea(variable)

Переключение между типами переменных

Предопределены BYOND:
ascii2text
file2text
list2params
num2text
params2list
text2ascii
text2file
text2num
text2path
time2text

Определены в SS13:
text2dir(direction)
dir2text(direction)
dd_file2list(file_path, separator)
dd_text2list(text, separator, var/list/withinList)
dd_text2List(text, separator, var/list/withinList)
dd_list2text(var/list/the_list, separator)
angle2dir(var/degree)
angle2text(var/degree)

Больше полезных процедур:
code/defines/procs/helpers.dm
code/game/objects/items/helper_procs.dm

IF (ЕСЛИ)

If обычно проверяет на истинность условия, если не указано иное. За ложность в других типах переменных принимаются такие значения, как empty, 0 или отсутствие значения (null).

 if(condition)
   action_true()
 else
   action_false()

Поведение переменных в операторе If

Тип переменной Ложно когда Истина когда
String (Text/ASCII) "" или null Все остальное
Int, Real 0 или null Все остальное
datum, atom null Все остальное

Логические операторы

Стандарт:

 ! (НЕ) //НЕ выражение1
 && (И) //выражение1 И выражение2
 || (ИЛИ) //выражение1 ИЛИ выражение2
 == (РАВНО) //выражение1 РАВНО выражению2
 != (НЕ РАВНО) //выражение1 НЕ РАВНО выражению2
 < (МЕНЬШЕ) (<= (НЕ БОЛЬШЕ)) //1 меньше или равно 2
 > (БОЛЬШЕ) (>= (НЕ МЕНЬШЕ)) //1 больше или равно 2
 & (Поразрядное И) //13 & 3 = 1 (1101 & 0011 = 0001)
 | (Поразрядное ИЛИ) //13 | 3 = 15 (1101 | 0011 = 1111)

BYOND не распознает оператор === (эквивалентность).

Больше операторов: Источник (левое меню)

While

BYOND совершит выход из цикла, как только он достигнет определенного числа повторов (итераций) и выдаст runtime ошибку из опасений попасть в бесконечный цикл. То же относится к рекурсиям. Также, как и везде:

 while(condition)
   action1()

Все циклы понимают команды continue и break

For

For объединяет for-циклы и foreach-циклы:

For цикл

 for(var/i = 1; i <= 10; i++)
   world << i //Выведет в каждой строке числа 1 2 3 4 5 6 7 8 9 10

For each цикл

 for(var/obj/item/weapon/baton/B in world)  //итерации над каждым объектом из world.contents (все атомы игрового мира) и берет для обработки только объекты типа /obj/item/weapon/baton
   B.name = "Smelly baton" //Присвоит новое имя предмету "baton" в текущей итерации

Do..While

Оператор Do..while обычно не используется в коде SS13, хотя BYOND его поддерживает.

 var/i = 3
 do
   world << i--
 while(i)

Определение объектов

Неважно, хотите ли вы создать datum или atom-объект, определение объектов этих двух типов одинаково просто:

 /obj/item/weapon/item1 //создаст новый объект типа obj.
   var/item_property = 5 //определяет новый тип переменных для всех объектов item1
   name = "Testing Item" //переменная name уже определена в родительских объектах, поэтому в этой строке только присваивается новое значение
 
 /obj/item/weapon/item1/New() //Конструктор процедуры New()
   ..() //всегда присутствует в процедуре New(), см. ..()
   item_property = 3 //выполняемое действие в конструкторе объекта.

Procs (Методы, функции, процедуры)

Вы привыкли к стандартным функциям и методам, верно? Ну, procs опускают несколько аспектов. Их можно сравнивать с методами Java, поскольку связаны с конкретными объектами. Они не могут быть определены как static-, private-, public-методы. Статичные методы можно написать, однако компилятор не будет наказывать за вызов функции нестатическим способом или в нестатической среде. То же применимо к нестатичным методам

 proc/proc_name(var/argument1, var/argument2)
   world << "[argument1] [argument2]"

Код выше определяет глобальнукю процедуру. Если вы хотите привязать его на конкретный уровень

..()

То же самое, что и super() из Java. Вызывает процедуру родительского класса с тем же именем и параметрами.

Пример:

 /obj/item
   name = "Item"
 
 /obj/item/New() //New() вызывается при создании объекта данного типа. Конструктор, если угодно.
   src.name = "It's an item!"
 
 /obj/item/stack
   name = "Stack"
 
 /obj/item/stack/New() 
   src.name = "It's a stack!"
   ..()

При наличии кода, похожего на пример выше и создании нового объекта типа /obj/item/stack, сначала в мире появится объект с именем "Stack", поскольку это определено по умолчанию. Следом сразу будет вызвана процедура New(). Это изменит имя объекта на "It's a Stack!" но вызов New() родительского типа командой ..() назначит имя "It's an item!". В конце концов, объект получит имя "It's an item!". Команда ..() важна во многих ситуациях, когда что-то определено только в процедуре New() родителя. В Del(), процедуре, которая вызывается преимущественно при удалении объекта, от кода потребуется перейти к корневому Del(), даже чтобы удалить его. Примеры Del() можно найти в коде.

Важные процедуры

New()

Процедура вызывается каждый раз, когда создается экземпляр объекта. При необходимости можно присвоить аргументы. Должна вызвать ..() где это применимо, чтобы сработали родительские конструкторы.

Если у вас возникла необходимость в процедуре New() для atoms с отдельым набором аргументов, убедитесь, что первый аргумент определяет локацию объекта. Пример:

 obj/item/weapon/my_item/New(var/location, var/i)
   ..()
   //Код и все, что он делает

Для создания основного объекта

 new /datum/test_datum

Для создания atom (обычно имеет локацию)

 new /obj/item/weapon(src.loc)

Для создания своего объекта из примера выше, код будет выглядеть так: цифра 5 - пример значения, примененного к var/i в конструкторе.

 new /obj/item/weapon/my_item(src.loc, 5)

где src - владелец процедуры, содержит строку выше. src.loc - локация объекта src.

Del()

Процедура, вызываемая перед удалением объекта. Она ДОЛЖНА вызвать ..() в конце, поскольку само удаление происходит в корневой процедуре Del().

Объект удаляется при вызове del(O), где O - объект, подлежащий удалению.

attack_hand(mob/M as mob)

Вызывается, когда user (M) нажимает на объект пустой активной рукой

attack_paw(mob/M as mob)

Вызывается, когда monkey (M) нажимает на объект пустой активной рукой

Если своей вариации attack_paw(mob/user) для atom не было расписано, по умолчанию вызовется attack_hand(user)

attack_ai(mob/user)

Вызывается, когда ИИ/киборг нажимает на объект пустой активной рукой

Если своей вариации attack_ai(mob/user) для atom не было расписано, по умолчанию вызовется attack_hand(user)

attack(mob/M as mob, mob/user as mob)

Вызывается, когда объект использовался для атаки моба M со стороны user

attackby(obj/item/W, mob/user)

Вызывается, когда объект атакован user при помощи W (Пример: клик по проводам кусачками)

ex_act(severity)

Определяет реакцию объекта на взрыв (severity=1-3, 1 - наиболее разрушительный).

blob_act()

Определяет реакцию предмета на атаку блоба (магмы)

emp_act(severity)

Определяет реакцию предмета на ЭМИ (severity=1-2, 1 - более серьезные последствия).

Topic(href, href_list)

Вызывается при нажатии на ссылку во всплывающем окне. Пример: увеличение выходной мощности на ячейках SMES. Переменная href_list важна, поскольку является проанализированной версией аргументов, которые вы добавляете в ссылку. Для создания ссылки во всплывающем окне, добавьте в отображаемый текст следующее:

 dat += text("<A href='?src=\ref[src];select=[i]'>[src.name]</a><br>")

Примеры использования ищите в коде.

process()

Вызывается для всех объектов в каждом тике. Избегайте использования данной процедуры, если возможно, поскольку сильно грузит процессор. Учитывайте, что для некоторых механик избежать её использования нельзя.

Значение основных переменных SS13

Datum

Datum-объекты располагают минимальным числом предопределенных переменных. Они присутствуют во всех объектах в игре:

 type //Тип объекта. Если объект имеет тип /obj/item/weapon/shovel (лопата), то выражение: new src.type(src.loc) создаст еще одну лопату в том же тайле.
 parent_type //Родительский тип для /obj/item/weapon/shovel - это /obj/item/weapon.
 tag //Тег используется для помощи в идентификации при использовании нескольких экземплров одного объекта. Он должен быть настроен вручную для каждого экземпляра. Ленивые кодеры и мапперы в результате не используют слишком много тегов. Экземпляры в редакторе карт сортируются по тегам.
 vars //List of object vars the datum has defined

Atom

Эти переменные делятся между всеми area, mob, obj, turf.

 contents //Список содержимого. Пример: шкафчики хранят содержимое в этой переменной, как и все предметы-контейнеры. All the items on a turf are in the turf's contents var.
 density //Плотность, при значении 0, игрок сможет пройти через объект, при значении 1 - не сможет.
 desc //Описание. Отображает текст под именем объекта при его подробном изучении (Shift+ЛКМ или ПКМ->Examine).
 dir //Направление объекта. Спрайты обладают перменной направления, которая может принимать до 8 действительных состояний.
 gender //Не используется(?)
 icon //Файл формата .dmi, в котором сохранены спрайты. Выделить одиночными кавычками. (Пример: 'items.dmi')
 icon_state //Наименование спрайта в файле .dmi. Если имя не задано или не подходит по требованиям, то будет использоваться безымянный спрайт из этого файла. Если же имя не соответствует какому-либо спрайту, то по умолчанию будет использоваться пустой.
 invisibility //Невидимость, определяет, что можно будет увидеть, а что - нельзя. 
 infra_luminosity //Инфракрасное освещение. Используется только мехами.
 underlays //Список изображений (см. процедуру image()), находящихся НИЖЕ текущего спрайта.
 overlays //Список изображений (см. процедуру image()), находящихся ВЫШЕ текущего спрайта.
 loc //Содержит ссылку на turf-файл, в котором находится объект в данный момент.
 layer //Слой. Численная переменная, определяющая распределение объектов по слоям. Столы со значением слоя 2.8 всегда расположены под большинством объектов, которые имеют значение слоя 3.0. Можно назначать до 20, который зарезервирован для отображения HUD.
 luminosity //Освещение. Определяет, с какой силой объект излучает свет. Заметьте, что подбор и сброс излучающих свет объектов нужно обрабатывать особым образом. За примером можно обратиться к коду фонарика.
 mouse_over_pointer // не используется
 mouse_drag_pointer //(почти) не используется
 mouse_drop_pointer //не используется
 mouse_drop_zone //не используется
 mouse_opacity //редко используется, см. на странице источника.
 name //Наименование объекта, отображается в строке состояния в левом-нижнем углу экрана или при осмотре предмета (Shift+ПКМ или ПКМ->Examine)
 opacity //Прозрачность. Определяет, можно ли видеть что-либо за этим объектом. Значение 0 для объектов, просматриваемых насквозь (окна, пол, решетки), 1 для непрозрачных объектов (стены, мехи, закрытые шлюзы без окон).
 pixel_x //Смещение по оси Х относительно исходной позиции в пикселях. pixel_x = -5 сдвинет объект на 5 пикс влево, pixel_x = 5 сдвинет на 5 пикс вправо. Пример: Метод New() для ЛКП (APC), также можно понаблюдать, как пульт управления пожарной сигнализацией определен на карте. 
 pixel_y //Смещение по оси Y относительно исходной позиции в пикселях. pixel_y = -5 сдвинет объект на 5 пикс вниз (южнее), pixel_y = 5 сдвинет на 5 пикс вверх (севернее).
 pixel_z //Применяется в изометрических картах, в SS13 не используется.
 suffix //Редко используется. См. в источнике.
 text //Представление объекта в текстовых клиентах. Не используется.
 type //Тип объекта
 vars //См. Datum
 verbs //Действия контекстного меню, которые можно совершить над объектом (появляются при нажатии ПКМ на объекте).
 x //Координата по X, только чтение. Измените значение переменной loc, чтобы сдвинуть объект, или используйте встроенные функции.
 y //Координата по Y, только чтение. 
 z //Координата по Z, только чтение (cектор, Z-level).

Зоны (Area)

 var/requires_power = 1 //Необходимость в питании. Установлено на 0 для зон, которым не нужны ЛКП (APC) для работы оборудования (такие, как Центральное Командование). Всем остальным установлено значение 1.
 var/music = null //Музыкальная композиция, которая проигрывается при входе в зону.
 luminosity = 0 //Освещенность. Установлено на 1 для зон, которые должны быть освещены все время (космос, Центральное Командование). Динамическое освещение при этом выключено (sd_lightning = 0).
 var/sd_lighting = 0 //Динамическое освещение. Необходимость рассчитывать освещенность тайлов этой зоны. Выключите, если освещенность для зоны включена (luminosity = 1).

Большинство остальных переменных существуют только в технических целях и не должны затрагиваться, кроме как в существующих процедурах, в которых были определены:

 code/game/area/Space Station 13 areas.dm 

Мобы (Mob)

Для мобов определено огромное количество переменных. Взгляните на следующие файлы:

 code/defines/mob/mob.dm
 code/defines/mob/dead/observer.dm
 code/defines/mob/living/living.dm
 code/defines/mob/living/carbon/carbon.dm
 code/defines/mob/living/carbon/human.dm
 code/defines/mob/living/carbon/monkey.dm
 code/defines/mob/living/silicon/silicon.dm
 code/defines/mob/living/silicon/ai.dm
 code/defines/mob/living/silicon/robot.dm

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

Объекты (Obj)

 var/m_amt = 0	// Содержание металла в объекте. Используется для определения количества металла (Metal), которое будет получено после переработки предмета в автолате (или же потребуется для его производства).
 var/g_amt = 0	// Содержание стекла в объекте. Используется для определения количества стекла (Glass), которое будет получено после переработки предмета в автолате (или же потребуется для его производства).
 var/w_amt = 0	// Содержание отходов. Не используется
 var/origin_tech = null //Используется для определения размера бонусов исследования, которые получит Отдел Исследований (РнД). Примеры смотрите в коде объектов.
 var/reliability = 100	//Используется некоторыми устройствами для определения их надежности - величины шанса в процентах, что предмет сработает, как надо.
 var/unacidable = 0 //Невосприимчивость к кислотам. При значении 1 объект нельзя уничтожить кислотой.
 var/throwforce = 0 //Количество урона, который пройдет по целевому объекту при броске в него другим предметом.

Больше переменных здесь:

 code/defines/obj.dm

Предметы (Item)

Предметы (Items) - объекты, которые игрок может поднять. В зависимости от их функционала они делятся на несколько категорий.

/obj/item определен в файле:

 code/defines/obj.dm

Он добавляет следующие переменные (Далее идут только самые основные, см. файл для полного списка):

 var/force = null //Сила удара. Определяет размер урона, который получит цель при ударе предметом в руке. Малые предметы обычно не наносят урона, средние наносят 5-10 единиц урона, редкие и мощные предметы могут нанести 10-15 единиц урона, двуручные - от 15 единиц, и т.д. Предметы синдиката могут наносить от 40 единиц урона и выше.
 var/item_state = null //Определяет, какой спрайт будет использоваться для предмета в руке из файлов icons/mob/items_lefthand.dmi и items_righthand.dmi.
 var/damtype = "brute" //Тип урона, наносимый предметом.
 var/health = null //Прочность предмета. Используется в некоторых случаях для того, чтобы определить, может ли предмет сломаться при использовании или получении урона.
 var/hitsound = null //Звук, который будет воспроизводиться при ударе этим предметом. Используется нечасто.
 var/w_class = 3.0 //Вес (а точнее, габариты) предмета.
   // w_class = 1 - предмет маленький и может поместиться в карманах (дискета, ручка, пачка сигарет)
   // w_class = 2 - предмет небольшой, не лезет в карман, но легко помещается в коробку (папка для бумаг, анализатор, распылитель)
   // w_class = 3 - предмет средних размеров, не помещается в коробке, но можно переносить в рюкзаке (коробки, листы металла, металлические прутья)
   // w_class = 4 - предмет крупный и не лезет даже в рюкзак (рюкзак, кирка, пожарный топор)
   // w_class = 5 - предмет имеет неопределенные габариты.
 var/wielded = 0 //Используется для двуручных предметов, которые можно переносить в одной руке, но требуют хват двумя руками для их использования. Условия, при которых происходит переход между хватом двумя руками (wielding) и переносом в оной руке (unwielding) описываются в коде. Все предметы вначале имеют значение этой переменной на 0.
 var/twohanded = 0 // Установите на 1, если предмет двуручный.
 flags = FPRINT | TABLEPASS //Флаги

Машины (Machinery)

Определены в:

 code/defines/obj/machinery.dm

Машины (Machinery) - объекты, которые не могут быть подняты и как правило требуют питание для работы. Для них определены следующие переменные:

 var/use_power = 0 //определяет, будет ли машина потреблять энергию, а также её количество.
   //use_power = 0 - энергия не используется
   //use_power = 1 - пассивное электропотребление
   //use_power = 2 - активное электропотребление
 var/idle_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в пассивном режиме (use_power = 1) в один игровой тик
 var/active_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в активном режиме (use_power = 2) в один игровой тик
 var/power_channel = EQUIP //Определяет категорию устройства на ЛКП (APC). EQUIP (цепь для оборудования), ENVIRON (цепь для систем жизнеобеспечения) или LIGHT (цепь освещения).
 var/list/component_parts = null //Список частей, которые потребуются помимо платы для сборки машины в корпусе (machine frame).

Покрытие (Turf)

 var/intact = 1 //Определяет, будет ли покрытие скрывать под собой коммуникации (трубы, проводку и т.п.). Значение 1 будет скрывать коммуникации, 0 - не будет. Скрыты будут только трубы и провода с установленным level=1. Установите level=2, чтобы не скрывать коммуникации.
 var/blocks_air = 0 //Определяет воздухопроницаемость. Не пропускает воздух при значении 1.

Существуют и другие переменные, но которые тесно связаны с атмосферикой, код которой крайне не рекомендуется трогать, чтобы не сломать вообще все.

 code/defines/turf.dm

Симулируемые (Simulated)

Симулируемые полы (simulated floors) - это тайлы, которые симулируют движение воздушных масс и температуру. Станция практически полностью состоит из таких, тогда как Центральное Командование использует несимулируемые полы, чтобы не допустить массивных и ненужных лагов.

 var/wet = 0 //Мокрый пол. При значении 1 игрок поскользнется при пробеге по нему.
 var/thermite = 0 //Термитный слой. Принимает значение 1, когда на тайл вылит термит.
Симулируемые полы (Simulated floors)
 var/icon_regular_floor = "floor" //Определяет, какую иконку должна иметь стальная разновидность пола. Определяется при создании пола (процедура New()). Если icon_state (спрайт состояния) пола в этой точке является одним из тех, что определены в глобальной переменной icons_to_ignore_at_floor_init , то этой переменной присвоится значение "floor". Список icons_to_ignore_at_floor_init list содержит следующие icon_states (спрайты состояния) из файла icons/turf/floors.dmi: broken (сломанный), plating (обшивка), burnt (обоженный) and non-steel (не стальной).
 heat_capacity = 10000 //Когда очаг возгорания на тайле превышает это число, пол с некоторым шансом может расплавиться. Чем выше число, там выше шанс расплавления.
 var/broken = 0 //В основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Сломанные плитки пропадают при снятии с пола.
 var/burnt = 0 //TВ основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Обоженные плитки пропадают при снятии с пола.
 var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/steel //определяет, какая плитка лежит на полу

Симулируемые полы определены в файле:

 code/game/turf.dm
Симулируемые стены (Simulated walls)

Особо отличающихся переменных не содержат.

Определены в:

 code/defines/turf.dm
Как внести свой вклад?
Общее Руководство по разработке
Сервер Настройка базы данных, Запуск локального сервера
Код Структура кода SS13, SS13 для опытных программистов, Форматирование текста, Как делать перевод игры
Маппинг Руководство по маппингу
Спрайтинг Руководство по спрайтингу
Вики Руководство по редактированию вики