SS13 для опытных программистов: различия между версиями
imported>Kysovich (Часть перевода) |
imported>Kysovich м (Добавил плашку) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
{{ | {{Needsrevision|reason=Гайд давно не трогали, что-то может не соответствовать реальности. Нужен реальный опыт работы с Paracode}} | ||
Похожие руководства: [[Структура кода SS13]] и [[Руководство по маппингу]] | Похожие руководства: [[Структура кода SS13]] и [[Руководство по маппингу]] | ||
Строка 212: | Строка 212: | ||
=== [http://www.byond.com/members/?command=reference&path=proc%2Fwhile While] === | === [http://www.byond.com/members/?command=reference&path=proc%2Fwhile While] === | ||
BYOND совершит выход из цикла, как только он достигнет определенного числа повторов (итераций) и выдаст runtime ошибку из опасений попасть в бесконечный цикл. То же относится к рекурсиям. | |||
Также, как и везде: | |||
while(condition) | while(condition) | ||
action1() | action1() | ||
Все циклы понимают команды <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 === | ||
For | For объединяет for-циклы и foreach-циклы: | ||
==== [http://www.byond.com/members/?command=reference&path=proc%2Ffor%2Floop For | ==== [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 // | [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) // | 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" // | B.name = "Smelly baton" //Присвоит новое имя предмету "baton" в текущей итерации | ||
=== [http://www.byond.com/members/?command=reference&path=proc%2Fdo Do | === [http://www.byond.com/members/?command=reference&path=proc%2Fdo Do..While] === | ||
Оператор Do..while обычно не используется в коде SS13, хотя BYOND его поддерживает. | |||
var/i = 3 | var/i = 3 | ||
Строка 240: | Строка 239: | ||
while(i) | while(i) | ||
=== [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 | /obj/item/weapon/item1 //создаст новый объект типа obj. | ||
var/item_property = 5 //определяет новый тип переменных для всех объектов item1 | |||
/obj/item/weapon/item1 // | name = "Testing Item" //переменная name уже определена в родительских объектах, поэтому в этой строке только присваивается новое значение | ||
var/item_property = 5 // | |||
name = "Testing Item" // | |||
/obj/item/weapon/item1/[http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FNew New()] // | /obj/item/weapon/item1/[http://www.byond.com/members/?command=reference&path=datum%2Fproc%2FNew New()] //Конструктор процедуры New() | ||
[[#..()|..()]] // | [[#..()|..()]] //всегда присутствует в процедуре New(), см. <code>[[#..()|..()]]</code> | ||
item_property = 3 // | item_property = 3 //выполняемое действие в конструкторе объекта. | ||
=== [http://www.byond.com/members/?command=reference&path=proc Procs] ( | === [http://www.byond.com/members/?command=reference&path=proc Procs] (Методы, функции, процедуры) === | ||
Вы привыкли к стандартным функциям и методам, верно? Ну, 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]" | ||
Код выше определяет глобальнукю процедуру. Если вы хотите привязать его на конкретный уровень | |||
==== ..() ==== | ==== ..() ==== | ||
То же самое, что и <code>super()</code> из Java. Вызывает процедуру родительского класса с тем же именем и параметрами. | |||
Пример: | |||
/obj/item | /obj/item | ||
name = "Item" | name = "Item" | ||
/obj/item/New() //New() | /obj/item/New() //New() вызывается при создании объекта данного типа. Конструктор, если угодно. | ||
src.name = "It's an item!" | src.name = "It's an item!" | ||
Строка 277: | Строка 274: | ||
..() | ..() | ||
При наличии кода, похожего на пример выше и создании нового объекта типа <code>/obj/item/stack</code>, сначала в мире появится объект с именем "Stack", поскольку это определено по умолчанию. Следом сразу будет вызвана процедура New(). Это изменит имя объекта на "It's a Stack!" но вызов New() родительского типа командой ..() назначит имя "It's an item!". В конце концов, объект получит имя "It's an item!". Команда ..() важна во многих ситуациях, когда что-то определено только в процедуре New() родителя. В Del(), процедуре, которая вызывается преимущественно при удалении объекта, от кода потребуется перейти к корневому Del(), даже чтобы удалить его. Примеры Del() можно найти в коде. | |||
== | == Важные процедуры == | ||
=== [http://www.byond.com/members/?command=reference&path=atom%2Fproc%2FNew New()] === | === [http://www.byond.com/members/?command=reference&path=atom%2Fproc%2FNew New()] === | ||
Процедура вызывается каждый раз, когда создается экземпляр объекта. При необходимости можно присвоить аргументы. Должна вызвать ..() где это применимо, чтобы сработали родительские конструкторы. | |||
Если у вас возникла необходимость в процедуре New() для [[#Variable types|atoms]] с отдельым набором аргументов, убедитесь, что первый аргумент определяет локацию объекта. Пример: | |||
obj/item/weapon/my_item/New(var/location, var/i) | obj/item/weapon/my_item/New(var/location, var/i) | ||
..() | ..() | ||
// | //Код и все, что он делает | ||
Для создания основного объекта | |||
[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 | ||
Для создания 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) | ||
Для создания своего объекта из примера выше, код будет выглядеть так: цифра 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) | ||
где 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()] === | ||
Процедура, вызываемая перед удалением объекта. Она ДОЛЖНА вызвать ..() в конце, поскольку само удаление происходит в корневой процедуре Del(). | |||
Объект удаляется при вызове del(O), где O - объект, подлежащий удалению. | |||
=== attack_hand(mob/M as mob) === | === attack_hand(mob/M as mob) === | ||
Вызывается, когда user (M) нажимает на объект пустой активной рукой | |||
=== attack_paw(mob/M as mob) === | === attack_paw(mob/M as mob) === | ||
Вызывается, когда monkey (M) нажимает на объект пустой активной рукой | |||
Если своей вариации attack_paw(mob/user) для atom не было расписано, по умолчанию вызовется attack_hand(user) | |||
=== attack_ai(mob/user) === | === attack_ai(mob/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) === | ||
Вызывается, когда объект использовался для атаки моба M со стороны user | |||
=== attackby(obj/item/W, mob/user) === | === attackby(obj/item/W, mob/user) === | ||
Вызывается, когда объект атакован user при помощи W (Пример: клик по проводам кусачками) | |||
=== ex_act(severity) === | === ex_act(severity) === | ||
Определяет реакцию объекта на взрыв (severity=1-3, 1 - наиболее разрушительный). | |||
=== blob_act() === | === blob_act() === | ||
Определяет реакцию предмета на атаку блоба (магмы) | |||
=== emp_act(severity) === | === emp_act(severity) === | ||
Определяет реакцию предмета на ЭМИ (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)] === | ||
Вызывается при нажатии на ссылку во всплывающем окне. Пример: увеличение выходной мощности на ячейках 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> | ||
Примеры использования ищите в коде. | |||
=== process() === | === process() === | ||
Вызывается для всех объектов в каждом тике. Избегайте использования данной процедуры, если возможно, поскольку сильно грузит процессор. Учитывайте, что для некоторых механик избежать её использования нельзя. | |||
== SS13 | == Значение основных переменных SS13 == | ||
=== Datum === | === Datum === | ||
Datum-объекты располагают минимальным числом предопределенных переменных. Они присутствуют во всех объектах в игре: | |||
type // | type //Тип объекта. Если объект имеет тип /obj/item/weapon/shovel (лопата), то выражение: new src.type(src.loc) создаст еще одну лопату в том же тайле. | ||
parent_type // | parent_type //Родительский тип для /obj/item/weapon/shovel - это /obj/item/weapon. | ||
tag // | tag //Тег используется для помощи в идентификации при использовании нескольких экземплров одного объекта. Он должен быть настроен вручную для каждого экземпляра. Ленивые кодеры и мапперы в результате не используют слишком много тегов. Экземпляры в редакторе карт сортируются по тегам. | ||
vars //List of object vars the datum has defined | vars //List of object vars the datum has defined | ||
=== Atom === | === Atom === | ||
Эти переменные делятся между всеми area, mob, obj, turf. | |||
contents // | contents //Список содержимого. Пример: шкафчики хранят содержимое в этой переменной, как и все предметы-контейнеры. All the items on a turf are in the turf's contents var. | ||
density // | density //Плотность, при значении 0, игрок сможет пройти через объект, при значении 1 - не сможет. | ||
desc // | desc //Описание. Отображает текст под именем объекта при его подробном изучении (Shift+ЛКМ или ПКМ->Examine). | ||
dir // | dir //Направление объекта. Спрайты обладают перменной направления, которая может принимать до 8 действительных состояний. | ||
gender // | gender //Не используется(?) | ||
icon // | icon //Файл формата .dmi, в котором сохранены спрайты. Выделить одиночными кавычками. (Пример: 'items.dmi') | ||
icon_state // | icon_state //Наименование спрайта в файле .dmi. Если имя не задано или не подходит по требованиям, то будет использоваться безымянный спрайт из этого файла. Если же имя не соответствует какому-либо спрайту, то по умолчанию будет использоваться пустой. | ||
invisibility // | invisibility //Невидимость, определяет, что можно будет увидеть, а что - нельзя. | ||
infra_luminosity // | infra_luminosity //Инфракрасное освещение. Используется только мехами. | ||
underlays // | underlays //Список изображений (см. процедуру image()), находящихся НИЖЕ текущего спрайта. | ||
overlays // | overlays //Список изображений (см. процедуру image()), находящихся ВЫШЕ текущего спрайта. | ||
loc // | loc //Содержит ссылку на turf-файл, в котором находится объект в данный момент. | ||
layer // | layer //Слой. Численная переменная, определяющая распределение объектов по слоям. Столы со значением слоя 2.8 всегда расположены под большинством объектов, которые имеют значение слоя 3.0. Можно назначать до 20, который зарезервирован для отображения HUD. | ||
luminosity // | luminosity //Освещение. Определяет, с какой силой объект излучает свет. Заметьте, что подбор и сброс излучающих свет объектов нужно обрабатывать особым образом. За примером можно обратиться к коду фонарика. | ||
mouse_over_pointer // | mouse_over_pointer // не используется | ||
mouse_drag_pointer //( | mouse_drag_pointer //(почти) не используется | ||
mouse_drop_pointer // | mouse_drop_pointer //не используется | ||
mouse_drop_zone // | mouse_drop_zone //не используется | ||
mouse_opacity // | mouse_opacity //редко используется, см. на странице источника. | ||
name // | name //Наименование объекта, отображается в строке состояния в левом-нижнем углу экрана или при осмотре предмета (Shift+ПКМ или ПКМ->Examine) | ||
opacity // | opacity //Прозрачность. Определяет, можно ли видеть что-либо за этим объектом. Значение 0 для объектов, просматриваемых насквозь (окна, пол, решетки), 1 для непрозрачных объектов (стены, мехи, закрытые шлюзы без окон). | ||
pixel_x // | pixel_x //Смещение по оси Х относительно исходной позиции в пикселях. pixel_x = -5 сдвинет объект на 5 пикс влево, pixel_x = 5 сдвинет на 5 пикс вправо. Пример: Метод New() для ЛКП (APC), также можно понаблюдать, как пульт управления пожарной сигнализацией определен на карте. | ||
pixel_y // | pixel_y //Смещение по оси Y относительно исходной позиции в пикселях. pixel_y = -5 сдвинет объект на 5 пикс вниз (южнее), pixel_y = 5 сдвинет на 5 пикс вверх (севернее). | ||
pixel_z // | pixel_z //Применяется в изометрических картах, в SS13 не используется. | ||
suffix // | suffix //Редко используется. См. в источнике. | ||
text // | text //Представление объекта в текстовых клиентах. Не используется. | ||
type // | type //Тип объекта | ||
vars // | vars //См. [[#Datum|Datum]] | ||
verbs // | verbs //Действия контекстного меню, которые можно совершить над объектом (появляются при нажатии ПКМ на объекте). | ||
x //X | x //Координата по X, только чтение. Измените значение переменной loc, чтобы сдвинуть объект, или используйте встроенные функции. | ||
y //Y | y //Координата по Y, только чтение. | ||
z //Z | z //Координата по Z, только чтение (cектор, Z-level). | ||
=== Area === | === Зоны (Area) === | ||
var/requires_power = 1 // | var/requires_power = 1 //Необходимость в питании. Установлено на 0 для зон, которым не нужны ЛКП (APC) для работы оборудования (такие, как Центральное Командование). Всем остальным установлено значение 1. | ||
var/music = null // | var/music = null //Музыкальная композиция, которая проигрывается при входе в зону. | ||
[http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity luminosity] = 0 // | [http://www.byond.com/members/?command=reference&path=atom%2Fvar%2Fluminosity luminosity] = 0 //Освещенность. Установлено на 1 для зон, которые должны быть освещены все время (космос, Центральное Командование). Динамическое освещение при этом выключено (sd_lightning = 0). | ||
var/sd_lighting = 0 // | var/sd_lighting = 0 //Динамическое освещение. Необходимость рассчитывать освещенность тайлов этой зоны. Выключите, если освещенность для зоны включена (luminosity = 1). | ||
Большинство остальных переменных существуют только в технических целях и не должны затрагиваться, кроме как в существующих процедурах, в которых были определены: | |||
[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) === | ||
Для мобов определено огромное количество переменных. Взгляните на следующие файлы: | |||
[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] | ||
Строка 407: | Строка 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] | ||
Также существуют дополнительные файлы для чужих, лярв, лицехватов и т.п. существ, но файлы выше содержат большинство переменных, которые вам понадобятся. | |||
=== Obj === | === Объекты (Obj) === | ||
var/m_amt = 0 // | var/m_amt = 0 // Содержание металла в объекте. Используется для определения количества металла (Metal), которое будет получено после переработки предмета в автолате (или же потребуется для его производства). | ||
var/g_amt = 0 // | var/g_amt = 0 // Содержание стекла в объекте. Используется для определения количества стекла (Glass), которое будет получено после переработки предмета в автолате (или же потребуется для его производства). | ||
var/w_amt = 0 // | var/w_amt = 0 // Содержание отходов. Не используется | ||
var/origin_tech = null // | var/origin_tech = null //Используется для определения размера бонусов исследования, которые получит Отдел Исследований (РнД). Примеры смотрите в коде объектов. | ||
var/reliability = 100 // | var/reliability = 100 //Используется некоторыми устройствами для определения их надежности - величины шанса в процентах, что предмет сработает, как надо. | ||
var/unacidable = 0 // | var/unacidable = 0 //Невосприимчивость к кислотам. При значении 1 объект нельзя уничтожить кислотой. | ||
var/throwforce = 0 // | var/throwforce = 0 //Количество урона, который пройдет по целевому объекту при броске в него другим предметом. | ||
Больше переменных здесь: | |||
[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 | Предметы (Items) - объекты, которые игрок может поднять. В зависимости от их функционала они делятся на несколько категорий. | ||
/obj/item | /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] | ||
Он добавляет следующие переменные (Далее идут только самые основные, см. файл для полного списка): | |||
var/force = null // | var/force = null //Сила удара. Определяет размер урона, который получит цель при ударе предметом в руке. Малые предметы обычно не наносят урона, средние наносят 5-10 единиц урона, редкие и мощные предметы могут нанести 10-15 единиц урона, двуручные - от 15 единиц, и т.д. Предметы синдиката могут наносить от 40 единиц урона и выше. | ||
var/item_state = null // | var/item_state = null //Определяет, какой спрайт будет использоваться для предмета в руке из файлов icons/mob/items_lefthand.dmi и items_righthand.dmi. | ||
var/damtype = "brute" // | var/damtype = "brute" //Тип урона, наносимый предметом. | ||
var/health = null // | var/health = null //Прочность предмета. Используется в некоторых случаях для того, чтобы определить, может ли предмет сломаться при использовании или получении урона. | ||
var/hitsound = null // | var/hitsound = null //Звук, который будет воспроизводиться при ударе этим предметом. Используется нечасто. | ||
var/w_class = 3.0 // | var/w_class = 3.0 //Вес (а точнее, габариты) предмета. | ||
// w_class = 1 | // w_class = 1 - предмет маленький и может поместиться в карманах (дискета, ручка, пачка сигарет) | ||
// w_class = 2 | // w_class = 2 - предмет небольшой, не лезет в карман, но легко помещается в коробку (папка для бумаг, анализатор, распылитель) | ||
// w_class = 3 | // w_class = 3 - предмет средних размеров, не помещается в коробке, но можно переносить в рюкзаке (коробки, листы металла, металлические прутья) | ||
// w_class = 4 | // w_class = 4 - предмет крупный и не лезет даже в рюкзак (рюкзак, кирка, пожарный топор) | ||
// w_class = 5 | // w_class = 5 - предмет имеет неопределенные габариты. | ||
var/wielded = 0 // | var/wielded = 0 //Используется для двуручных предметов, которые можно переносить в одной руке, но требуют хват двумя руками для их использования. Условия, при которых происходит переход между хватом двумя руками (wielding) и переносом в оной руке (unwielding) описываются в коде. Все предметы вначале имеют значение этой переменной на 0. | ||
var/twohanded = 0 // | var/twohanded = 0 // Установите на 1, если предмет двуручный. | ||
flags = FPRINT | TABLEPASS // | flags = FPRINT | TABLEPASS //Флаги | ||
==== Machinery ==== | ==== Машины (Machinery) ==== | ||
Определены в: | |||
[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 | Машины (Machinery) - объекты, которые не могут быть подняты и как правило требуют питание для работы. Для них определены следующие переменные: | ||
var/use_power = 0 // | var/use_power = 0 //определяет, будет ли машина потреблять энергию, а также её количество. | ||
//use_power = 0 - | //use_power = 0 - энергия не используется | ||
//use_power = 1 - | //use_power = 1 - пассивное электропотребление | ||
//use_power = 2 - | //use_power = 2 - активное электропотребление | ||
var/idle_power_usage = 0 // | var/idle_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в пассивном режиме (use_power = 1) в один игровой тик | ||
var/active_power_usage = 0 // | var/active_power_usage = 0 //Количество энергии в ваттах (Вт, W), расходуемое машиной в активном режиме (use_power = 2) в один игровой тик | ||
var/power_channel = EQUIP // | var/power_channel = EQUIP //Определяет категорию устройства на ЛКП (APC). EQUIP (цепь для оборудования), ENVIRON (цепь для систем жизнеобеспечения) или LIGHT (цепь освещения). | ||
var/list/component_parts = null // | var/list/component_parts = null //Список частей, которые потребуются помимо платы для сборки машины в корпусе (machine frame). | ||
=== Turf === | === Покрытие (Turf) === | ||
var/intact = 1 // | var/intact = 1 //Определяет, будет ли покрытие скрывать под собой коммуникации (трубы, проводку и т.п.). Значение 1 будет скрывать коммуникации, 0 - не будет. Скрыты будут только трубы и провода с установленным level=1. Установите level=2, чтобы не скрывать коммуникации. | ||
var/blocks_air = 0 // | var/blocks_air = 0 //Определяет воздухопроницаемость. Не пропускает воздух при значении 1. | ||
Существуют и другие переменные, но которые тесно связаны с атмосферикой, код которой крайне не рекомендуется трогать, чтобы не сломать вообще все. | |||
[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) - это тайлы, которые симулируют движение воздушных масс и температуру. Станция практически полностью состоит из таких, тогда как Центральное Командование использует несимулируемые полы, чтобы не допустить массивных и ненужных лагов. | |||
var/wet = 0 // | var/wet = 0 //Мокрый пол. При значении 1 игрок поскользнется при пробеге по нему. | ||
var/thermite = 0 // | var/thermite = 0 //Термитный слой. Принимает значение 1, когда на тайл вылит термит. | ||
===== Simulated floors ===== | ===== Симулируемые полы (Simulated floors) ===== | ||
var/icon_regular_floor = "floor" // | 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 // | heat_capacity = 10000 //Когда очаг возгорания на тайле превышает это число, пол с некоторым шансом может расплавиться. Чем выше число, там выше шанс расплавления. | ||
var/broken = 0 // | var/broken = 0 //В основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Сломанные плитки пропадают при снятии с пола. | ||
var/burnt = 0 // | var/burnt = 0 //TВ основном только определяет, получите ли вы плитку обратно, если подцепите её ломом. Обоженные плитки пропадают при снятии с пола. | ||
var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/steel // | var/obj/item/stack/tile/floor_tile = new/obj/item/stack/tile/steel //определяет, какая плитка лежит на полу | ||
Симулируемые полы определены в файле: | |||
[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) ===== | ||
Особо отличающихся переменных не содержат. | |||
Определены в: | |||
[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
Причина: Гайд давно не трогали, что-то может не соответствовать реальности. Нужен реальный опыт работы с 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 для опытных программистов, Форматирование текста, Как делать перевод игры |
Маппинг | Руководство по маппингу |
Спрайтинг | Руководство по спрайтингу |
Вики | Руководство по редактированию вики |