Полная Версия: (sfall) дополнения
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
Crafty
QUOTE (Fakeman)
Я пытаюсь понять как логически работают перки Silent Death и Slayer в паре.
В паре они никак не работают, но они обрабатываются в блоке, который разбирает MELEE или UNARMED атаки.

QUOTE (Fakeman)
Что означает вот это вот строка из кода от перка Silent Death
00423942 mov [esp+3Ch+DamageMultiplier], 4
DamageMultiplier изначально
QUOTE
равно 2, но при взятом перке Silent Death|Тихая смерть и соответствующих условиях атаки равно 4

QUOTE (Fakeman)
Перк Slayer как-то влияет на Silent Death, или наоборот?
Если Slayer взят, то это 100% критическое попадание, а значит чуть позже будет отбработка крита и получение нового значения DamageMultiplier из таблицы критов с игнорированием эффекта Silent Death. Последнее — баг, и его проще и правильнее исправить движково (что я уже и сделал), а не скриптово.

QUOTE (Fakeman)
ты меня тут не запутывай, на вопросы ответь)
CODE
DamageMultiplier = 2;
.....
if (attack_subtype == MELEE or attack_subtype == UNARMED) and roll == ROLL_SUCCESS and source = dude_obj then begin
 if has_trait(TRAIT_PERK, source, PERK_slayer) then roll := ROLL_CRITICAL_SUCCESS;
 if has_trait(TRAIT_PERK, source, PERK_silent_death) and условия_атаки then DamageMultiplier = 4;
 .....
end
.....
if roll == ROLL_CRITICAL_SUCCESS then DamageMultiplier := attack_crit_success;
Crafty
В продолжении темы о Silent Death — по идее нужно исправлять обработку перков Living Anatomy|Практическая анатомия и Pyromaniac|Пироман, чтобы они работали с Silent Death|Тихая смерть или критами.
Для скриптового примера DamageFormula это бы выглядело так:
CODE
.....
 if ctdSource == dude_obj then begin
  variable perkAmount := 5 * (DamageMultiplier/2); // Специально нет проверки что это крит, чтобы обрабатывался некритовый Silent Death
  if has_trait(TRAIT_PERK, ctdSource, PERK_living_anatomy) and metarule(METARULE_CRITTER_KILL_TYPE, ctdTarget) != KILL_TYPE_robot and metarule(METARULE_CRITTER_KILL_TYPE, ctdTarget) != KILL_TYPE_alien then
   amount := amount + perkAmount;
  if has_trait(TRAIT_PERK, ctdSource, PERK_pyromaniac) and dmg_type == DMG_fire then
   amount := amount + perkAmount;
 end
.....

Fakeman
QUOTE
// Специально нет проверки что это крит, чтобы обрабатывался некритовый Silent Death

Специально для тупых) что туда надо писануть чтобы обрабатывалось?

И еще где в движке записаны номер верcии Major/Minor, (что в главном меню пишутся). что-то лазил-лазил не нашел нифига этих цифр.
Crafty
QUOTE (Fakeman)
что туда надо писануть чтобы обрабатывалось?
Не улавливаю о чём речь :-p

QUOTE (Fakeman)
И еще где в движке записаны номер верcии Major/Minor, (что в главном меню пишутся).
0x4B4583
Fakeman
CODE
Не улавливаю о чём речь

Че я фигню сморозил да?)

Код для TileMore ты у себя не вырезал?

CODE
0x4B4583

О как, там оказывается все в разных местах, для меню и для заголовка сохранения в save.dat файле. Понятно.
Crafty
QUOTE (Fakeman)
Код для TileMore ты у себя не вырезал?
Нет (MoreTiles) и если используется HRP, то он должен быть версии 4.1.8.
Fakeman
У тебя в последних исходниках(версии 31) два последних hook'a отключены и как то выведены за пределы if опции MoreTiles.
Каково было назначение этих двух хуков? (которые помещены в TRACE)

CODE
if (GetPrivateProfileIntA("Misc", "MoreTiles", 0, ini)) {
 if (*(DWORD*)0x1000E1BF == 0x1000 && *(DWORD*)0x1000E1D9 == 0x0FFF) { // HRP 4.1.8
  SafeWrite8(0x1000E1C0, 0x40);
  SafeWrite8(0x1000E1DA, 0x3F);
  MakeCall(0x419D46, art_id_hook);
  MakeCall(0x419479, art_get_name_hook);
  for (int i = 0; i < sizeof(Tiles_0E)/4; i++) SafeWrite8(Tiles_0E[i], 0xE);
  for (int i = 0; i < sizeof(Tiles_3F)/4; i++) SafeWrite8(Tiles_3F[i], 0x3F);
  for (int i = 0; i < sizeof(Tiles_40)/4; i++) SafeWrite8(Tiles_40[i], 0x40);
  for (int i = 0; i < sizeof(Tiles_C0)/4; i++) SafeWrite8(Tiles_C0[i], 0xC0);
 }
 }
#ifdef TRACE
 else HookCall(0x483BCD, &map_save_file_hook);
 HookCall(0x48434C, &square_load_hook);
#endif
Crafty
QUOTE (Fakeman)
У тебя в последних исходниках(версии 31) два последних hook'a отключены и как то выведены за пределы if опции MoreTiles.
Каково было назначение этих двух хуков? (которые помещены в TRACE)
Если помнишь там было битовое поле (e или s), которое являлось флагом и определяло [не]видимость крыши на этом тайле. При записи карты движок записывает этот бит, но при загрузке его игнорирует и настраивает [не]видимость крыши по-новой.
Возможна ситуация когда сначала кто-то запишет игру с MoreTiles=0, потом поменяет на 1 и загрузит эту игру. Тогда для тайлов с этим установленным битом будут использованы неверные номера и логично сбрасывать этот бит перед записью карты. Но сделал я это кривенько — на "живых" тайлах, а не копии. Что привело к проблеме появления крыши и визуального пропадания ГГ в домах после записи игры. Пришлось временно отключить.
Fakeman
Ты что-то потом в коде менял, или так и осталось?

Меня интересует ситуация когда MoreTiles будет выставлен всегда в 1 (перманентно).
Я так понимаю, тогда получается что эти две map_save_file_hook и square_load_hook — вообще не нужны, да?
Crafty
QUOTE (Fakeman)
Ты что-то потом в коде менял, или так и осталось?
Само собой переписал нормально.

QUOTE (Fakeman)
Меня интересует ситуация когда MoreTiles будет выставлен всегда в 1 (перманентно).
Я так понимаю, тогда получается что эти две map_save_file_hook и square_load_hook — вообще не нужны, да?
Верно.
Crafty
В замешательстве я :(
и в F1 и в F2 игровое описание перка Slayer|Смертельный удар гласит что все удары станут критическими. Однако для F2 в руководстве пользователя говорится что удар будет критическим при успешном броске кубиков на удачу, в общем так же как и для перка Sniper|Снайпер (оба перка доступны с 24 уровня).
Для F1 с его ограничением в 21 уровень я соглашусь с 100% критом для перка, но вот для F2 у меня припекает ;( Точно хотели сделать обработку как для Снайпера, но забыли...
Легко подправить в движке, но тогда идёт расхождение с игровым описанием.
Кому верить и что делать? ;)
Fakeman
CODE

Слауер:
Рукопашные атаки становятся критическими в зависимости от Удачи, шанс на критическое попадание рассчитывается по новой формуле (Удача*10).

Снайпер:
Вероятность критического попадания при выстреле считается по новой формуле: (Удача*10)%. Показатель шанса на критическое попадание больше не учитывается.


То есть для слауера в F2 — 100% шанс?
Foxx
Воздействие: Все удары игрока в рукопашном бою будут критическими.
QUOTE ("Fakeman")
а это бред какой-то написали в википедии, там не компетентные редакторы сидят)

Это описание перка в игре такое.
Crafty
QUOTE (Fakeman)
То есть для слауера в F2 — 100% шанс?
Именно — нет броска кубиков на удачу, тупо если есть перк сразу замена ROLL_SUCCESS на ROLL_CRITICAL_SUCCESS. У Снайпера нормально всё.
Fakeman
CODE
Кому верить и что делать?;)

Да пусть остается как есть — 100% шанс.
или можешь через ини нерф для перка сделать. :)
Crafty
QUOTE (Fakeman)
Да пусть остается как есть — 100% шанс.
или можешь через ини нерф для перка сделать. :)
Да не будут включать, уж больно лакомый эффект...
Foxx
QUOTE ("Crafty")
Кому верить и что делать? ;)
Я бы пофиксил, т.к. эта способность аналог снайпера, только для рукопашника. Все должны быть на равне :)
Fakeman
QUOTE
Да не будут включать, уж больно лакомый эффект...

А так будут заменять на старые версии, или оригинал.
Поставь по дефолту в 1 :)
Такие фиксы с инишкой хорошо для модов делать, и контролировать изменение сего параметра из скрипта, если установили в 0 то выдать талон на выход с пометкой "Восстановите параметр".

еще неизвестно, что там по этому поводу думает новараин.
может это и не баг, и так было задумано).
Crafty
QUOTE (Foxx)
Все должны быть на равне :)
Разрыв шаблона из-за игрового описания, всё портит.
И с критическими анатомией и пироманом ещё вопрос, из-за них и обратил внимание на расхождение в описании смертельного удара.

QUOTE (Fakeman)
А так будут заменять на старые версии, или оригинал.
А это пожалуйста, даже забавно на это глядеть. Кто-то до сих пор использует и рекомендует 1.7.31[r_чего_то_там] даже не представляя сколько изначально было багов в оригинальном сишном коде.

QUOTE (Fakeman)
еще неизвестно, что там по этому поводу думает новараин.
может это и не баг, и так было задумано).
А он тут причём?
Но зуб даю — забыли изменить чутка код чтобы работало как у Снайпера.
Fakeman
QUOTE
А это пожалуйста, даже забавно на это глядеть. Кто-то до сих пор использует и рекомендует 1.7.31[r_чего_то_там] даже не представляя сколько изначально было багов в оригинальном сишном коде.

Опять ты начинаешь, мы еще не посчитали сколько у тебя там багов — давай исходники будем считать))

И чисто ради интереса в бартере когда кладешь товары торгоша на стол, ты каким образом считаешь вес этих предметов, перебором?
Мне просто интересно как получить вес всех предметов на столе у игрока, без перебора предметов в скрипте.
QUOTE
critter arg7 — указатель на "стол" с предложенными игроком товарами
Crafty
QUOTE (Fakeman)
Опять ты начинаешь, мы еще не посчитали сколько у тебя там багов — давай исходники будем считать))
Нет там багов, ну а те что есть — мои, и даже могу их исправлять при обнаружении :-p

QUOTE (Fakeman)
И чисто ради интереса в бартере когда кладешь товары торгоша на стол, ты каким образом считаешь вес этих предметов, перебором?
Мне просто интересно как получить вес всех предметов на столе у игрока, без перебора предметов в скрипте.
Движок считает, а для скриптов есть has_trait(TRAIT_OBJECT, obj, OBJECT_CUR_WEIGHT), не?

PS. В COMMNAD.H даже макросы на эту тему есть:
QUOTE
Info relating to carry weight, how much something costs, and weights
Fakeman
QUOTE
has_trait(TRAIT_OBJECT, obj, OBJECT_CUR_WEIGHT), не?

Да для криттеров, а у "стола" тип вообще неопределенный -1
Crafty
QUOTE (Fakeman)
Да для криттеров, а у "стола" тип вообще неопределенный -1
"Стол" — это временный объект, но всё же объект. Без pid и fid, но вес его вещей ты узнать можешь.
Fakeman
Что-то я подзабыл, сам же нарыл функцию, эта видимо должна посчитать.
https://github.com/phobos2077/sfall/issues/63
Fakeman
Еще интересует можно ли проверить имеет ли объект контейнер анимацию открывания/закрывания т.е. имеет ли он фреймов >1 ?
в скриптах есть функция obj_is_open  — она возвращает true если объект открыт (похоже она проверяет номер текущего кадра, если последний то 1), в противном случае false, для тех объектов у которых анимации нет тоже false, но они по сути открыты. — вот такая досадная недоработка у функции.
Crafty
QUOTE (Fakeman)
Еще интересует можно ли проверить имеет ли объект контейнер анимацию открывания/закрывания т.е. имеет ли он фреймов >1 ?
в скриптах есть функция obj_is_open  — она возвращает true если объект открыт (похоже она проверяет номер текущего кадра, если последний то 1), в противном случае false, для тех объектов у которых анимации нет тоже false, но они по сути открыты. — вот такая досадная недоработка у функции.
Запутал меня.
Открыт ли контейнер: obj_is_open(object) or not obj_is_locked(object);
Есть ли анимация: art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000);
Foxx
Crafty

Чё-то ты не то сделал с APPEARANCE MOD. Если критеры используют стандартную анимацию игрока, то они ее меняют на ту, что выбрал игрок в APPEARANCE.
Смотри, как забавно в Неваде это выглядит :)
http://i91.fastpic.ru/big/2017/0907/3e/211...b0f7bb8a83e.jpg
Crafty
QUOTE (Foxx)
Смотри, как забавно в Неваде это выглядит :)
Лучше бы сейв подкинул :-p (хз что означает "критеры используют стандартную анимацию игрока").
Foxx
Crafty
Ну стандартные анимации ГГ: HMJMPSAA, HMLTHRAA, HMMAXXAA и т.д.
У меня сейв только от Nevada CE 3.0 (не запустится на другой)
https://yadi.sk/d/mFp-Nmsj3MgVjU

P.S.
На сейве только лысый будет. Негра я проверял, чтобы точно удостовериться. В Блэк-Рок Юджин тоже меняется и караванщики в Рино :)
Fakeman
QUOTE
Смотри, как забавно в Неваде это выглядит :)

После твоих манипуляций c добавлением ресурсов из олимпа не совсем понятно, что не так на этом скрине. :)
Crafty
QUOTE (Foxx)
Ну стандартные анимации ГГ: HMJMPSAA, HMLTHRAA, HMMAXXAA и т.д.
Технически всё верно — нпс и ГГ используют одну общую анимацию, которую подменяет хиромод. Раньше работало потому что в хиромоде был трюк со сдвигом fid'а у ГГ вверх на количество существующих анимаций из critters.lst.
Могу откатить, но тогда опять вернётся проблема с ГГ'шным fid'ом (/суммон Fakeman ;)) и вроде ещё из-за этого в Мегамоде была проблема с исчезающим тотемным столбом на стартовой локации.
Foxx
Ну раньше хоть была какая-то индивидуальность при выборе внешности, а теперь кругом лысые/патлаты/блондинки/рыжие. Весь смысл appearance_mod пропадает )))

QUOTE ("Mr.Stalin")
После твоих манипуляций c добавлением ресурсов из олимпа не совсем понятно, что не так на этом скрине :)
А, что зря ресурсам пропадать, да и лишняя реклама Олимпу не повредит ;)
Fakeman
QUOTE
Запутал меня.
Открыт ли контейнер: obj_is_open(object) or not obj_is_locked(object);
Есть ли анимация: art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000);

Смотри obj_is_open возвращает True, в том случае если контейнер имеет анимацию открывания/закрывания и когда его текущий анимационный фрейм больше нуля, (obj_is_open использует проверку текущего фрема cur_frm > 0 = True)
для контейнеров не имеющих анимацию(имеющих только нулевой(1) фрейм) obj_is_open возвращает всегда false контейнер закрыт (не путать с Lоcкед).

Можно ли проверить содержит ли объект фреймов больше чем 1?
Или как определить что игрок открыл контейнер (не используя функцию get_game_mode), каким-нибудь read_int() прочитать флаг что-ли.

art_exists — тут не приделах.

Отправлено: 7 сен 17 16:11
QUOTE
. Раньше работало потому что в хиромоде был трюк со сдвигом fid'а у ГГ вверх на количество существующих анимаций из critters.lst.

Да-да я про это писал на форуме NMA — но там походу не вдуплили о чем я им толкую))

Отправлено: 7 сен 17 16:15
QUOTE
Могу откатить, но тогда опять вернётся проблема с ГГ'шным fid'ом

А может это и не проблема. :)
Просто в технической документации не указали что фид меняется, я сам день промучился, пока не понял в чем глюк.
Crafty
QUOTE (Foxx)
Весь смысл appearance_mod пропадает )))
Не угодишь вам :-p

QUOTE (Fakeman)
Смотри obj_is_open возвращает True, в том случае если контейнер имеет анимацию открывания/закрывания и когда его текущий анимационный фрейм больше нуля, (obj_is_open использует проверку текущего фрема cur_frm > 0 = True)
Немного не так: для контейнеров в cur_frm, содержимое которого возвращает obj_is_open, хранится номер используемой анимации для текущего состояния контейнера. Для закрытого равно 0, а для открытого 1.

QUOTE (Fakeman)
art_exists — тут не приделах.
А ты всё же попробуй конструкцию:
QUOTE
if obj_is_open(object) or art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000) then display_msg("Opened");
Fakeman
QUOTE
Немного не так: для контейнеров в cur_frm, содержимое которого возвращает obj_is_open, хранится номер используемой анимации для текущего состояния контейнера. Для закрытого равно 0, а для открытого 1.

Ниче не знаю)
Я проверял у контейнеров с анимацией которые открыты read_int(object + 0x18) — возвращает 5 т.е. последний фрейм в анимации. у которых нет анимации или они закрыты то 0.
0x18 — если смотреть структуру то это cur_frm.
(Но нужно протестировать с меньшим количеством фреймов что-бы подтвердить)

QUOTE
хранится номер используемой анимации

что за номер анимации? у типа итемов по сути она одна.
Эти?
CODE
// basic animations  0-19
#define ANIM_stand                    (0)
#define ANIM_walk                     (1)
#define ANIM_jump_begin               (2)
#define ANIM_jump_end                 (3)
#define ANIM_climb_ladder             (4)
#define ANIM_falling                  (5)


QUOTE
art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000)

Да проверял возвращало всегда 1.
Это больше к криттерам относится.

Отправлено: 7 сен 17 18:46
Я бы мог воспользоваться предварительной проверкой read_int(object + 0x18), но скрипта так работает, что до использования контейнера нельзя получить указатель на контейнер, а когда уже юзнул контейнер то и вся проверка уже бессмысленна.
Crafty
QUOTE (Fakeman)
Еще интересует можно ли проверить имеет ли объект контейнер анимацию открывания/закрывания т.е. имеет ли он фреймов >1 ?
CODE
variable temp, max_frames := 1;
if call_offset_r2(0x419160, obj_art_fid(object), temp) then begin // art_ptr_lock_
 max_frames := call_offset_r0(0x41978C); // art_frame_max_frame_
 temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end
if max_frames > 1 then ...

QUOTE (Fakeman)
Ниче не знаю)
Да там муторно, без стакана не объяснить :-p
QUOTE (Fakeman)
Я бы мог воспользоваться предварительной проверкой read_int(object + 0x18), но скрипта так работает, что до использования контейнера нельзя получить указатель на контейнер, а когда уже юзнул контейнер то и вся проверка уже бессмысленна.
"if read_int(object + 0x18)" это абсолютный аналог "if obj_is_open(object)" независимо от типа объекта. Но как ты сможешь что либо узнать о контейнере (obj_is_open или obj_art_fid) если у тебя нет на него указателя?
Вообще закралось подозрение что какими-то извращёнными костылями пытаешься воссоздать режим INTFACELOOT ;-p
Fakeman
QUOTE
Вообще закралось подозрение что какими-то извращёнными костылями пытаешься воссоздать режим INTFACELOOT;-p

Оно уже давно воссоздано, когда еще не было этого INTFACELOOT, и работает для партийцев, и только для багажника по причине того что открывавшиеся контейнеры все портили.
и вот я решил эту байду победить(не знаю зачем), и расширить до всех контейнеров.

CODE

if call_offset_r2(0x419160, obj_art_fid(object), temp) then begin // art_ptr_lock_
max_frames := call_offset_r0(0x41978C); // art_frame_max_frame_
temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end

О магическая функция, попробую. :)
edit: НЕРАБОТАТЕТ. условие не выполняется, убрал if игра падает на max_frames := call_offset_r0(0x41978C);

А попроще нет такого, как узнать что игрок залез в контейнер, как раньше ты мне давал для сумок, определяло открыта ли она.
Crafty
Притормозил конечно ;)
CODE
variable temp, frame, max_frames := 1;
frame := call_offset_r2(0x419160, obj_art_fid(object), temp); // art_ptr_lock_
if frame then begin
 max_frames := call_offset_r1(0x41978C, frame); // art_frame_max_frame_
 temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end
if max_frames > 1 then ...
Fakeman
да условие не выполняется frame = 0
без условия max_frames всегда = -1
Crafty
Объект-то есть? Дай свой полигон для тестов.
Fakeman
QUOTE
Объект-то есть? Дай свой полигон для тестов.

да есть конечно.
Crafty
Докумекал что я хз как ссылку передать скриптово и потому вместо ссылки на temp передаётся её значение и frame становится равен 0.
Поэтому сделал для этих целей sfall_func2("obj_art_max_frames", object, animID) — вернёт количество фреймов для анимации в текущем виде объекта. Если нет объекта или у него нет fid'а или такая анимация не поддерживается, то вернёт 0.
Под текущим видом объекта подразумевается его ориентация в пространстве, а для персонажей так ещё и оружие в руках.
Проверяй "if obj_is_open(object) or sfall_func2("obj_art_max_frames", object, 0) == 1 then...".
Fakeman
QUOTE
sfall_func2("obj_art_max_frames", object, animID)

ну ты не понял главной фишки) мне нужно то для старых версий под оригинал.
без всяких новых функций.
Fakeman
QUOTE
У функции add_mult_objs_to_inven есть забавный недокументированный эффект

Можно этот эффект выключить? :)
Crafty
QUOTE (Fakeman)
Можно этот эффект выключить? :)
Могут быть последствия (ну как с текущим лимитом — в то время никому и в голову не пришло что можно его превысить).
Fakeman
QUOTE
как с текущим лимитом

текущий лимит это что?

да а я что-то это прямо из скрипта пропатчил двиг.
теперь думаю вернуть обратно скриптовой вариант исправления.

Странное какое-то решение почему именно 500? для чего как думаешь?
по логике должно быть ограничение в 99999 но не как в 500 баг точно.
Crafty
QUOTE (Fakeman)
текущий лимит это что?
Вот эти 99999, видимо из-за навязчивого окошка для указания количества при передаче предмета.
QUOTE (Fakeman)
Странное какое-то решение почему именно 500? для чего как думаешь?
Звёзды так сложились, прикололись, а может спец.значение чтобы показать что было переполнение.
Fakeman
QUOTE
а может спец.значение чтобы показать что было переполнение.

это навряд ли, если добавлять 500 предметов то тоже получим типа переполнение)
я кстати пробовал сменил там 99999 на MAXINT, и нормально без каких либо видимых проблем добавляет сразу 200к
Crafty
Вообще шикарный способ увидеть цель в бою:
CODE
procedure combat_is_starting_p_proc begin
 call iSeeYouInCombat in 1; // или "call iSeeYouInCombat when combat_is_initialized;"
end

procedure combat_is_over_p_proc begin
 cancel(iSeeYouInCombat);
end

procedure iSeeYouInCombat begin
 if combat_is_initialized then begin
  if obj_can_see_obj(self_obj, dude_obj) and свои_условия_для_нападения then attack_setup(self_obj, dude_obj);
  else call iSeeYouInCombat in 1; // лучше 0 вместо 1, тогда частота будет максимальная как у critter_p_proc (быстрее заметят)
 end
end

Можно даже через start или critter_p_proc вместо combat_is_*, но потребует дополнительных усилий.

Альтернативный вариант через событие (общий максимум 40):
CODE
procedure combat_is_starting_p_proc begin
 addnamedhandler("iSeeYouInCombat", iSeeYouInCombat); // не addnamedevent!
 signalnamed("iSeeYouInCombat");
end

procedure combat_is_over_p_proc begin
 clearnamed("iSeeYouInCombat");
end

procedure iSeeYouInCombat begin
 if combat_is_initialized then begin
  if obj_can_see_obj(self_obj, dude_obj) and свои_условия_для_нападения then attack_setup(self_obj, dude_obj);
  else signalnamed("iSeeYouInCombat");
 end
end
Fakeman
CODE
call [...in | when...]
Calls a procedure with an optional delay or condition.

А это что конструкция рабочая?

А критические блоки тоже работают?
CODE
startcritical...endcritical
Declares a block of code as critical.


И это поведение вызовов тоже относится к движку фола?.
CODE
Procedure2 will begin execution immediately after Procedure1 begins execution but possibly before Procedure1 completes. Procedure2 may also finish before Procedure1 if it is shorter or faster than Procedure1

call Procedure1;
call Procedure2;
Ваш ответ: