SS13 для опытных программистов: различия между версиями

Материал из SS220 Paradise Wiki (SS13)
Перейти к навигации Перейти к поиску
м (Добавлена плашка)
м (Добавил плашку)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
{{Требуется перевод}}  
{{Needsrevision|reason=Гайд давно не трогали, что-то может не соответствовать реальности. Нужен реальный опыт работы с Paracode}}
Other related guides: [[Understanding SS13 Code]] and [[Guide to mapping]]
Похожие руководства: [[Структура кода SS13]] и [[Руководство по маппингу]]


So you know how to write programs in other languages and would like a quick guide on how to understand and code for SS13? Good, this is the guide for you. It likely doesn't contain everything that you need to know but it's a start.
Значит, вы знаете, как писать программный код на других языках и хотите краткое руководство для понимания кода SS13? Этот гайд для вас. Вероятно, здесь представлена не вся информация, которую вам следует знать, но для начала её будет достаточно.


== Syntax ==
== Синтаксис ==


*Semicolons at the end are not mandatory,
*Точка с запятой в конце строки не является обязательной,
*Loop, proc, object, variable etc. spans are determined by indentations (similar to Python, see examples below)
*Циклы, процедуры, объекты, переменные и т.п. блоки определяются отступами (сходство с Python). Примеры:
   /obj
   /obj
     var
     var
Строка 13: Строка 13:
       i2
       i2
       i3
       i3
is the same as (Strongly recommended you use this layout to make searching for variable and proc definitions easier.)
идентично коду: (Крайне рекомендуется использовать подобный вариант разметки, для упрощения поиска объявлений переменных и процедур в дальнейшем)
   /obj
   /obj
     var/i1
     var/i1
     var/i2
     var/i2
     var/i3
     var/i3
which is inturn the same as
что в свою очередь эквивалентно:
   /obj/var/i1
   /obj/var/i1
   /obj/var/i2
   /obj/var/i2
   /obj/var/i3
   /obj/var/i3
*This guide uses the word 'object' for any defined type (see [[#Variable types|Variable types]]) and the word 'obj' for derivatives of atom/obj, which are all objects which can be placed on the map.
*Руководство использует термин '''объект''' для любых определенных типов (см. [[#Variable types|Типы переменных]]), и '''obj''' для производных <code>atom/obj</code>, все из которых являются объектами, которые могут быть размещены на игровой карте.
*This guide uses the word 'AI controlled' for behaviour to do with an [[AI]] player controlling an item. The term 'Game controlled' is used when refering to behaviour which the script itself determins (Usually called AI controlled creatures or NPCs)
*Руководство использует термин 'подконтрольный ИИ' для описания поведения, связанного с игроком в роли [[ИИ]], контролирующего предмет. Термин 'подконтрольный игре' используется, отсылаясь к поведению, которое определяет сам скрипт. (Существ с подобным поведением обычно называют существами, подконтрольными ИИ, или NPC) <!--Что тут имелось в виду в оригинале?-->
*All things are inherited from parent objects. If a variable is defined in /obj/item, it doesn't need to be (actually can't be) redefined in /obj/item/weapon.
*Все унаследовано от родительских объектов. Если переменная определена в <code>/obj/item</code>, её не нужно будет (на самом деле, нельзя) определять в <code>/obj/item/weapon</code>.


=== [http://www.byond.com/members/?command=reference&path=var Variables] ===
=== [http://www.byond.com/members/?command=reference&path=var Переменные (Источник)] ===
Variables are very general, Byond makes no difference in the declaration of strings, integers, etc. (Similar to PHP)
Переменные - это база. В BYOND переменные общие, не существует большой разницы при определении строковых, числовых, булевых и т.д. (Как в PHP)


==== [http://www.byond.com/members/?command=reference&path=var Predefined variables] ====
==== [http://www.byond.com/members/?command=reference&path=var Предопределенные переменные (Источник)] ====
There is a lot of predefined variables for objects in BYOND, but the most important are:
В BYOND существует большое количество предопределенных переменных, самые основные из них:
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fsrc src]''' - a variable equal to the object containing the proc or verb. It is defined to have the same type as that object. (Similar to "this" in Java or C++)
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fsrc src]''' - эквивалентна объекту, содержащему процедуру или переменную. При определении принимает тот же тип, что и этот объект. (Аналогично <code>this</code> из Java или C++)
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fusr usr]''' - a mob variable (var/mob/usr) containing the mob of the player who executed the current verb, or whose action ultimately called the current proc. '''A good rule of thumb is to never put usr in a proc.''' If src would not be the correct choice, it is better to send another argument to your proc with the information it needs.
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fusr usr]''' - переменная сущности (моба) (<code>var/mob/usr</code>), содержит сущность игрока, исполнившего текущий оператор или чье действие в конечном счете вызвало текущую процедуру. '''Хорошее правило из практики: никогда не помещать <code>usr</code> в процедуру.''' Если <code>src</code> не будет верным выбором, лучше отправить другой аргумент в процедуру с необходимой информацией. <!--Мы, конечно, программисты, но тут автор невнятно пишет -->
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fargs args]''' - a list of the arguments passed to the proc or verb.
*'''[http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fargs args]''' - список аргументов, принятых в процедуре или операторе.
*'''[http://www.byond.com/members/?command=reference&path=datum%2Fvar%2Fvars vars]''' - a list of object variables. If the variable name is used as an index into the list, the value of that variable is accessed.
*'''[http://www.byond.com/members/?command=reference&path=datum%2Fvar%2Fvars vars]''' - список переменных-объектов. Если использовать имя переменной в качестве индекса списка, возвращает значение этой переменной.


For more SS13 specific variables see [[#SS13 common variable meanings|SS13 common variable meanings]]
Больше переменных описано здесь: [[#SS13 common variable meanings|Предназначение основных переменных в коде SS13]]


==== Variable definition ====
==== Определение переменных ====


=====Basic definitions=====
=====Базовое определение=====
   var/j
   var/j
   var/i = 4
   var/i = 4
   var/a, b, c
   var/a, b, c


=====Complex definitions=====
=====Комплексное определение=====
The general syntax is [http://www.byond.com/members/?command=reference&path=var var/type/variable_name = value]
Основной синтаксис: <code>var/type/variable_name = value</code> [http://www.byond.com/members/?command=reference&path=var (из источника)]


Examples:
Примеры:
   var/obj/item/I = new/obj/item
   var/obj/item/I = new/obj/item
   [http://www.byond.com/members/?command=reference&path=operator%2F%40dt%3B I.name] = "Some item"
   [http://www.byond.com/members/?command=reference&path=operator%2F%40dt%3B I.name] = "Some item"


Datum definition and declaration of a variable of that datum type:
Определение блока данных (datum) и объявление переменной этого типа данных (test_datum):
   datum/test_datum
   datum/test_datum
     var/test_variable = 0 //declaration of the test_variable var
     var/test_variable = 0 //объявляем переменную test_variable
      
      
     proc/set_as(var/i) //proc definition within the test_datum datum
     proc/set_as(var/i) //объявление процедуры в рамках test_datum
       test_variable = i //set the test_variable var to the value in the argument
       test_variable = i //присваиваем test_variable значение из аргумента
    
    
   var/datum/test_datum/TD = new/datum/test_datum //TD will now be a reference to a datum of type test_datum
   var/datum/test_datum/TD = new/datum/test_datum //TD будет указателем на блок данных типа test_datum
   TD.test_variable = 4  //Byond doesn't know of private variables, so you can set any variables like this
   TD.test_variable = 4  //Byond не знает о приватных переменных, так что можно присваивать им значение таким образом
   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] TD.test_variable //will output 4 to all connected users
   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] TD.test_variable //вернет 4 всем подключенным пользователям
   TD.set_as(10) //Will call the set_as proc in the datum with the argument 10
   TD.set_as(10) //Вызовет процедуру set_as в блоке данных TD с аргументом 10
   TD.test_variable //will output 10 to all connected users
   TD.test_variable //вернет 10 всем подключенным пользователям


==== Bitflags ====
==== Битовый флаг ====


Bitflags are variables which use bits instead of numbers to determine conditions. The bit operators are [http://www.byond.com/members/?command=reference&path=operator%2F%26 &] and [http://www.byond.com/members/?command=reference&path=operator%2F%7C ]. For now, you should know that bitflag operators use the binary value of numbers to determine the result. So [http://www.byond.com/members/?command=reference&path=operator%2F%26 13 & 3] will result in 1. ([http://www.byond.com/members/?command=reference&path=operator%2F%26 1101 & 0011 = 0001]) and [http://www.byond.com/members/?command=reference&path=operator%2F%7C 13 | 3 = 15] ([http://www.byond.com/members/?command=reference&path=operator%2F%7C 1101 | 0011 = 1111]) see [[#If|if]] for uses
Битовые флаги (Bitflags) - это переменные, использующие биты вместо чисел для определения условий. Битовые операторы: [http://www.byond.com/members/?command=reference&path=operator%2F%26 & (поразрядное И)] и [http://www.byond.com/members/?command=reference&path=operator%2F%7C | (Поразрядное ИЛИ)]. Данные операторы используют двоичную систему счисления для определения результата. Таким образом, [http://www.byond.com/members/?command=reference&path=operator%2F%26 13 & 3] вернет 1. ([http://www.byond.com/members/?command=reference&path=operator%2F%26 1101 & 0011 = 0001]) и [http://www.byond.com/members/?command=reference&path=operator%2F%7C 13 | 3 = 15] ([http://www.byond.com/members/?command=reference&path=operator%2F%7C 1101 | 0011 = 1111]) (см. [[#IF (ЕСЛИ)]])


==== Variable types ====
==== Типы переменных ====
[http://www.byond.com/members/?command=reference&path=var reference]
[http://www.byond.com/members/?command=reference&path=var Источник]


*[http://www.byond.com/members/?command=reference&path=datum datum] - ordinary object type (class in java)
*[http://www.byond.com/members/?command=reference&path=datum datum] - обычный тип объекта (классы из Java)
*[http://www.byond.com/members/?command=reference&path=atom atom] - atom derives into obj, turf, mob and area
*[http://www.byond.com/members/?command=reference&path=atom atom] - атомарные переменные, превращаются в obj, turf, mob и area
*[http://www.byond.com/members/?command=reference&path=turf turf] - tiles which make up the floors, walls and space on SS13
*[http://www.byond.com/members/?command=reference&path=turf turf] - плитки, составляющие полов, стен и космоса в SS13
*[http://www.byond.com/members/?command=reference&path=area area] - areas are grouped locations. They combine many turfs and it gives some common properties. Power, atmosphere, etc. are determined by areas
*[http://www.byond.com/members/?command=reference&path=area area] - зоны, сгруппированные локации. Объединяют множество turf с похожими свойствами. Определяют электроснабжение, атмосферу и т.п.
*[http://www.byond.com/members/?command=reference&path=mob mob] - an object with life, be it game controlled or player controlled.
*[http://www.byond.com/members/?command=reference&path=mob mob] - живое существо, контролируемое игрой или игроком.
*[http://www.byond.com/members/?command=reference&path=obj obj] - objects which can be placed on the map
*[http://www.byond.com/members/?command=reference&path=obj obj] - объекты, которые могут быть размещены на карте.
*[http://www.byond.com/members/?command=reference&path=client client] - a new client object is created for each connected player
*[http://www.byond.com/members/?command=reference&path=client client] - объект клиента, создаваемый при подключении игрока
*[http://www.byond.com/members/?command=reference&path=list list] - a list of elements. The first element in a list called L is L[1]
*[http://www.byond.com/members/?command=reference&path=list list] - список элементов. Первый элемент списка '''L''' определяется как '''L[1]'''
*[http://www.byond.com/members/?command=reference&path=world world] - this is a variable where some global variables for the entire world can be set. World's contents var contains all atoms currently in the game world.
*[http://www.byond.com/members/?command=reference&path=world world] - переменная, в которой могут быть определены глобальные переменные игрового мира. Переменные в world содержат все атомарные переменные, присутствующие в игровом мире.


==== [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B%2Foutput Outputting messages] ====
==== [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B%2Foutput Вывод сообщений] ====
The most basic way of outputting messages is with the [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B%2Foutput '<<' output operator].
Самым простым способом вывода сообщений является использование оператора [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B%2Foutput '''<<'''].


   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "Hello World!" //Outputs a message to all clients in the world
   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "Hello World!" //Выводит сообщение всем клиентам, подключенным к миру.
   [http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fusr usr] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "Hello usr" //Outputs a message to only the user who is tied to the calling of the proc which contains this.
   [http://www.byond.com/members/?command=reference&path=proc%2Fvar%2Fusr usr] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "Hello usr" //Выводит сообщение только для пользователя, который вызвал процедуру с данным оператором.


===== Output with variables =====
===== Вывод значений переменных =====
   var/s1 = "Hello"
   var/s1 = "Привет"
   var/s2 = "World"
   var/s2 = "Мир"
   var/i = 2011
   var/i = 2011
   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "[s1] [s2], this guide was written in [i]" //Returns "Hello World, this guide was written in 2011"
  var/j = 2022
   [http://www.byond.com/members/?command=reference&path=world world] [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%26lt%3B <<] "[s1] [s2], руководство написано в [i], переведено в [j]" //Возвращает "Привет Мир, руководство написано в 2011, переведено в 2022"


==== Determining variable types in code ====
==== Определение типов переменных в коде ====
The [http://www.byond.com/members/?command=reference&path=proc%2Fistype istype()] proc will come in handy
Процедура [http://www.byond.com/members/?command=reference&path=proc%2Fistype istype()] вам пригодится.


Example
Пример:
   var/obj/item/weapon/W = new/obj/item/weapon/baton
   var/obj/item/weapon/W = new/obj/item/weapon/baton
   if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](W,/obj/item/weapon/baton))
   if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](W,/obj/item/weapon/baton))
     [http://www.byond.com/members/?command=reference&path=world world] << "It's a baton!"
     [http://www.byond.com/members/?command=reference&path=world world] << "Это - baton!"


The second argument is optional, if it's omitted, the variable will be checked against its declared type, like
Второй аргумент необязателен, если опущен, переменная будет проверена на соответствие объявленному типу:
   var/obj/item/weapon/W = new/obj/item/weapon/baton
   var/obj/item/weapon/W = new/obj/item/weapon/baton
   if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](W))
   if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](W))
     [http://www.byond.com/members/?command=reference&path=world world] << "It's a weapon!"
     [http://www.byond.com/members/?command=reference&path=world world] << "Это - weapon!"


Standard code for getting specific arguments from variables which have a type that is a subclass of the type the current proc treats them with (see any attackby() proc for examples). Note that the example below is of a proc which is globaly defined, not tied to the object. It doesn't make much sense to do it like this but it works for the purposes of the example. /obj objects don't have the 'amount' variable, it's defined in /obj/item/stack (as ilustrated by the oversimplified definition of classes below. Also note where var/ is used and where it isn't).
Стандартный код для получения аргументов из переменных, которые имеют тип, являющийся подклассом типа, с которым их обрабатывает текущая процедура (см. пример любой процедуры Attackby()). Обратите внимание, что приведенный ниже пример относится к процедуре, которая определена глобально и не привязана к объекту. Не имеет смысла делать это так, но это работает в рамках примера. Объекты /obj не имеют переменной 'amount', она определена в /obj/item/stack (как показано в упрощенном определении классов ниже. Также обратите внимание, где var/ используется, а где нет).
   /obj
   /obj
     var/name = "Object"
     var/name = "Object"
Строка 123: Строка 124:
       return [http://www.byond.com/members/?command=reference&path=operator%2F%40dt%3B S.amount]
       return [http://www.byond.com/members/?command=reference&path=operator%2F%40dt%3B S.amount]


There is another way of doing this. I'll show you that it exists but it is NOT TO BE USED.
Другой способ проделать такое. Он существует исключительно для демонстрации.
   proc/get_aount(var/obj/S)
   proc/get_aount(var/obj/S)
     if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](O,/obj/item/stack))
     if([http://www.byond.com/members/?command=reference&path=proc%2Fistype istype](O,/obj/item/stack))
       return [http://www.byond.com/members/?command=reference&path=operator%2F%3A O:amount]
       return [http://www.byond.com/members/?command=reference&path=operator%2F%3A O:amount]
The [http://www.byond.com/members/?command=reference&path=operator%2F%3A colon operator] (:) in the example above tells the byond compiler: "I know what I'm doing, so ignore the fact the object doesn't have this variable, I'll make sure it works myself." The problem is that people will revise your code and use it in ways you never planed for. This means something might eventually make the O:amount throw exceptions in the form of runtime errors. Some variables might eventually need to be removed or replaced and this is impossible when they are used with object:variable as the compiler will not throw an error when the variable is removed. The error will only become apparent after the game is ran on the live server which might cause it to crash. So just don't use this method, ever.
Оператор двоеточия ([http://www.byond.com/members/?command=reference&path=operator%2F%3A :]) в примере выше сообщает компилятору: "Я знаю, что делаю, не обращай внимание на тот факт, что объект не имеет этой переменной. Я сам проверю, что оно работает." Проблема в том, что люди будут использовать ваш код так, как вы никогда не планировали. Это значит, что что-то может заставить 0:amount выдать исключение в виде ошибки Runtime Error. Некоторые переменные, возможно, в конечном итоге потребуется удалить или заменить, и это будет невозможно, когда они используются с object:variable, поскольку компилятор не выдаст ошибку при удалении переменной. Ошибка станет очевидной только после того, как игра будет запущена на реальном сервере, что может привести к ее сбою. Так что '''никогда''' не используйте этот метод.


There are some shortcuts to [http://www.byond.com/members/?command=reference&path=proc%2Fistype istype()] proc:<br>
Вот вам еще несколько источников:
 
[http://www.byond.com/members/?command=reference&path=proc%2Fistype istype()] proc:<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fisarea isarea(variable)] = istype(variable, /area)<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fisarea isarea(variable)] = istype(variable, /area)<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fisicon isicon(variable)] = istype(variable, /icon)<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fisicon isicon(variable)] = istype(variable, /icon)<br>
Строка 137: Строка 140:
[http://www.byond.com/members/?command=reference&path=proc%2Fisloc isloc(variable)]  = ismob(variable) || isobj(variable) || isturf(variable) || isarea(variable)
[http://www.byond.com/members/?command=reference&path=proc%2Fisloc isloc(variable)]  = ismob(variable) || isobj(variable) || isturf(variable) || isarea(variable)


==== Switching between variable types in code ====
==== Переключение между типами переменных ====


Byond defined:<br>
Предопределены BYOND:<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fascii2text ascii2text]<br>
[http://www.byond.com/members/?command=reference&path=proc%2Fascii2text ascii2text]<br>
[http://www.byond.com/members/?command=reference&path=proc%2Ffile2text file2text]<br>
[http://www.byond.com/members/?command=reference&path=proc%2Ffile2text file2text]<br>
Строка 151: Строка 154:
[http://www.byond.com/members/?command=reference&path=proc%2Ftime2text time2text]<br>
[http://www.byond.com/members/?command=reference&path=proc%2Ftime2text time2text]<br>


SS13 Defined:<br>
Определены в SS13:<br>
text2dir(direction)<br>
text2dir(direction)<br>
dir2text(direction)<br>
dir2text(direction)<br>
Строка 161: Строка 164:
angle2text(var/degree)<br>
angle2text(var/degree)<br>


For more useful procs see<br>
Больше полезных процедур:<br>
[http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/procs/helpers.dm code/defines/procs/helpers.dm]<br>
[http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/procs/helpers.dm code/defines/procs/helpers.dm]<br>
[http://code.google.com/p/tgstation13/source/browse/trunk/code/game/objects/items/helper_procs.dm code/game/objects/items/helper_procs.dm]
[http://code.google.com/p/tgstation13/source/browse/trunk/code/game/objects/items/helper_procs.dm code/game/objects/items/helper_procs.dm]


=== [http://www.byond.com/members/?command=reference&path=proc%2Fif If] ===
=== [http://www.byond.com/members/?command=reference&path=proc%2Fif IF (ЕСЛИ)] ===


Ifs default to checking for true if not otherwise stated. False is defined for all variable types as empty, 0 or non-existant (null).
If обычно проверяет на истинность условия, если не указано иное. За ложность в других типах переменных принимаются такие значения, как <code>empty</code>, <code>0</code> или отсутствие значения (<code>null</code>).
   if(condition)
   if(condition)
     action_true()
     action_true()
Строка 173: Строка 176:
     action_false()
     action_false()


==== Common variable behavior in if statements ====
==== Поведение переменных в операторе If ====
{|
{|
!Variable type
!Тип переменной
!False when
!Ложно когда
!True when
!Истина когда
|-
|-
!String (text / ascii)
!String (Text/ASCII)
|"" or null
|"" или null
|Anything else
|Все остальное
|-
|-
!Int / Real
!Int, Real
|0 or null
|0 или null
|Anything else
|Все остальное
|-
|-
!datum, atom
!datum, atom
|null
|null
|Anything else
|Все остальное
|}
|}


==== [http://www.byond.com/members/?command=reference&path=operator Logical operators] ====
==== [http://www.byond.com/members/?command=reference&path=operator Логические операторы] ====
Pretty standard:
Стандарт:
   [http://www.byond.com/members/?command=reference&path=operator%2F%21 !statement1] //NOT statement1
   [http://www.byond.com/members/?command=reference&path=operator%2F%21 ! (НЕ)] //НЕ выражение1
   [http://www.byond.com/members/?command=reference&path=operator%2F%26%26 (statement1) && (statement2)] //statement1 AND statement2
   [http://www.byond.com/members/?command=reference&path=operator%2F%26%26 && (И)] //выражение1 И выражение2
   [http://www.byond.com/members/?command=reference&path=operator%2F%7C%7C (statement1) || (statement2)] //statement1 OR statement2
   [http://www.byond.com/members/?command=reference&path=operator%2F%7C%7C || (ИЛИ)] //выражение1 ИЛИ выражение2
   [http://www.byond.com/members/?command=reference&path=operator%2F%3D%3D ==] //equals
   [http://www.byond.com/members/?command=reference&path=operator%2F%3D%3D == (РАВНО)] //выражение1 РАВНО выражению2
   [http://www.byond.com/members/?command=reference&path=operator%2F%21%3D !=] //not equal
   [http://www.byond.com/members/?command=reference&path=operator%2F%21%3D != (НЕ РАВНО)] //выражение1 НЕ РАВНО выражению2
   [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B <] ([http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%3D <=]) //less (or equal)
   [http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B < (МЕНЬШЕ)] ([http://www.byond.com/members/?command=reference&path=operator%2F%26lt%3B%3D <= (НЕ БОЛЬШЕ)]) //1 меньше или равно 2
   [http://www.byond.com/members/?command=reference&path=operator%2F%26gt%3B >] ([http://www.byond.com/members/?command=reference&path=operator%2F%26gt%3B%3D >=]) //more (or equal)
   [http://www.byond.com/members/?command=reference&path=operator%2F%26gt%3B > (БОЛЬШЕ)] ([http://www.byond.com/members/?command=reference&path=operator%2F%26gt%3B%3D >= (НЕ МЕНЬШЕ)]) //1 больше или равно 2
   [http://www.byond.com/members/?command=reference&path=operator%2F%26 &] //bitflag AND operator. 13 & 3 = 1 (1101 & 0011 = 0001)
   [http://www.byond.com/members/?command=reference&path=operator%2F%26 & (Поразрядное И)] //13 & 3 = 1 (1101 & 0011 = 0001)
   [http://www.byond.com/members/?command=reference&path=operator%2F%7C ] //bitflag OR operator. 13 | 3 = 15 (1101 | 0011 = 1111)
   [http://www.byond.com/members/?command=reference&path=operator%2F%7C | (Поразрядное ИЛИ)] //13 | 3 = 15 (1101 | 0011 = 1111)
 
BYOND не распознает оператор === (эквивалентность).


Byond does not recognize the === (identical) operator. More operators can be found in the left menu on the [http://www.byond.com/members/?command=reference&path=operator reference page]
Больше операторов: [http://www.byond.com/members/?command=reference&path=operator Источник (левое меню)]


=== [http://www.byond.com/members/?command=reference&path=proc%2Fwhile While] ===
=== [http://www.byond.com/members/?command=reference&path=proc%2Fwhile While] ===
Byond will cancel a loop if it reaches a certain number of iteration and give a runtime error out of fear of infinite loops. Same applies for recursions.
BYOND совершит выход из цикла, как только он достигнет определенного числа повторов (итераций) и выдаст runtime ошибку из опасений попасть в бесконечный цикл. То же относится к рекурсиям.
Same as anywhere else
Также, как и везде:
   while(condition)
   while(condition)
     action1()
     action1()


All loops understand the [http://www.byond.com/members/?command=reference&path=proc%2Fcontinue continue] and [http://www.byond.com/members/?command=reference&path=proc%2Fbreak break] commands
Все циклы понимают команды <code>[http://www.byond.com/members/?command=reference&path=proc%2Fcontinue continue]</code> и <code>[http://www.byond.com/members/?command=reference&path=proc%2Fbreak break]</code>


=== For ===
=== For ===
All loops understand the [http://www.byond.com/members/?command=reference&path=proc%2Fcontinue continue] and [http://www.byond.com/members/?command=reference&path=proc%2Fbreak break] commands


For combines the for loop and foreach loop:
For объединяет for-циклы и foreach-циклы:
====  [http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Floop For loop] ====
====  [http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Floop For цикл] ====
   for(var/i = 1; i <= 10; i++)
   for(var/i = 1; i <= 10; i++)
     [http://www.byond.com/members/?command=reference&path=world world] << i //Will write (each in a new line) 1 2 3 4 5 6 7 8 9 10
     [http://www.byond.com/members/?command=reference&path=world world] << i //Выведет в каждой строке числа 1 2 3 4 5 6 7 8 9 10


==== [http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Flist For each] ====
==== [http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Flist For each цикл] ====
   for(var/obj/item/weapon/baton/B [http://www.byond.com/members/?command=reference&path=operator%2Fin in] world)  //will iterate through world.contents (which contains all atoms in the world) and only pick those which are of the given type (/obj/item/weapon/baton)
   for(var/obj/item/weapon/baton/B [http://www.byond.com/members/?command=reference&path=operator%2Fin in] world)  //итерации над каждым объектом из world.contents (все атомы игрового мира) и берет для обработки только объекты типа <code>/obj/item/weapon/baton</code>
     B.name = "Smelly baton" //Will apply the new name to the baton in the current iteration loop
     B.name = "Smelly baton" //Присвоит новое имя предмету "baton" в текущей итерации


=== [http://www.byond.com/members/?command=reference&path=proc%2Fdo Do - While] ===
=== [http://www.byond.com/members/?command=reference&path=proc%2Fdo Do..While] ===


The Do while operator is not commonly used in SS13 code, Byond does support it tho.
Оператор Do..while обычно не используется в коде SS13, хотя BYOND его поддерживает.


   var/i = 3
   var/i = 3
Строка 235: Строка 239:
   while(i)
   while(i)


All loops understand the [http://www.byond.com/members/?command=reference&path=proc%2Fcontinue continue] and [http://www.byond.com/members/?command=reference&path=proc%2Fbreak break] commands
=== [http://www.byond.com/members/?command=reference&path=datum Определение объектов] ===
 
Неважно, хотите ли вы создать [http://www.byond.com/members/?command=reference&path=datum datum] или [http://www.byond.com/members/?command=reference&path=atom atom]-объект, определение объектов этих двух типов одинаково просто:
=== [http://www.byond.com/members/?command=reference&path=datum Defining objects] ===
   /obj/item/weapon/item1 //создаст новый объект типа obj.
Doesn't matter if you want a [http://www.byond.com/members/?command=reference&path=datum datum] or [http://www.byond.com/members/?command=reference&path=atom atom], the definition of objects is the same and simple:
     var/item_property = 5 //определяет новый тип переменных для всех объектов item1
   /obj/item/weapon/item1 //will nmake a new object of type obj.
     name = "Testing Item" //переменная name уже определена в родительских объектах, поэтому в этой строке только присваивается новое значение
     var/item_property = 5 //Will define a new variable type for all item1 objs
     name = "Testing Item" //The name var is already defined in parent objects so it is not defined here, but only assigned a new valie.
    
    
   /obj/item/weapon/item1/[http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FNew New()] //Constructor proc
   /obj/item/weapon/item1/[http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FNew New()] //Конструктор процедуры New()
     [[#..()|..()]] //should always be present in New() procs, see [[#..()|..()]] for more information
     [[#..()|..()]] //всегда присутствует в процедуре New(), см. <code>[[#..()|..()]]</code>
     item_property = 3 //An action that is performed in the object constructor.
     item_property = 3 //выполняемое действие в конструкторе объекта.


=== [http://www.byond.com/members/?command=reference&path=proc Procs] (Methods, functions, procedures) ===
=== [http://www.byond.com/members/?command=reference&path=proc Procs] (Методы, функции, процедуры) ===
You're used to the standards of methods, functions and procedures, right? Well procs ignore some aspects of these. They can best be compared to Java methods, as they're tied to specific objects. They cannot be defined as static, private, public, etc. tho. You can write static methods, however the compiler will not restrict you from calling them in a non-static way or environment. Same applies for non-static methods.
Вы привыкли к стандартным функциям и методам, верно? Ну, procs опускают несколько аспектов. Их можно сравнивать с методами Java, поскольку связаны с конкретными объектами. Они не могут быть определены как static-, private-, public-методы. Статичные методы можно написать, однако компилятор не будет наказывать за вызов функции нестатическим способом или в нестатической среде. То же применимо к нестатичным методам


   proc/proc_name(var/argument1, var/argument2)
   proc/proc_name(var/argument1, var/argument2)
     [http://www.byond.com/members/?command=reference&path=world world] << "[argument1] [argument2]"
     [http://www.byond.com/members/?command=reference&path=world world] << "[argument1] [argument2]"


The above would declare a global proc. If you wish to tie it to a certain level
Код выше определяет глобальнукю процедуру. Если вы хотите привязать его на конкретный уровень


==== ..() ====
==== ..() ====
This is the same as super() in Java. It calls the parent object type's proc with the same name and same arguments.
То же самое, что и <code>super()</code> из Java. Вызывает процедуру родительского класса с тем же именем и параметрами.


Example:
Пример:
   /obj/item
   /obj/item
     name = "Item"
     name = "Item"
    
    
   /obj/item/New() //New() is the proc that gets called whenever a new object of this type is created. A constructor if you will.
   /obj/item/New() //New() вызывается при создании объекта данного типа. Конструктор, если угодно.
     src.name = "It's an item!"
     src.name = "It's an item!"
    
    
Строка 272: Строка 274:
     ..()
     ..()


If you have the code from the example above and create a new object of type /obj/item/stack, it will first make the item in the game world with the name "Stack", because it's defined to be that by default. Then the New() proc will be called immedietally after. This will change the name to "It's a Stack!" but the call of the parent type's New() proc with the ..() command will then set it to "It's an item!". So in the end, the new object will be called "It's an item!". The ..() command is however very important in many cases as some things are defined only in the common parent's New() procs. In Del(), the proc which gets called prior to an object's deletion, it requires the code to get to the root Del() proc to even delete it. See examples of Del() in the code.
При наличии кода, похожего на пример выше и создании нового объекта типа <code>/obj/item/stack</code>, сначала в мире появится объект с именем "Stack", поскольку это определено по умолчанию. Следом сразу будет вызвана процедура New(). Это изменит имя объекта на "It's a Stack!" но вызов New() родительского типа командой ..() назначит имя "It's an item!". В конце концов, объект получит имя "It's an item!". Команда ..() важна во многих ситуациях, когда что-то определено только в процедуре New() родителя. В Del(), процедуре, которая вызывается преимущественно при удалении объекта, от кода потребуется перейти к корневому Del(), даже чтобы удалить его. Примеры Del() можно найти в коде.


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


=== [http://www.byond.com/members/?command=reference&path=atom%2Fproc%2FNew New()] ===
=== [http://www.byond.com/members/?command=reference&path=atom%2Fproc%2FNew New()] ===
This proc is called whenever a new instance of the object is created. It can have arguments if needed. It should call ..() where applicable so that parent constructors can be applied.
Процедура вызывается каждый раз, когда создается экземпляр объекта. При необходимости можно присвоить аргументы. Должна вызвать ..() где это применимо, чтобы сработали родительские конструкторы.


If you wish to create a New() proc for [[#Variable types|atoms]] with custom arguments, ensure the first argument is for the object's location. Example:
Если у вас возникла необходимость в процедуре New() для [[#Variable types|atoms]] с отдельым набором аргументов, убедитесь, что первый аргумент определяет локацию объекта. Пример:
   obj/item/weapon/my_item/New(var/location, var/i)
   obj/item/weapon/my_item/New(var/location, var/i)
     ..()
     ..()
     //Whatever else you need to do
     //Код и все, что он делает


To make a general object use
Для создания основного объекта
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /datum/test_datum
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /datum/test_datum
To make an atom (which usually has a locaiton)
Для создания atom (обычно имеет локацию)
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /obj/item/weapon(src.loc)
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /obj/item/weapon(src.loc)
For the custom example above, the code to create a new such object would be: The 5 is just an example of a value which could be assigned to the var/i in the constructor.
Для создания своего объекта из примера выше, код будет выглядеть так: цифра 5 - пример значения, примененного к var/i в конструкторе.
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /obj/item/weapon/my_item(src.loc, 5)
   [http://www.byond.com/members/?command=reference&path=proc%2Fnew new] /obj/item/weapon/my_item(src.loc, 5)
Where src is the proc owner, which contains the line above. src.loc is the locaiton of the src object.
где src - владелец процедуры, содержит строку выше. src.loc - локация объекта src.


=== [http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FDel Del()] ===
=== [http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FDel Del()] ===
This proc gets called before an object's delection. It MUST call ..() at the end as the actual deletion is done in the root Del() proc.
Процедура, вызываемая перед удалением объекта. Она ДОЛЖНА вызвать ..() в конце, поскольку само удаление происходит в корневой процедуре Del().


An object is deleted by using the del(O) proc with O being the object to be deleted.
Объект удаляется при вызове del(O), где O - объект, подлежащий удалению.


=== attack_hand(mob/M as mob) ===
=== attack_hand(mob/M as mob) ===
Whenever a user (M) clicks on the object with an empty active hand
Вызывается, когда user (M) нажимает на объект пустой активной рукой


=== attack_paw(mob/M as mob) ===
=== attack_paw(mob/M as mob) ===
Whenever a monkey (M) clicks the object with an empty active hand
Вызывается, когда monkey (M) нажимает на объект пустой активной рукой


If a custom attack_paw(mob/user) proc is not written for an atom, it defaults to calling attack_hand(user)
Если своей вариации attack_paw(mob/user) для atom не было расписано, по умолчанию вызовется attack_hand(user)


=== attack_ai(mob/user) ===
=== attack_ai(mob/user) ===
Whenever an AI or cyborg clicks the object with an empty active hand
Вызывается, когда ИИ/киборг нажимает на объект пустой активной рукой


If a custom attack_ai(mob/user) proc is not written for an atom, it defaults to calling attack_hand(user)
Если своей вариации attack_ai(mob/user) для atom не было расписано, по умолчанию вызовется attack_hand(user)


=== attack(mob/M as mob, mob/user as mob) ===
=== attack(mob/M as mob, mob/user as mob) ===
When the object is used to attack mob M by mob user
Вызывается, когда объект использовался для атаки моба M со стороны user


=== attackby(obj/item/W, mob/user) ===
=== attackby(obj/item/W, mob/user) ===
When the object is being attacked by user with W (Example: If you click on wires with wirecutters)
Вызывается, когда объект атакован user при помощи W (Пример: клик по проводам кусачками)


=== ex_act(severity) ===
=== ex_act(severity) ===
How the item reacts to explosions. Severity can either be 1, 2 or 3 with 1 being the most destructive.
Определяет реакцию объекта на взрыв (severity=1-3, 1 - наиболее разрушительный).


=== blob_act() ===
=== blob_act() ===
How the item reacts to a blob (magma) attack
Определяет реакцию предмета на атаку блоба (магмы)


=== emp_act(severity) ===
=== emp_act(severity) ===
How the item reacts to an EMP. Severity can either be 1 or 2 with 1 being the more powerful EMP surge.
Определяет реакцию предмета на ЭМИ (severity=1-2, 1 - более серьезные последствия).


=== [http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FTopic Topic(href, href_list)] ===
=== [http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FTopic Topic(href, href_list)] ===
This one's called when you click a link in a pop-up window. Like when you increase the output of SMES cells. The href_list variable is the important one as it's a parsed version of the arguments you add into a link. To make a link in the pop-up window, add the following line to the text you display (dat in the example):
Вызывается при нажатии на ссылку во всплывающем окне. Пример: увеличение выходной мощности на ячейках SMES. Переменная href_list важна, поскольку является
проанализированной версией аргументов, которые вы добавляете в ссылку. Для создания ссылки во всплывающем окне, добавьте в отображаемый текст следующее:
   <nowiki>dat += </nowiki>[http://www.byond.com/members/?command=reference&path=proc%2Ftext text](<nowiki>"<A href='?src=\ref[src];select=[i]'>[src.name]</a><br>")</nowiki>
   <nowiki>dat += </nowiki>[http://www.byond.com/members/?command=reference&path=proc%2Ftext text](<nowiki>"<A href='?src=\ref[src];select=[i]'>[src.name]</a><br>")</nowiki>
Check the code for more examples of this.
Примеры использования ищите в коде.


=== process() ===
=== process() ===
This gets called for all objects on every tick. If possible, avoid it as it's processor heavy, but for some things it just can't be avoided.
Вызывается для всех объектов в каждом тике. Избегайте использования данной процедуры, если возможно, поскольку сильно грузит процессор. Учитывайте, что для некоторых механик избежать её использования нельзя.


== SS13 common variable meanings ==
== Значение основных переменных SS13 ==


=== Datum ===
=== Datum ===


Datums have the smallest number of pre-defined variables. These are present in all objects in the game:
Datum-объекты располагают минимальным числом предопределенных переменных. Они присутствуют во всех объектах в игре:
   type //The type of an object. If your object is of type /obj/item/weapon/shovel writing the following: new src.type(src.loc) will make another shovel in the same tile.
   type //Тип объекта. Если объект имеет тип /obj/item/weapon/shovel (лопата), то выражение: new src.type(src.loc) создаст еще одну лопату в том же тайле.
   parent_type //Parent type of /obj/item/weapon/shovel is /obj/item/weapon... seems streight-foward enough.
   parent_type //Родительский тип для /obj/item/weapon/shovel - это /obj/item/weapon.
   tag //The tag is used to help you identify things when using several instances. It has to be set manually for each instance tho. Lazy coders and mappers resulted in not many tags being used. Instances in the map editor are sorted by tag.
   tag //Тег используется для помощи в идентификации при использовании нескольких экземплров одного объекта. Он должен быть настроен вручную для каждого экземпляра. Ленивые кодеры и мапперы в результате не используют слишком много тегов. Экземпляры в редакторе карт сортируются по тегам.
   vars //List of object vars the datum has defined
   vars //List of object vars the datum has defined


=== Atom ===
=== Atom ===


These variables are shared by all areas, mobs, objs and turfs.
Эти переменные делятся между всеми area, mob, obj, turf.


   contents //List of contents. Closets store their contents in this var as do all storage items. All the items on a turf are in the turf's contents var.
   contents //Список содержимого. Пример: шкафчики хранят содержимое в этой переменной, как и все предметы-контейнеры. All the items on a turf are in the turf's contents var.
   density //If density is at 0, you can walk over the object, if it's set to 1, you can't.
   density //Плотность, при значении 0, игрок сможет пройти через объект, при значении 1 - не сможет.
   desc //Description. When you right-click and examine an object, this will show under the name.
   desc //Описание. Отображает текст под именем объекта при его подробном изучении (Shift+ЛКМ или ПКМ->Examine).
   dir //Object direction. Sprites have a direction variable which can have 8 'legal' states.
   dir //Направление объекта. Спрайты обладают перменной направления, которая может принимать до 8 действительных состояний.
   gender //not used
   gender //Не используется(?)
   icon //The dmi file where the sprite is saved. Must be written in single quotations (Example: 'items.dmi')
   icon //Файл формата .dmi, в котором сохранены спрайты. Выделить одиночными кавычками. (Пример: 'items.dmi')
   icon_state //The name of the sprite in the dmi file. If it's not a valid name or is left blank, the sprite without a name in the dmi file will be used. If such a sprite doesn't exist it will default to being blank.
   icon_state //Наименование спрайта в файле .dmi. Если имя не задано или не подходит по требованиям, то будет использоваться безымянный спрайт из этого файла. Если же имя не соответствует какому-либо спрайту, то по умолчанию будет использоваться пустой.
   invisibility //Invisibility is used to determine what you can and what you can't see. Check the code or wait for someone who knows how exactly this works to write it here.
   invisibility //Невидимость, определяет, что можно будет увидеть, а что - нельзя.  
   infra_luminosity //Only mecha use this
   infra_luminosity //Инфракрасное освещение. Используется только мехами.
   underlays //List of images (see image() proc) which are underlayed under the current sprite
   underlays //Список изображений (см. процедуру image()), находящихся НИЖЕ текущего спрайта.
   overlays //List of images (see image() proc) which are overlayed over the current sprite
   overlays //Список изображений (см. процедуру image()), находящихся ВЫШЕ текущего спрайта.
   loc //Contains a reference to the turf file where the object currently is.
   loc //Содержит ссылку на turf-файл, в котором находится объект в данный момент.
   layer //A numerical variable which determins how objects are layered. Tables with a layer of 2.8 are always under most items which have a layer of 3.0. Layers go up to 20, which is reserved for HUD items.
   layer //Слой. Численная переменная, определяющая распределение объектов по слоям. Столы со значением слоя 2.8 всегда расположены под большинством объектов, которые имеют значение слоя 3.0. Можно назначать до 20, который зарезервирован для отображения HUD.
   luminosity //How much the item will glow. Note that the picking up and dropping of luminous items needs to be specially handled. See flashlight code for an example.
   luminosity //Освещение. Определяет, с какой силой объект излучает свет. Заметьте, что подбор и сброс излучающих свет объектов нужно обрабатывать особым образом. За примером можно обратиться к коду фонарика.
   mouse_over_pointer //not used
   mouse_over_pointer // не используется
   mouse_drag_pointer //(almost) not used
   mouse_drag_pointer //(почти) не используется
   mouse_drop_pointer //not used
   mouse_drop_pointer //не используется
   mouse_drop_zone //not used
   mouse_drop_zone //не используется
   mouse_opacity //Used in a few places. Check the description in the reference page
   mouse_opacity //редко используется, см. на странице источника.
   name //The name of the object which is displayed when you right click the object and in the bottom left of the screen when you hover your mouse over it.
   name //Наименование объекта, отображается в строке состояния в левом-нижнем углу экрана или при осмотре предмета (Shift+ПКМ или ПКМ->Examine)
   opacity //Whether you can see through/past it (glass, floor) when set to 0 or whether you can't (walls, mecha) when set to 1.
   opacity //Прозрачность. Определяет, можно ли видеть что-либо за этим объектом. Значение 0 для объектов, просматриваемых насквозь (окна, пол, решетки), 1 для непрозрачных объектов (стены, мехи, закрытые шлюзы без окон).
   pixel_x //How many pixels in the x direction should the sprite be offset from the starting set. See the APC's New() proc for an example and how fire alarms are defined on the map. pixel_x = -5 will move it 5 pixels to the left and pixel_x = 5 will move it 5 pixels to the right
   pixel_x //Смещение по оси Х относительно исходной позиции в пикселях. pixel_x = -5 сдвинет объект на 5 пикс влево, pixel_x = 5 сдвинет на 5 пикс вправо. Пример: Метод New() для ЛКП (APC), также можно понаблюдать, как пульт управления пожарной сигнализацией определен на карте.
   pixel_y //Same as pixel_y but in the y direction. Positive values move it to the north, negative to the south.
   pixel_y //Смещение по оси Y относительно исходной позиции в пикселях. pixel_y = -5 сдвинет объект на 5 пикс вниз (южнее), pixel_y = 5 сдвинет на 5 пикс вверх (севернее).
   pixel_z //Used in isometric maps, so it's not used in SS13
   pixel_z //Применяется в изометрических картах, в SS13 не используется.
   suffix //Rarely used. See the reference page for more information
   suffix //Редко используется. См. в источнике.
   text //How to represent the object on text clients. Not used.
   text //Представление объекта в текстовых клиентах. Не используется.
   type //The type of the object
   type //Тип объекта
   vars //See [[#Datum|Datum]] above
   vars //См. [[#Datum|Datum]]
   verbs //The verbs you can use with the item. Verbs are the options in the right click menu.
   verbs //Действия контекстного меню, которые можно совершить над объектом (появляются при нажатии ПКМ на объекте).
   x //X position, read only. Set the loc variable to move it or use the inbulit functions.
   x //Координата по X, только чтение. Измените значение переменной loc, чтобы сдвинуть объект, или используйте встроенные функции.
   y //Y position, read only.  
   y //Координата по Y, только чтение.  
   z //Z position (Which z-level it's on), read only.
   z //Координата по Z, только чтение (cектор, Z-level).


=== Area ===
=== Зоны (Area) ===


   var/requires_power = 1 //Areas which are to work without an APC (Such as centcom areas) should have this at 0. All other areas should have it at 1.
   var/requires_power = 1 //Необходимость в питании. Установлено на 0 для зон, которым не нужны ЛКП (APC) для работы оборудования (такие, как Центральное Командование). Всем остальным установлено значение 1.
   var/music = null //Music to be played when you enter the area.
   var/music = null //Музыкальная композиция, которая проигрывается при входе в зону.
   [http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity luminosity] = 0 //Areas which should be lit at all times (such as space and centcom) should have this at 1 as well as the sd_lighting var at 0
   [http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity luminosity] = 0 //Освещенность. Установлено на 1 для зон, которые должны быть освещены все время (космос, Центральное Командование). Динамическое освещение при этом выключено (sd_lightning = 0).
   var/sd_lighting = 0 //This var determines whether dynamic lighting is to be calculated for the area's tiles. Turn this to off only for areas which have the luminosity var set to 1
   var/sd_lighting = 0 //Динамическое освещение. Необходимость рассчитывать освещенность тайлов этой зоны. Выключите, если освещенность для зоны включена (luminosity = 1).


Most other variables exist only for technical reasons and should not be messed with unless done through existing procs, they are defined in:
Большинство остальных переменных существуют только в технических целях и не должны затрагиваться, кроме как в существующих процедурах, в которых были определены:
   [https://github.com/tgstation/-tg-station/blob/master/code/game/area/Space%20Station%2013%20areas.dm code/game/area/Space Station 13 areas.dm]
   [https://github.com/tgstation/-tg-station/blob/master/code/game/area/Space%20Station%2013%20areas.dm code/game/area/Space Station 13 areas.dm]  


=== Mob ===
=== Мобы (Mob) ===


There is a huge amount of variables for mobs. Take a look at the following files:
Для мобов определено огромное количество переменных. Взгляните на следующие файлы:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/mob.dm code/defines/mob/mob.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/mob.dm code/defines/mob/mob.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/dead/observer.dm code/defines/mob/dead/observer.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/dead/observer.dm code/defines/mob/dead/observer.dm]
Строка 402: Строка 405:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/living/silicon/ai.dm code/defines/mob/living/silicon/ai.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/living/silicon/ai.dm code/defines/mob/living/silicon/ai.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/living/silicon/robot.dm code/defines/mob/living/silicon/robot.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/mob/living/silicon/robot.dm code/defines/mob/living/silicon/robot.dm]
There are also additional files for aliens, larva, facehuggers and more there, but the files above will have most of the variables you might need.
Также существуют дополнительные файлы для чужих, лярв, лицехватов и т.п. существ, но файлы выше содержат большинство переменных, которые вам понадобятся.


=== Obj ===
=== Объекты (Obj) ===


   var/m_amt = 0 // How much metal the item has. Used to determine how much metal you get when feeding it into an autolathe and how much it costs to produce it at the lathe
   var/m_amt = 0 // Содержание металла в объекте. Используется для определения количества металла (Metal), которое будет получено после переработки предмета в автолате (или же потребуется для его производства).
   var/g_amt = 0 // How much glass the item has. Used to determine how much glass you get when feeding it into an autolathe and how much it costs to produce it at the lathe
   var/g_amt = 0 // Содержание стекла в объекте. Используется для определения количества стекла (Glass), которое будет получено после переработки предмета в автолате (или же потребуется для его производства).
   var/w_amt = 0 // waster amounts. Not used
   var/w_amt = 0 // Содержание отходов. Не используется
   var/origin_tech = null //Used by R&D to determine what research bonuses it grants. See examples in item definitions in code.
   var/origin_tech = null //Используется для определения размера бонусов исследования, которые получит Отдел Исследований (РнД). Примеры смотрите в коде объектов.
   var/reliability = 100 //Used by SOME devices to determine how reliable they are. The number represents the percentual chance for them to work properly.
   var/reliability = 100 //Используется некоторыми устройствами для определения их надежности - величины шанса в процентах, что предмет сработает, как надо.
   var/unacidable = 0 //universal "unacidabliness" var, objects with this set to 1 cannot be destroyed by acids.
   var/unacidable = 0 //Невосприимчивость к кислотам. При значении 1 объект нельзя уничтожить кислотой.
   var/throwforce = 0 //The amount of damage applies to a target when they're hit by the item.
   var/throwforce = 0 //Количество урона, который пройдет по целевому объекту при броске в него другим предметом.


More variables are defined in:
Больше переменных здесь:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj.dm code/defines/obj.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj.dm code/defines/obj.dm]


==== Item ====
==== Предметы (Item) ====


Items are objs which can be picked up. They're divided into several categories according to their function.
Предметы (Items) - объекты, которые игрок может поднять. В зависимости от их функционала они делятся на несколько категорий.


/obj/item is defined in the following file:
/obj/item определен в файле:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj.dm code/defines/obj.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj.dm code/defines/obj.dm]


It adds the following variables (Look at the file for more, but these are the more important ones):
Он добавляет следующие переменные (Далее идут только самые основные, см. файл для полного списка):
   var/force = null //This determins how much damage the target takes when they're attacked by the item in hand. Small items usually have it at 0, medium ones between 5 and 10, rare and powerful items around 10-15 and two-handed items at 15 and more. Syndicate items have it even higher at 40 and more.
   var/force = null //Сила удара. Определяет размер урона, который получит цель при ударе предметом в руке. Малые предметы обычно не наносят урона, средние наносят 5-10 единиц урона, редкие и мощные предметы могут нанести 10-15 единиц урона, двуручные - от 15 единиц, и т.д. Предметы синдиката могут наносить от 40 единиц урона и выше.
   var/item_state = null //This it the var that determines which sprite will be used for the item from icons/mob/items_lefthand.dmi and items_righthand.dmi.
   var/item_state = null //Определяет, какой спрайт будет использоваться для предмета в руке из файлов icons/mob/items_lefthand.dmi и items_righthand.dmi.
   var/damtype = "brute" //Determines what damage type the item produces.
   var/damtype = "brute" //Тип урона, наносимый предметом.
   var/health = null //Some items use this to determine when they'll break from use or damage. Not common tho.
   var/health = null //Прочность предмета. Используется в некоторых случаях для того, чтобы определить, может ли предмет сломаться при использовании или получении урона.
   var/hitsound = null //Sound that's played when you hit something with the item. Not commonly used.
   var/hitsound = null //Звук, который будет воспроизводиться при ударе этим предметом. Используется нечасто.
   var/w_class = 3.0 //Weight class.
   var/w_class = 3.0 //Вес (а точнее, габариты) предмета.
     // w_class = 1 means it's an item that can fit in a pocket (diskette, pen, cigarette packet)
     // w_class = 1 - предмет маленький и может поместиться в карманах (дискета, ручка, пачка сигарет)
     // w_class = 2 means the item can't fit in pockets but can fit in a box (clipboard, analyzer, cleaner)
     // w_class = 2 - предмет небольшой, не лезет в карман, но легко помещается в коробку (папка для бумаг, анализатор, распылитель)
     // w_class = 3 means the item can't fit in a box but can fit in backpacks (box, rods, metal)
     // w_class = 3 - предмет средних размеров, не помещается в коробке, но можно переносить в рюкзаке (коробки, листы металла, металлические прутья)
     // w_class = 4 means the item can't even fit in a backpack (packpack, pickaxe, fireaxe)
     // w_class = 4 - предмет крупный и не лезет даже в рюкзак (рюкзак, кирка, пожарный топор)
     // w_class = 5 is used but not for weight classes.
     // w_class = 5 - предмет имеет неопределенные габариты.
   var/wielded = 0 //Used for double-handed items which can be carried in one hand but needs to be wielded by two hands before they can be used. This is determined by code when wielding and unwielding. All items should start with this at 0.
   var/wielded = 0 //Используется для двуручных предметов, которые можно переносить в одной руке, но требуют хват двумя руками для их использования. Условия, при которых происходит переход между хватом двумя руками (wielding) и переносом в оной руке (unwielding) описываются в коде. Все предметы вначале имеют значение этой переменной на 0.
   var/twohanded = 0 ///Set this to 1 if your item is two-handed.
   var/twohanded = 0 // Установите на 1, если предмет двуручный.
   flags = FPRINT | TABLEPASS //Flags
   flags = FPRINT | TABLEPASS //Флаги


==== Machinery ====
==== Машины (Machinery) ====


Defined in:
Определены в:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj/machinery.dm code/defines/obj/machinery.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/obj/machinery.dm code/defines/obj/machinery.dm]


Machinery are objs which cannot be picked up and generally require power to operate. They have the following vars defined for all of them:
Машины (Machinery) - объекты, которые не могут быть подняты и как правило требуют питание для работы. Для них определены следующие переменные:
   var/use_power = 0 //Determines if and how much power the machine will use each tick.
   var/use_power = 0 //определяет, будет ли машина потреблять энергию, а также её количество.
     //use_power = 0 - no power is used
     //use_power = 0 - энергия не используется
     //use_power = 1 - idle power is used
     //use_power = 1 - пассивное электропотребление
     //use_power = 2 - active power is used
     //use_power = 2 - активное электропотребление
   var/idle_power_usage = 0 //How many watts of power the machine will use each tick when use_power is set to 1
   var/idle_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в пассивном режиме (use_power = 1) в один игровой тик
   var/active_power_usage = 0 //How many watts of power the machine will use each tick when use_power is set to 2
   var/active_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в активном режиме (use_power = 2) в один игровой тик
   var/power_channel = EQUIP //Determines which APC power category the device falls under. EQUIP, ENVIRON or LIGHT
   var/power_channel = EQUIP //Определяет категорию устройства на ЛКП (APC). EQUIP (цепь для оборудования), ENVIRON (цепь для систем жизнеобеспечения) или LIGHT (цепь освещения).
   var/list/component_parts = null //A list of parts needed to construct the machine from a machine frame.
   var/list/component_parts = null //Список частей, которые потребуются помимо платы для сборки машины в корпусе (machine frame).


=== Turf ===
=== Покрытие (Turf) ===


   var/intact = 1 //This determines if the turf will hide pipes, cable and such. Set to 1 to hide and to 0 to not hide them. Only pipes and wire with level set to 1 will be hidden. Set their level var to 2 to keep them from being hidden.
   var/intact = 1 //Определяет, будет ли покрытие скрывать под собой коммуникации (трубы, проводку и т.п.). Значение 1 будет скрывать коммуникации, 0 - не будет. Скрыты будут только трубы и провода с установленным level=1. Установите level=2, чтобы не скрывать коммуникации.
   var/blocks_air = 0 //Determines if the turf prevents air from passing (walls) if set to 1.
   var/blocks_air = 0 //Определяет воздухопроницаемость. Не пропускает воздух при значении 1.
Other variables exist but they're tied to atmospherics code which is not to be touched as whenever anything is changed in it it results in a million things breaking.
Существуют и другие переменные, но которые тесно связаны с атмосферикой, код которой крайне не рекомендуется трогать, чтобы не сломать вообще все.
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/turf.dm code/defines/turf.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/turf.dm code/defines/turf.dm]


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


Simulated floors are tiles which simulate air movement and temperature. The station is made entirely from these while centcom is made from unsimulated floors to prevent massive and unneeded lag.
Симулируемые полы (simulated floors) - это тайлы, которые симулируют движение воздушных масс и температуру. Станция практически полностью состоит из таких, тогда как Центральное Командование использует несимулируемые полы, чтобы не допустить массивных и ненужных лагов.


   var/wet = 0 //If this it a positive number, it is wet and you'll slip on it if you run.
   var/wet = 0 //Мокрый пол. При значении 1 игрок поскользнется при пробеге по нему.
   var/thermite = 0 //Will be set to 1 when thermite is poured on it.
   var/thermite = 0 //Термитный слой. Принимает значение 1, когда на тайл вылит термит.


===== Simulated floors =====
===== Симулируемые полы (Simulated floors) =====


   var/icon_regular_floor = "floor" //Determines what icon the steel version of the floor should have. Determined at floor creation (New() proc). If the icon_state of the floor at that point is one from the global icons_to_ignore_at_floor_init var, then this variable is assigned the value "floor". The icons_to_ignore_at_floor_init list contains broken, plating, burnt and non-steel icon_states from icons/turf/floors.dmi
   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 //When a fire (hotspot) on the tile exceeds this number, the floor has a chance of melting. The more the number is exceeded, the higher the chance of melting.
   heat_capacity = 10000 //Когда очаг возгорания на тайле превышает это число, пол с некоторым шансом может расплавиться. Чем выше число, там выше шанс расплавления.
   var/broken = 0 //This mostly only determins if you'll get the tile back when you use the crowbar
   var/broken = 0 //В основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Сломанные плитки пропадают при снятии с пола.
   var/burnt = 0 //This mostly only determins if you'll get the tile back when you use the crowbar
   var/burnt = 0 //TВ основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Обоженные плитки пропадают при снятии с пола.
   var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/steel //What floor tile is on the tile
   var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/steel //определяет, какая плитка лежит на полу


Simulated floors are defined in:
Симулируемые полы определены в файле:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/game/turf.dm code/game/turf.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/game/turf.dm code/game/turf.dm]


===== Simulated walls =====
===== Симулируемые стены (Simulated walls) =====


Doesn't really contain any special new variables.
Особо отличающихся переменных не содержат.


Defined in:
Определены в:
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/turf.dm code/defines/turf.dm]
   [http://code.google.com/p/tgstation13/source/browse/trunk/code/defines/turf.dm code/defines/turf.dm]




[[Category:Guides]] [[Category:Game Resources]]
[[Category:Guides]] [[Category:Game Resources]]
{{Contribution Guides}}
{{Contribution Guides}}

Текущая версия от 14:15, 30 декабря 2022

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