Структура кода SS13: различия между версиями

Материал из SS220 Paradise Wiki (SS13)
Перейти к навигации Перейти к поиску
м (Ohar переименовал страницу Understanding SS13 Code в Структура кода SS13: Русификация названия)
(Перевод статьи)
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
Other related guides: [[SS13 for experienced programmers]] and [[Guide to mapping]]


'''NOTE!!''' This guide uses terms very loosely. Experienced coders, please don't get at me over what an object is and what a method and so forth. This guide is intended '''solely for the new coder.''' The rest of you... don't read it as you'll only get mad at me.
Также прочтите: [[SS13 для опытных программистов]] и [[Руководство по маппингу]]


==DreamMaker==
==DreamMaker==


The program you will need for both coding and mapping is made out of six major components. The file tree, the object tree, the text editor, the icons editor, the map editor and the error report panel.
Программа, которая потребуется для написания кода и маппинга, состоит из шести основных компонентов. Файловое дерево, дерево объектов, текстовый редактор, редактор иконок, редактор карт и панель отчета об ошибке.


=== File tree ===
=== Файловое дерево ===


The file tree can be accessed by choosing the 'File' tab in the left-hand vertical panel. It shows the files which make up the code as they are sorted by folders. Double clicking any file will open it in it's respective editor. If you add a new file to the list (in windows explorer) hit the refresh button to refresh the list. The ticks next to files indicate if they're used in the compiling of the code. A common mistake is to forget to include a new file.
Доступно во вкладке 'File' в левой вертикальной панели. Оно отображает файлы, которые составляют код игры, и рассортированы по папкам. Двойной клик по файлу откроет его в соответствующем редакторе. Если вы добавите новый файл в список (в Проводнике Windows), обновите список, нажав на кнопку 'Refresh'. Значок рядом с именем файла означает, что он используется в компилируемом коде. Частая ошибка - забыть импортировать новый файл.


=== Objects tree ===
=== Дерево объектов ===


What an object is is explained [[#What is an object?|further down]] in this guide, but for now we can say it contains a list of things, which you can place on the map. They are arranged in a hierarchy. This is also explained and described further down in the guide. The update button at the bottom will update the tree with new sprites and objects, if they have been added in any of the ticked .dm files.
О том, что такое объект, [[#Что такое объект?|читайте ниже]] в этом руководстве, но пока скажем, что это дерево содержим список всего, что помещается на карту. Они расположены в определенной иерархии. Об этом также читайте ниже в гайде. Кнопка 'Update' внизу обновит дерево и дополнит его новыми спрайтами и объектами, если они были добавлены в любой из отмеченных .dm файлов.


=== Text editor ===
=== Текстовый редактор ===


This editor is accessed whenever you open a file with the extension ".dm". It is intended for the writing and editing of the game code.
Данный редактор становится доступным, когда вы открываете файл с расширением .dm. Он предназначен для написания и редактирования кода игры.


=== Icons editor ===
=== Редактор иконок ===


Intended for the editing of icon states and icons, it is accessed when you open a ".dmi" file. It displays a list of all the sprites (often called icon states) which are in the file. Rightclicking anywhere will yield the options to create a new movie or pixmap. A pixmap is a static image, while a movie is either an icon state which can point in several different directions (often called dirs) or is animated. The movie can have either 1 (south), 4 (NSEW) or 8 directions (full compass). Also note that a .dmi file may only have icons of a certain size. In the case of the singularity, which grows as it gains power, several .dmi files are needed.
Используется для редактирования иконок и их состояний, доступен, когда открывается файл с расширением .dmi. Отображает список всех спрайтов (часто называемых состояниями иконок) в файле. ПКМ в любом месте оуна отобразит опции для создания новой карты или ролика. Карта - статическое изображение, ролик - состояние иконки в одном из направлении или анимация. Ролик можем иметь одно направление (Юг), четыре (Север-Юг-Восток-Запад) или восемь (компас). Также заметьте, что в одном .dmi файле могут быть только иконки одного определенного размера. Для таких объектов, как сингулярность (которая, набирая силу, увеличивается в размерах), может потребоваться несколько .dmi-файлов.


=== Map editor ===
=== Редактор карт ===


Usually opened at startup or when opening a ".dmm" map file, the map editor displays the map. By default it displays all 4 major groups: area, mob, object and turf. To choose the specifics of what to display, hit the layers tab in the top-most toolbar and select 'Only show selectable layers' and then choose which layers you want to be shown in the same (layers) tab. (Most commonly used to hide the areas overlay). Note that the map will not display if there are any errors in the .dm code. Correct any errors and then recompile it.
Обычно открывается, при запуске DreamMaker или при открытии файла с расширением .dmm. Редактор карт отображает (удивительно!) игровую карту. По умолчанию отображает все 4 основные группы объектов: зоны, мобы, объекты и покрытия. Чтобы выбрать параметры отображения, перейдите на вкладку «Слои» на самой верхней панели инструментов и выберите 'Only show selectable layers' («Показывать только выбираемые слои»), а затем выберите, какие слои вы хотите отображать на той же вкладке. Наиболее часто это используется для скрытия областей наложения. Обратите внимание, что карта не будет отображаться, если в коде .dm есть какие-либо ошибки. Исправьте все ошибки, а затем перекомпилируйте его.


=== Error report panel ===
=== Панель отчета об ошибке ===


A text-based panel at the bottom of DreamMaker, the error report panel is intended to provide compiling error reports.
Текстовая панель в нижней части DreamMaker, предназначенная для составления отчетов об ошибках.


=== Compile and run ===
=== Компиляция и запуск ===


To compile updated code without running it, select the 'build' tab in the uppermost toolbar and shoose 'compile'. To compile and run hit the 'run' button in the same tab.
Для компиляции обновленного кода без его запуска, выберите вкладку 'Build' (Сборка) и нажмите 'Compile' (Компилировать). Для компиляции и запуска выберите 'Build' > 'Run'.


==Code components==
==Компоненты кода==


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


Variables are intended to store data. Variables are created like this: (creates variable with no defined value)
Переменные предназначены для хранения данных. Переменные создаются следующим образом: (без определения значения переменной)
var/i
 
  var/i
 
Чтобы объявить переменную и её значение:


To define a value in declaration do this:
   var/i = 5
   var/i = 5
or
   var/j = "Hello World"
   var/i = "Hello World"


Once a variable has been defined, you cannot define another one with the same name:
Как только переменная была объявлена, вы можете объявить другую с тем же именем:
   var/i
   var/i
   i = 2
   i = 2
Строка 54: Строка 54:
   i = 12
   i = 12


==== List ====
==== Список ====
[http://www.byond.com/members/?command=reference&path=list reference]
[http://www.byond.com/members/?command=reference&path=list Источник]


A list can be defined as either of the three, but special variables associated with lists (such as len for length) will only be available if you use the first declaration.
Список может быть объявлен одним из трех способов, но переменные, ассоциируемые со списками (<code>len</code> для получения длины списка), будут доступны только если были объявлены первым способом.
   var/list/a
   var/list/a
   var/a[9]
   var/a[9]
   var/a = list()
   var/a = list()


==== Other types ====
==== Другие типы ====
 
Если вы хотите сохранить монетку где-то в переменных объекта и использовать определенные процедуры или переменные монетки, вам нужно определить переменную, в которой вы храните монету как монету. Второй пример также создает переменную с именем D и заполняет ее новой монетой.


If you wish to store a coin in somewhere in the variables of an object and use the coin's defined procs or variables, you'll have to define the variable in which you store the coin as a coin. The second example also creates a variable called D and fills it with a new coin.
   var/obj/item/weapon/coin/C
   var/obj/item/weapon/coin/C
   var/obj/item/weapon/coin/D = new/var/obj/item/weapon/coin(src)
   var/obj/item/weapon/coin/D = new/var/obj/item/weapon/coin(src)


==== Included variables ====
==== Включенные переменные ====


Variables which are built into byond itself and are not defined anywhere in code:
Переменные, встроенные в сам BYOND и не определяемые нигде в коде:
<br>[http://www.byond.com/members/?command=reference&path=atom%2Fvar Atom vars]
<br>[http://www.byond.com/members/?command=reference&path=atom%2Fvar Атомарные переменные]
<br>[http://www.byond.com/members/?command=reference&path=client%2Fvar Client vars]
<br>[http://www.byond.com/members/?command=reference&path=client%2Fvar Клиентские переменные]
<br>[http://www.byond.com/members/?command=reference&path=datum%2Fvar Datum vars]
<br>[http://www.byond.com/members/?command=reference&path=datum%2Fvar Datum-переменные]
<br>[http://www.byond.com/members/?command=reference&path=mob%2Fvar Mob vars]
<br>[http://www.byond.com/members/?command=reference&path=mob%2Fvar Моб-переменные]


===== Direction (dir) var =====
===== Переменные направления (dir) =====
[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdir reference]
[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdir Источник]


'''North:''' 1<br>
'''Север:''' 1<br>
'''South:''' 2<br>
'''Юг:''' 2<br>
'''East:''' 4<br>
'''Восток:''' 4<br>
'''West:''' 8<br>
'''Запад:''' 8<br>
'''Northeast:''' 5 (1 + 4)<br>
'''Северо-восток:''' 5 (1 + 4)<br>
'''Southeast:''' 6 (2 + 4)<br>
'''Юго-Восток:''' 6 (2 + 4)<br>
'''Northwest:''' 9 (1 + 8)<br>
'''Северо-запад:''' 9 (1 + 8)<br>
'''Southwest:''' 10 (2 + 8)<br>
'''Юго-запад:''' 10 (2 + 8)<br>


They are numbered like this because dir uses the 'bitflag' methodology. It is defined in binary, so...
Направления пронумерованы таким образом, поскольку используют метод 'bitflag' (битовый флаг). То же в двоичном коде:


'''0001''' is north<br>
'''0001''' для севера<br>
'''0010''' is south<br>
'''0010''' для юга<br>
'''0100''' is east<br>
'''0100''' для востока<br>
'''1000''' is west
'''1000''' для запада<br>


Combining these numbers yields north-east (0101), north-west (1001), south-east (0110) and south-west (1010). Tho other combinations (east-west(1100), north-south (0011), north-east-west (1101) and such) are possible for special uses. Smoothwall code is an example.
Сложение направлений даст в итоге:


===== Atom vars =====
'''0101''' для северо-востока<br>
'''1001''' для северо-запада<br>
'''0110''' для юго-востока<br>
'''1010''' для юго-запада.


These apply to all /obj, /turf, /area, /mob -type objects.
Впрочем, другие комбинации (Восток-Запад (1100), Север-Юг (0011), Восток-Северо-Запад (1101) и т.п.) допустимы в особых случаях. (Пример: стены на станции).


'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fcontents Contents]: '''List of objects which are inserted into another object. (plasma tanks in radiation arrays, ore in the smelter, etc.)
===== Атомарные переменные =====
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdensity Density]: '''0/1 - 0 means your mob can pass through (or over), 1 means you cannot
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdesc Desc]: '''string - Description, displayed upon examine
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdir Dir]: '''1-10 - the direction the object is facing
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Ficon Icon]: '''The .dmi file which contains the sprite for the icon
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Ficon_state Icon_state]: '''The name of the sprite in the file from Icon
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Foverlays Overlays]: '''A list of images which are overlayed on the item.
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Flayer Layer]: '''If two objects are on the same tile and one has a higher layer number than the other, the one with the higher will be shown as above the one with the lower
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Floc Loc]: '''The X,Y,Z positioning of an item
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity Luminosity]: '''How much does it glow?
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fname Name]: '''The name, displayed when you hover your mouse over the item
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fopacity Opacity]: '''Can you see through it?
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fpixel_x Pixel_x], [http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fpixel_y pixel_y]: '''Set if the item on the map is nudged a few pixels to either side. Used with APC's, Request Consoles, Fire alarms, etc.
<br>'''[http://www.byond.com/members/?command=reference&path=datum%2Fvar%2Ftype Type]: '''Type is the path of the object. A coin would have it's type variable set to: /obj/item/weapon/coin


=== Included instructions ===
Применяются ко всем /obj, /turf, /area, /mob объектам.


Reference guides for included instructions (proc-s) can be found at the following links:
'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fcontents Содержимое (Contents)]: '''Список объектов, помещаемых в другие объекты. (Баки с плазмой в излучателе, руда в плавильне, и т.п.)
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdensity Плотность (Density)]: '''Двоичный флаг (0/1): 0 означает возможность пройти через объект, 1 - невозможность преодолеть его
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdesc Описание (Desc)]: '''Строка - Описание объекта, пишется при подробном осмотре (Examine)
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fdir Направление (Dir)]: '''1-10 - Направление объекта
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Ficon Иконка (Icon)]: '''Файл с разрешением .dmi, который содержит спрайт для иконки
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Ficon_state Состояние иконки (Icon_state)]: '''Название спрайта из файла
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Foverlays Наложения (Overlays)]: '''Список изображений, которые наложены на предмет.
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Flayer Слой (Layer)]: '''Если два объекта находятся на одном тайле и у одного из больше номер слоя, то этот объект будет показан над другим.
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Floc Координаты (Loc)]: '''Позиционирование предмета по X,Y,Z
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity Свечение (Luminosity)]: '''Насколько объект светится?
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fname Название (Name)]: '''Название предмета, которое будет отображаться при наведении на него
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fopacity Прозрачность (Opacity)]: '''Можно ли через него видеть?
<br>'''[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fpixel_x Смещение по X (Pixel_x)], [http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fpixel_y Смещение по Y (pixel_y)]: '''Установите, если элемент на карте смещен на несколько пикселей в любую сторону. Используется на [[Локальный контроллер питания|ЛКП]], Консолях запросов, Пожарных сигнализациях, и т.п.
<br>'''[http://www.byond.com/members/?command=reference&path=datum%2Fvar%2Ftype Тип (Type)]: '''Тип - это путь к объекту. У монетки эта переменная примет значение: <code>/obj/item/weapon/coin</code>
 
=== Приложенные инструкции ===
 
Справочные руководства для прилагаемых инструкций (procs) можно найти по следующим ссылкам:
<br>[http://www.byond.com/members/?command=reference&path=area%2Fproc Area procs]
<br>[http://www.byond.com/members/?command=reference&path=area%2Fproc Area procs]
<br>[http://www.byond.com/members/?command=reference&path=mob%2Fproc Mob procs]
<br>[http://www.byond.com/members/?command=reference&path=mob%2Fproc Mob procs]
Строка 124: Строка 132:
<br>[http://www.byond.com/members/?command=reference&path=obj%2Fproc Turf procs]
<br>[http://www.byond.com/members/?command=reference&path=obj%2Fproc Turf procs]


=== Conditionals ===
=== Условные операторы ===


Conditionals are statements which determine how the code will be executed, depending on a condition. The most common conditional is the IF statement
Условные операторы - это выражения, которые определяют, каким образом будет исполняться код, в зависимости от условия. Чаще всего используется выражение IF (ЕСЛИ).


==== = vs. == ====
==== = и == ====


   var/a
   var/a
Строка 137: Строка 145:
     world << "A is not 14"
     world << "A is not 14"


As in the example above, the single = means you assign the value on the right to the variable on the left. In the example above, the variable a was assigned the value 14 (a = 14)
Одиночный символ равенства = означает присваивание значения справа к переменной слева. (В примере выше переменной <code>a</code> присваивается значение <code>14</code> (a = 14))


The double == is used to compare two values. It's most commonly used in the if statement. In the example above you can see we compared the variable a to 14 (a == 14). This determines how the if will react.
Двойной знак равенства == используется для сравнения двух значений. Чаще всего используются именно в выражении IF. В примере выше значение переменной <code>a</code> сравнивается с <code>14</code> (a == 14). Результат сравнения определит, каким образом будет выполняться код.


==== If statement ====
==== Выражение IF ====
[http://www.byond.com/members/?command=reference&path=proc%2Fif reference]
[http://www.byond.com/members/?command=reference&path=proc%2Fif Источник]


The example shows a simple if statement. If statements work by first checking if the statement in the brackets, in the case above a == 14, is true or not. If it's true, it will proceed to execute the code, which is further indented from the if (in the case above: world << "A has the value [a]"). In the other case, if the statement is not true, it will jump to the else statement and execute the code, which is indented from that. It will only jump to the else statement if one is present. In the example, if a was not 14, it would execute world << "A is not 14"
В примере был показан простой оператор IF. Оператор IF сначала проверяет, является ли утверждение в скобках (в случае выше a == 14), истинным или нет. Если это правда, он продолжит выполнение кода, который расположен после IF (в приведенном выше случае: <code>world << "A has the value [a]"</code>). В другом случае, если условие не выполнено, он перейдет к оператору ELSE и выполнит код, который находится после него, если этот оператор присутствует. В примере, если a не равно 14, будет выполнено <code>world << "A is not 14"</code>


Comparison operators include:
Операторы сравнения включают в себя:
<br>'''==''' Equals
<br>'''==''' Равенство
<br>'''!=''' Not Equals
<br>'''!=''' Неравенство
<br>'''<''' Less than
<br>'''<''' Меньше
<br>'''>''' More than
<br>'''>''' Больше
<br>'''<=''' Less or equal
<br>'''<=''' Меньше или равно
<br>'''>=''' More or equal
<br>'''>=''' Больше или равно


==== Switch-case statement ====
==== Выражение SWITCH-CASE ====
[http://www.byond.com/members/?command=reference&path=proc%2Fswitch reference]
[http://www.byond.com/members/?command=reference&path=proc%2Fswitch Источник]


=== Loops ===
=== Циклы ===


==== While ====
==== Оператор WHILE ====
[http://www.byond.com/members/?command=reference&path=proc%2Fwhile reference]
[http://www.byond.com/members/?command=reference&path=proc%2Fwhile Источник]


==== For ====
==== Оператор FOR ====
[http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Floop reference]
[http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Floop Источник]


==== For (foreach) ====
==== Оператор FOR для элементов списка (FOREACH) ====
[http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Flist reference]
[http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Flist Источник]


=== Procs ===
=== Процедуры ===
[http://www.byond.com/members/?command=reference&path=proc reference]
[http://www.byond.com/members/?command=reference&path=proc Источник]


==What is an object?==
==Что такое объект?==


SS13 is coded in Byond, which is an object oriented programming language. Please note that by object here i do not mean an item or machine in-game. For this intro alone i will speak of objects as I'll define them here.
SS13 написана на движке BYOND, который использует одноименный объектно-ориентированный язык программирования. Пожалуйста, заметьте, что под объектом далее понимается не внутриигровые объекты, а сущности, которые объявляются в коде.


An object can be any defined path in the game. Examples include:
Каждый определенный путь в игре может быть объектом. Примеры:
   /obj/item/weapon/sword
   /obj/item/weapon/sword
   /turf/simulated/floor
   /turf/simulated/floor
Строка 181: Строка 189:
   /atom/
   /atom/


An object is made out of both [[#Variables|variables]] and [[#Procs|procs]]
Объект состоит из [[#Переменные|переменных]] и [[#Процедуры|процедур]]


Here's an example of an object:
Пример такого объекта:


   /turf/simulated/gold_spot
   /turf/simulated/gold_spot
Строка 199: Строка 207:
     spawn_gold()
     spawn_gold()


=== Hierarchy and Inheritance ===
=== Иерархия и наследование ===
 
Objects inherit all it's parent's variables and procs. This means that an object defined as /obj/item/weapon/storage/box has all the variables of /obj/item/weapon/storage, /obj/item/weapon, /obj/item, /obj and also /atom, but we'll get to that one later. Some procs are already defined for all objects, you can see these [http://www.byond.com/members/?command=reference&path=atom%2Fproc here]. In the above example, New() was an instance of a proc which was inherited from the parent object. This is why New() does not have the proc/ prefix, because it is already defined in the parent object. You should however know that New() was redefined here, so it no longer acts the same way as in the parent objects.


An example of an inherited variable are the name and desc (description) variables. Both were redefined tho. spawned_gold, however, is a new variable. One which the parent proc does not have.
Объекты наследуют все родительские переменные и процедуры. Это означает, что объект, определенный как <code>/obj/item/weapon/storage/box</code>, имеет все переменные от <code>/obj/item/weapon/storage</code>, <code>/obj/item/weapon</code>, <code>/obj/item</code>, <code>/obj</code>, а также <code>/atom</code>, но мы вернемся к этому позже. Некоторые процедуры уже определены для всех объектов, вы можете увидеть их [http://www.byond.com/members/?command=reference&path=atom%2Fproc здесь]. В приведенном выше примере <code>New()</code> был экземпляром процедуры, унаследованной от родительского объекта. Вот почему <code>New()</code> не имеет префикса proc/, потому что он уже определен в родительском объекте. Однако вы должны знать, что <code>New()</code> был переопределен в этом объекте, поэтому он больше не работает так же, как в родительских объектах, а следует описанной логике.


If we define the following two objects...
Пример унаследованной переменной - переменные <code>name</code> и <code>desc</code>. Обе были переопределены в дочернем объекте. <code>spawned_gold</code> же является новой переменной, которая отсутствует у родителя.
Если мы определим следующие два объекта:
   /turf/simulated/gold_spot/plot1
   /turf/simulated/gold_spot/plot1
   /turf/simulated/gold_spot/plot2
   /turf/simulated/gold_spot/plot2
...we just defined two child objects of /turf/simulated/gold_spot and they inherited all the procs and vars that /turf/simulated/gold_spot has including all those which /turf/simulated/gold_spot inherited from their parent (/turf/simulated).
то мы определим два потомка объекта <code>/turf/simulated/gold_spot</code>, которые унаследуют все переменные и процедуры объекта <code>/turf/simulated/gold_spot</code>, включая те, которые объект <code>/turf/simulated/gold_spot</code> унаследовала от родителя <code>/turf/simulated</code>.


=== ..() ===
=== ..() ===


  ..()
<code>..()</code> - это то, что вы чаще всего будете видеть в коде. В других языках программирования подобная конструкция обычно называется super(), она вызывает процедуру с таким же именем из родительского объекта. В отличие от некоторых языков, он не выполняется автоматически, даже если не добавлен, если только не требуется, чтобы он был в начале процедуры. Обычно они добавляются в процедуры New(), Del() и Attackby(), чтобы получить исходное определение в общем родителе. Эти общие определения обеспечивают правильную работу кода.
is something you will often see in the code. In other languages this is usually called super(), it calls the parent object's proc with the same name. Unlike some languages it is not automatically executed even if not added, nor is it required to be at the proc's start. These are usually added in New(), Del() and Attackby() procs to get to the original definition in the common parent. These common definitions usually ensure things are properly handled.


==Area, Mob, Obj and Turf organization==
==Организация основных объектов==


   /datum
   /datum
     /atom
     /atom
       /area --All objects in here are areas, which are used in mapping to define the extent of an APC's power coverage, lighting, atmos, etc.
       /area --Объекты-зоны, которые используются в маппинге для определения пространства, покрываемого ЛКП, освещением, атмосферой и т.д.
       /mob
       /mob
         /dead --ghosts
         /dead --госты, призраки, наблюдатели
         /living
         /living
           /carbon --humans and monkeys
           /carbon --люди и гуманоиды
           /silicon --AI and cyborgs
           /silicon --ИИ и киборги
       /obj
       /obj
         /effect --Landmarks, trigger objects, effects and decals
         /effect --Отметки, триггеры, эффекты и декали
         /item
         /item
           /clothing --most of the clothing you can wear, belts and backpacks are in obj/item/weapon/storage
           /clothing --Большая часть надеваемой одежды, ремни и рюкзаки ищите в obj/item/weapon/storage
           /devices --electronic devices
           /devices --электронные устройства
           /stack --the things which you can stack, such as rods, floor tiles and materials
           /stack --складываемые предметы: стержни, плитки и материалы
           /weapons --most items which you can pick up
           /weapons --Большинство поднимаемых предметов
         /machinery --machines which use power, process every tick and are generally unmovable
         /machinery --машины, используемые электроэнергию, обрабатываются каждый тик и в основном неперемещаемые
         /structure --objects which don't require processing every tick or power, examples include windows, grilles, bookcases etc.
         /structure --Объекты, которые не требуют обрабатывания каждый тик или питания, примеры - окна, решетки, книжные полки, стеллажи и пр.
       /turf
       /turf
         /simulated
         /simulated
           /floor --floors with air
           /floor --полы с атмосферой
             /airless --floors without air (ALWAYS use these for areas exposed to space)
             /airless --полы без атмосферы (ВСЕГДА используйте для зон в открытом космосе)
             /plating --plating
             /plating --обшивка с атмосферой
               /airless --airless plating
               /airless --обшивка без атмосферы
           /wall --walls
           /wall --стены
             /r-wall --reinforced walls
             /r-wall --усиленные стены
         /space --it's space
         /space --просто космос
         /unsimulated --everything used on centcom and places where air movement is not simulated.
         /unsimulated --все на ЦК и прочих местах, где движение воздушных масс не симулируется


{{Contribution Guides}}
{{Contribution Guides}}


[[Category:Game Resources]] [[Category:Guides]]
[[Category:Game Resources]] [[Category:Guides]]

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

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

DreamMaker

Программа, которая потребуется для написания кода и маппинга, состоит из шести основных компонентов. Файловое дерево, дерево объектов, текстовый редактор, редактор иконок, редактор карт и панель отчета об ошибке.

Файловое дерево

Доступно во вкладке 'File' в левой вертикальной панели. Оно отображает файлы, которые составляют код игры, и рассортированы по папкам. Двойной клик по файлу откроет его в соответствующем редакторе. Если вы добавите новый файл в список (в Проводнике Windows), обновите список, нажав на кнопку 'Refresh'. Значок рядом с именем файла означает, что он используется в компилируемом коде. Частая ошибка - забыть импортировать новый файл.

Дерево объектов

О том, что такое объект, читайте ниже в этом руководстве, но пока скажем, что это дерево содержим список всего, что помещается на карту. Они расположены в определенной иерархии. Об этом также читайте ниже в гайде. Кнопка 'Update' внизу обновит дерево и дополнит его новыми спрайтами и объектами, если они были добавлены в любой из отмеченных .dm файлов.

Текстовый редактор

Данный редактор становится доступным, когда вы открываете файл с расширением .dm. Он предназначен для написания и редактирования кода игры.

Редактор иконок

Используется для редактирования иконок и их состояний, доступен, когда открывается файл с расширением .dmi. Отображает список всех спрайтов (часто называемых состояниями иконок) в файле. ПКМ в любом месте оуна отобразит опции для создания новой карты или ролика. Карта - статическое изображение, ролик - состояние иконки в одном из направлении или анимация. Ролик можем иметь одно направление (Юг), четыре (Север-Юг-Восток-Запад) или восемь (компас). Также заметьте, что в одном .dmi файле могут быть только иконки одного определенного размера. Для таких объектов, как сингулярность (которая, набирая силу, увеличивается в размерах), может потребоваться несколько .dmi-файлов.

Редактор карт

Обычно открывается, при запуске DreamMaker или при открытии файла с расширением .dmm. Редактор карт отображает (удивительно!) игровую карту. По умолчанию отображает все 4 основные группы объектов: зоны, мобы, объекты и покрытия. Чтобы выбрать параметры отображения, перейдите на вкладку «Слои» на самой верхней панели инструментов и выберите 'Only show selectable layers' («Показывать только выбираемые слои»), а затем выберите, какие слои вы хотите отображать на той же вкладке. Наиболее часто это используется для скрытия областей наложения. Обратите внимание, что карта не будет отображаться, если в коде .dm есть какие-либо ошибки. Исправьте все ошибки, а затем перекомпилируйте его.

Панель отчета об ошибке

Текстовая панель в нижней части DreamMaker, предназначенная для составления отчетов об ошибках.

Компиляция и запуск

Для компиляции обновленного кода без его запуска, выберите вкладку 'Build' (Сборка) и нажмите 'Compile' (Компилировать). Для компиляции и запуска выберите 'Build' > 'Run'.

Компоненты кода

Переменные

Источник

Переменные предназначены для хранения данных. Переменные создаются следующим образом: (без определения значения переменной)

 var/i

Чтобы объявить переменную и её значение:

 var/i = 5
 var/j = "Hello World"

Как только переменная была объявлена, вы можете объявить другую с тем же именем:

 var/i
 i = 2
 i = 6
 i = 12

Список

Источник

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

 var/list/a
 var/a[9]
 var/a = list()

Другие типы

Если вы хотите сохранить монетку где-то в переменных объекта и использовать определенные процедуры или переменные монетки, вам нужно определить переменную, в которой вы храните монету как монету. Второй пример также создает переменную с именем D и заполняет ее новой монетой.

 var/obj/item/weapon/coin/C
 var/obj/item/weapon/coin/D = new/var/obj/item/weapon/coin(src)

Включенные переменные

Переменные, встроенные в сам BYOND и не определяемые нигде в коде:
Атомарные переменные
Клиентские переменные
Datum-переменные
Моб-переменные

Переменные направления (dir)

Источник

Север: 1
Юг: 2
Восток: 4
Запад: 8
Северо-восток: 5 (1 + 4)
Юго-Восток: 6 (2 + 4)
Северо-запад: 9 (1 + 8)
Юго-запад: 10 (2 + 8)

Направления пронумерованы таким образом, поскольку используют метод 'bitflag' (битовый флаг). То же в двоичном коде:

0001 для севера
0010 для юга
0100 для востока
1000 для запада

Сложение направлений даст в итоге:

0101 для северо-востока
1001 для северо-запада
0110 для юго-востока
1010 для юго-запада.

Впрочем, другие комбинации (Восток-Запад (1100), Север-Юг (0011), Восток-Северо-Запад (1101) и т.п.) допустимы в особых случаях. (Пример: стены на станции).

Атомарные переменные

Применяются ко всем /obj, /turf, /area, /mob объектам.

Содержимое (Contents): Список объектов, помещаемых в другие объекты. (Баки с плазмой в излучателе, руда в плавильне, и т.п.)
Плотность (Density): Двоичный флаг (0/1): 0 означает возможность пройти через объект, 1 - невозможность преодолеть его
Описание (Desc): Строка - Описание объекта, пишется при подробном осмотре (Examine)
Направление (Dir): 1-10 - Направление объекта
Иконка (Icon): Файл с разрешением .dmi, который содержит спрайт для иконки
Состояние иконки (Icon_state): Название спрайта из файла
Наложения (Overlays): Список изображений, которые наложены на предмет.
Слой (Layer): Если два объекта находятся на одном тайле и у одного из больше номер слоя, то этот объект будет показан над другим.
Координаты (Loc): Позиционирование предмета по X,Y,Z
Свечение (Luminosity): Насколько объект светится?
Название (Name): Название предмета, которое будет отображаться при наведении на него
Прозрачность (Opacity): Можно ли через него видеть?
Смещение по X (Pixel_x), Смещение по Y (pixel_y): Установите, если элемент на карте смещен на несколько пикселей в любую сторону. Используется на ЛКП, Консолях запросов, Пожарных сигнализациях, и т.п.
Тип (Type): Тип - это путь к объекту. У монетки эта переменная примет значение: /obj/item/weapon/coin

Приложенные инструкции

Справочные руководства для прилагаемых инструкций (procs) можно найти по следующим ссылкам:
Area procs
Mob procs
Obj procs
Turf procs

Условные операторы

Условные операторы - это выражения, которые определяют, каким образом будет исполняться код, в зависимости от условия. Чаще всего используется выражение IF (ЕСЛИ).

= и ==

 var/a
 a = 14
 if (a == 14)
   world << "A has the value [a]"
 else
   world << "A is not 14"

Одиночный символ равенства = означает присваивание значения справа к переменной слева. (В примере выше переменной a присваивается значение 14 (a = 14))

Двойной знак равенства == используется для сравнения двух значений. Чаще всего используются именно в выражении IF. В примере выше значение переменной a сравнивается с 14 (a == 14). Результат сравнения определит, каким образом будет выполняться код.

Выражение IF

Источник

В примере был показан простой оператор IF. Оператор IF сначала проверяет, является ли утверждение в скобках (в случае выше a == 14), истинным или нет. Если это правда, он продолжит выполнение кода, который расположен после IF (в приведенном выше случае: world << "A has the value [a]"). В другом случае, если условие не выполнено, он перейдет к оператору ELSE и выполнит код, который находится после него, если этот оператор присутствует. В примере, если a не равно 14, будет выполнено world << "A is not 14"

Операторы сравнения включают в себя:
== Равенство
!= Неравенство
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно

Выражение SWITCH-CASE

Источник

Циклы

Оператор WHILE

Источник

Оператор FOR

Источник

Оператор FOR для элементов списка (FOREACH)

Источник

Процедуры

Источник

Что такое объект?

SS13 написана на движке BYOND, который использует одноименный объектно-ориентированный язык программирования. Пожалуйста, заметьте, что под объектом далее понимается не внутриигровые объекты, а сущности, которые объявляются в коде.

Каждый определенный путь в игре может быть объектом. Примеры:

 /obj/item/weapon/sword
 /turf/simulated/floor
 /area/
 /atom/

Объект состоит из переменных и процедур

Пример такого объекта:

 /turf/simulated/gold_spot
   var/spawned_gold = 0
   name = "Gold Area"
   desc = "This plot may have spawned gold!"
 
 /turf/simulated/gold_spot/proc/spawn_gold()
   if(prob(50))
     new/obj/item/stack/sheet/gold(src)
     spawned_gold = 1
 
 /turf/simulated/gold_spot/New()
   ..()
   spawn_gold()

Иерархия и наследование

Объекты наследуют все родительские переменные и процедуры. Это означает, что объект, определенный как /obj/item/weapon/storage/box, имеет все переменные от /obj/item/weapon/storage, /obj/item/weapon, /obj/item, /obj, а также /atom, но мы вернемся к этому позже. Некоторые процедуры уже определены для всех объектов, вы можете увидеть их здесь. В приведенном выше примере New() был экземпляром процедуры, унаследованной от родительского объекта. Вот почему New() не имеет префикса proc/, потому что он уже определен в родительском объекте. Однако вы должны знать, что New() был переопределен в этом объекте, поэтому он больше не работает так же, как в родительских объектах, а следует описанной логике.

Пример унаследованной переменной - переменные name и desc. Обе были переопределены в дочернем объекте. spawned_gold же является новой переменной, которая отсутствует у родителя. Если мы определим следующие два объекта:

 /turf/simulated/gold_spot/plot1
 /turf/simulated/gold_spot/plot2

то мы определим два потомка объекта /turf/simulated/gold_spot, которые унаследуют все переменные и процедуры объекта /turf/simulated/gold_spot, включая те, которые объект /turf/simulated/gold_spot унаследовала от родителя /turf/simulated.

..()

..() - это то, что вы чаще всего будете видеть в коде. В других языках программирования подобная конструкция обычно называется super(), она вызывает процедуру с таким же именем из родительского объекта. В отличие от некоторых языков, он не выполняется автоматически, даже если не добавлен, если только не требуется, чтобы он был в начале процедуры. Обычно они добавляются в процедуры New(), Del() и Attackby(), чтобы получить исходное определение в общем родителе. Эти общие определения обеспечивают правильную работу кода.

Организация основных объектов

 /datum
   /atom
     /area --Объекты-зоны, которые используются в маппинге для определения пространства, покрываемого ЛКП, освещением, атмосферой и т.д.
     /mob
       /dead --госты, призраки, наблюдатели
       /living
         /carbon --люди и гуманоиды
         /silicon --ИИ и киборги
     /obj
       /effect --Отметки, триггеры, эффекты и декали
       /item
         /clothing --Большая часть надеваемой одежды, ремни и рюкзаки ищите в obj/item/weapon/storage
         /devices --электронные устройства
         /stack --складываемые предметы: стержни, плитки и материалы
         /weapons --Большинство поднимаемых предметов
       /machinery --машины, используемые электроэнергию, обрабатываются каждый тик и в основном неперемещаемые
       /structure --Объекты, которые не требуют обрабатывания каждый тик или питания, примеры - окна, решетки, книжные полки, стеллажи и пр.
     /turf
       /simulated
         /floor --полы с атмосферой
           /airless --полы без атмосферы (ВСЕГДА используйте для зон в открытом космосе)
           /plating --обшивка с атмосферой
             /airless --обшивка без атмосферы
         /wall --стены
           /r-wall --усиленные стены
       /space --просто космос
       /unsimulated --все на ЦК и прочих местах, где движение воздушных масс не симулируется
Как внести свой вклад?
Общее Руководство по разработке
Сервер Настройка базы данных, Запуск локального сервера
Код Структура кода SS13, SS13 для опытных программистов, Форматирование текста, Как делать перевод игры
Маппинг Руководство по маппингу
Спрайтинг Руководство по спрайтингу
Вики Руководство по редактированию вики