Руководство по редактированию кода игры
ПРИМЕЧАНИЕ!! В этом руководстве термины используются очень своебразно. Опытные программисты, пожалуйста, не придирайтесь по поводу того, что такое объект, что такое метод и так далее. Это руководство предназначено исключительно для начинающих программистов. Остальные... не читайте.
DreamMaker
Программа, которая вам понадобится как для кодирования, так и для картографии, состоит из шести основных компонентов. Дерево файлов, дерево объектов, текстовый редактор, редактор иконок, редактор карт и панель отчета об ошибках.
Древо файлов
Доступ к дереву файлов можно получить, выбрав вкладку «Файл» на левой вертикальной панели. Он показывает файлы, составляющие код, отсортированные по папкам. Двойной щелчок по любому файлу откроет его в соответствующем редакторе. Если вы добавите новый файл в список (в проводнике Windows), нажмите кнопку «Обновить», чтобы обновить список. Галочки рядом с файлами указывают, используются ли они при компиляции кода. Распространенная ошибка — забыть включить новый файл.
Древо объектов
Что такое объект, объясняется далее в этом руководстве ниже, но сейчас мы можем сказать, что он содержит список объектов, которые вы можете разместить на карте. Они расположены в иерархии. Это также объясняется и описывается далее в руководстве. Кнопка обновления внизу обновит дерево новыми спрайтами и объектами, если они были добавлены в любой из отмеченных галочкой файлов .dm.
Редактор текста
Доступ к этому редактору осуществляется всякий раз, когда вы открываете файл с расширением «.dm». Предназначен для написания и редактирования кода игры.
Редактор иконок
Предназначен для редактирования состояний и значков значков, доступ к нему осуществляется при открытии файла «.dmi». Он отображает список всех спрайтов (часто называемых состояниями значков), которые находятся в файле. Щелчок правой кнопкой мыши в любом месте даст возможность создать новый кадр или растровое изображение. Пиксельное изображение — это статическое изображение, а кадр — это либо состояние значка, которое может указывать в нескольких разных направлениях (часто называемых каталогами), либо анимация. кадр может иметь 1 (юг), 4 (северо-запад) или 8 направлений (полный компас). Также обратите внимание, что файл .dmi может содержать значки только определенного размера. В случае сингулярности, которая растет по мере набора мощности, необходимо несколько файлов .dmi.
Редактор карты
Обычно открывается при запуске или при открытии файла карты «.dmm». Редактор карт отображает карту. По умолчанию отображаются все 4 основные группы: территория, моб, объект и территория. Чтобы выбрать особенности отображения, перейдите на вкладку «Слои» на самой верхней панели инструментов и выберите «Показывать только выбираемые слои», а затем выберите, какие слои вы хотите отображать на той же вкладке (слои). (Чаще всего используется для скрытия наложения областей). Обратите внимание: карта не будет отображаться, если в коде .dm есть ошибки. Исправьте все ошибки и затем перекомпилируйте его.
Панель отчётов об ошибках
Текстовая панель в нижней части DreamMaker. Панель отчетов об ошибках предназначена для составления отчетов об ошибках.
Скомпилировать и запустить
Чтобы скомпилировать обновленный код, не запуская его, выберите вкладку «Сборка» на самой верхней панели инструментов и выберите «Компилировать». Чтобы скомпилировать и запустить, нажмите кнопку «Выполнить» на той же вкладке.
Компоненты кода
Переменные
Переменные предназначены для хранения данных. Переменные создаются следующим образом: (создает переменную без определенного значения) var/i
Чтобы определить значение в объявлении, сделайте следующее:
var/i = 5
или
var/i = "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)
Встроенные переменные
Переменные, которые встроены в себя и не определены нигде в коде:
Atom vars
Client vars
Datum vars
Mob vars
Переменные направления (dir)
Север: 1
Юг: 2
Восток: 4
Запад: 8
Северо-восток: 5 (1 + 4)
Юго-восток: 6 (2 + 4)
Северо-запад: 9 (1 + 8)
Юго-запад: 10 (2 + 8)
Они пронумерованы так, потому что dir использует методологию «битового флага». Подробнее о битовых флагах можно прочитать здесь. Он определен в двоичном формате, поэтому...
0001 — север
0010 — юг
0100 — восток
1000 — запад
Объединение этих чисел дает северо-восток (0101), северо-запад (1001), юго-восток (0110) и юго-запад (1010). Для особых целей возможны и другие комбинации (восток-запад (1100), север-юг (0011), северо-восток-запад (1101) и т. д.). Код Smoothwall является примером.
Atom vars
Они применяются ко всем объектам типа /obj, /turf, /area, /mob.
Содержание : Список объектов, вставленных в другой объект. (плазменные резервуары в радиационных массивах, руда в плавильном заводе и т. д.)
Плотность : 0/1 — 0 означает, что ваш моб может пройти сквозь (или пройти), 1 означает, что вы не можете
Desc : string — Описание, отображаемое при осмотре
Dir : 1- 10 — направление, в котором смотрит объект
. Icon : файл .dmi, содержащий спрайт для значка.
Icon_state : имя спрайта в файле из Icon
Overlays : список изображений, наложенных на элемент.
Слой : если два объекта находятся на одной плитке и один из них имеет более высокий номер слоя, чем другой, тот, у которого более высокий номер, будет отображаться так же, как и объект с меньшим. Loc:
Позиционирование элемента по X,Y,Z.
Яркость : Насколько он светится?
Имя : имя, отображаемое при наведении указателя мыши на элемент.
Непрозрачность : можно ли видеть сквозь него?
Pixel_x , Pixel_y : устанавливается, если элемент на карте сдвинут на несколько пикселей в обе стороны. Используется с APC, консолями запросов, пожарной сигнализацией и т. д.
Тип : Тип — путь к объекту. Для монеты переменная типа будет иметь значение: /obj/item/weapon/coin.
Встроенные инструкции
Справочные руководства для включенных инструкций (proc-s) можно найти по следующим ссылкам:
Процедуры областей
Процедуры мобов
Объекты
Процедуры турфов
Операторы
Условные операторы — это операторы, которые определяют, как будет выполняться код в зависимости от условия. Наиболее распространенным условием является оператор IF.
= vs. ==
var/a a = 14 if (a == 14) world << "A имеет значение [a]" else world << "A не равняется 14"
Как и в примере выше, одиночный = означает, что вы присваиваете значение справа переменной слева. В приведенном выше примере переменной a было присвоено значение 14 (a = 14).
Двойной == используется для сравнения двух значений. Чаще всего он используется в операторе if. В приведенном выше примере вы можете видеть, что мы сравнили переменную a с 14 (a == 14). Это определяет, как будет реагировать if.
Справочник по операторам сравнения
В примере показан простой оператор if. Операторы if работают, сначала проверяя, является ли утверждение в скобках (в приведенном выше случае == 14) истинным или нет. Если это правда, он приступит к выполнению кода, который имеет дополнительный отступ от if (в приведенном выше случае: world << «A имеет значение [a]»). В другом случае, если утверждение неверно, он перейдет к оператору else и выполнит код, отступ от которого находится. Он перейдет к оператору else только в том случае, если он присутствует. В этом примере, если a не равно 14, будет выполнено world << "A is not 14"
К операторам сравнения относятся:
== Равно
!= Не равно
< Меньше
> Больше чем
<= Меньше или равно
>= Больше или равно
Оператор switch
Петли
While
For
For (foreach)
Процедуры
Что такое объект?
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.
An object can be any defined path in the game. Examples include:
/obj/item/weapon/sword /turf/simulated/floor /area/ /atom/
An object is made out of both variables and procs
Here's an example of an object:
/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()
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 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.
If we define the following two objects...
/turf/simulated/gold_spot/plot1 /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).
..()
..()
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 /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. /mob /dead --ghosts /living /carbon --humans and monkeys /silicon --AI and cyborgs /obj /effect --Landmarks, trigger objects, effects and decals /item /clothing --most of the clothing you can wear, belts and backpacks are in obj/item/weapon/storage /devices --electronic devices /stack --the things which you can stack, such as rods, floor tiles and materials /weapons --most items which you can pick up /machinery --machines which use power, process every tick and are generally unmovable /structure --objects which don't require processing every tick or power, examples include windows, grilles, bookcases etc. /turf /simulated /floor --floors with air /airless --floors without air (ALWAYS use these for areas exposed to space) /plating --plating /airless --airless plating /wall --walls /r-wall --reinforced walls /space --it's space /unsimulated --everything used on centcom and places where air movement is not simulated.