Crafty
20 August 2017 | 01:43
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
25 August 2017 | 03:51
В продолжении темы о 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
31 August 2017 | 00:28
QUOTE |
// Специально нет проверки что это крит, чтобы обрабатывался некритовый Silent Death |
Специально для тупых) что туда надо писануть чтобы обрабатывалось?
И еще где в движке записаны номер верcии Major/Minor, (что в главном меню пишутся). что-то лазил-лазил не нашел нифига этих цифр.
Crafty
31 August 2017 | 08:50
QUOTE (Fakeman) |
что туда надо писануть чтобы обрабатывалось? |
Не улавливаю о чём речь :-p
QUOTE (Fakeman) |
И еще где в движке записаны номер верcии Major/Minor, (что в главном меню пишутся). |
0x4B4583
Fakeman
1 September 2017 | 00:58
CODE |
Не улавливаю о чём речь |
Че я фигню сморозил да?)
Код для TileMore ты у себя не вырезал?
О как, там оказывается все в разных местах, для меню и для заголовка сохранения в save.dat файле. Понятно.
Crafty
1 September 2017 | 07:56
QUOTE (Fakeman) |
Код для TileMore ты у себя не вырезал? |
Нет (MoreTiles) и если используется HRP, то он должен быть версии 4.1.8.
Fakeman
1 September 2017 | 19:08
У тебя в последних исходниках(версии 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
2 September 2017 | 01:01
QUOTE (Fakeman) |
У тебя в последних исходниках(версии 31) два последних hook'a отключены и как то выведены за пределы if опции MoreTiles. Каково было назначение этих двух хуков? (которые помещены в TRACE) |
Если помнишь там было битовое поле (e или s), которое являлось флагом и определяло [не]видимость крыши на этом тайле. При записи карты движок записывает этот бит, но при загрузке его игнорирует и настраивает [не]видимость крыши по-новой.
Возможна ситуация когда сначала кто-то запишет игру с MoreTiles=0, потом поменяет на 1 и загрузит эту игру. Тогда для тайлов с этим установленным битом будут использованы неверные номера и логично сбрасывать этот бит перед записью карты. Но сделал я это кривенько на "живых" тайлах, а не копии. Что привело к проблеме появления крыши и визуального пропадания ГГ в домах после записи игры. Пришлось временно отключить.
Fakeman
2 September 2017 | 04:05
Ты что-то потом в коде менял, или так и осталось?
Меня интересует ситуация когда MoreTiles будет выставлен всегда в 1 (перманентно).
Я так понимаю, тогда получается что эти две map_save_file_hook и square_load_hook вообще не нужны, да?
Crafty
2 September 2017 | 09:30
QUOTE (Fakeman) |
Ты что-то потом в коде менял, или так и осталось? |
Само собой переписал нормально.
QUOTE (Fakeman) |
Меня интересует ситуация когда MoreTiles будет выставлен всегда в 1 (перманентно). Я так понимаю, тогда получается что эти две map_save_file_hook и square_load_hook вообще не нужны, да? |
Верно.
Crafty
5 September 2017 | 17:11
В замешательстве я :(
и в F1 и в F2 игровое описание перка Slayer|Смертельный удар гласит что все удары станут критическими. Однако для F2 в руководстве пользователя говорится что удар будет критическим при успешном броске кубиков на удачу, в общем так же как и для перка Sniper|Снайпер (оба перка доступны с 24 уровня).
Для F1 с его ограничением в 21 уровень я соглашусь с 100% критом для перка, но вот для F2 у меня припекает ;( Точно хотели сделать обработку как для Снайпера, но забыли...
Легко подправить в движке, но тогда идёт расхождение с игровым описанием.
Кому верить и что делать? ;)
Fakeman
5 September 2017 | 18:19
CODE |
Слауер: Рукопашные атаки становятся критическими в зависимости от Удачи, шанс на критическое попадание рассчитывается по новой формуле (Удача*10).
Снайпер: Вероятность критического попадания при выстреле считается по новой формуле: (Удача*10)%. Показатель шанса на критическое попадание больше не учитывается.
|
То есть для слауера в F2 100% шанс?
Foxx
5 September 2017 | 18:32
Воздействие: Все удары игрока в рукопашном бою будут критическими.
QUOTE ("Fakeman") |
а это бред какой-то написали в википедии, там не компетентные редакторы сидят) |
Это описание перка в игре такое.
Crafty
5 September 2017 | 18:38
QUOTE (Fakeman) |
То есть для слауера в F2 100% шанс? |
Именно нет броска кубиков на удачу, тупо если есть перк сразу замена ROLL_SUCCESS на ROLL_CRITICAL_SUCCESS. У Снайпера нормально всё.
Fakeman
5 September 2017 | 18:40
CODE |
Кому верить и что делать?;) |
Да пусть остается как есть 100% шанс.
или можешь через ини нерф для перка сделать. :)
Crafty
5 September 2017 | 19:11
QUOTE (Fakeman) |
Да пусть остается как есть 100% шанс. или можешь через ини нерф для перка сделать. :) |
Да не будут включать, уж больно лакомый эффект...
Foxx
5 September 2017 | 20:20
QUOTE ("Crafty") |
Кому верить и что делать? ;) |
Я бы пофиксил, т.к. эта способность аналог снайпера, только для рукопашника. Все должны быть на равне :)
Fakeman
5 September 2017 | 23:03
QUOTE |
Да не будут включать, уж больно лакомый эффект... |
А так будут заменять на старые версии, или оригинал.
Поставь по дефолту в 1 :)
Такие фиксы с инишкой хорошо для модов делать, и контролировать изменение сего параметра из скрипта, если установили в 0 то выдать талон на выход с пометкой "Восстановите параметр".
еще неизвестно, что там по этому поводу думает новараин.
может это и не баг, и так было задумано).
Crafty
6 September 2017 | 00:23
QUOTE (Foxx) |
Все должны быть на равне :) |
Разрыв шаблона из-за игрового описания, всё портит.
И с критическими анатомией и пироманом ещё вопрос, из-за них и обратил внимание на расхождение в описании смертельного удара.
QUOTE (Fakeman) |
А так будут заменять на старые версии, или оригинал. |
А это пожалуйста, даже забавно на это глядеть. Кто-то до сих пор использует и рекомендует 1.7.31[r_чего_то_там] даже не представляя сколько изначально было багов в оригинальном сишном коде.
QUOTE (Fakeman) |
еще неизвестно, что там по этому поводу думает новараин. может это и не баг, и так было задумано). |
А он тут причём?
Но зуб даю забыли изменить чутка код чтобы работало как у Снайпера.
Fakeman
6 September 2017 | 01:45
QUOTE |
А это пожалуйста, даже забавно на это глядеть. Кто-то до сих пор использует и рекомендует 1.7.31[r_чего_то_там] даже не представляя сколько изначально было багов в оригинальном сишном коде. |
Опять ты начинаешь, мы еще не посчитали сколько у тебя там багов давай исходники будем считать))
И чисто ради интереса в бартере когда кладешь товары торгоша на стол, ты каким образом считаешь вес этих предметов, перебором?
Мне просто интересно как получить вес всех предметов на столе у игрока, без перебора предметов в скрипте.
QUOTE |
critter arg7 указатель на "стол" с предложенными игроком товарами |
Crafty
6 September 2017 | 02:16
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
6 September 2017 | 02:27
QUOTE |
has_trait(TRAIT_OBJECT, obj, OBJECT_CUR_WEIGHT), не? |
Да для криттеров, а у "стола" тип вообще неопределенный -1
Crafty
6 September 2017 | 02:35
QUOTE (Fakeman) |
Да для криттеров, а у "стола" тип вообще неопределенный -1 |
"Стол" это временный объект, но всё же объект. Без pid и fid, но вес его вещей ты узнать можешь.
Fakeman
6 September 2017 | 02:49
Что-то я подзабыл, сам же нарыл функцию, эта видимо должна посчитать.
https://github.com/phobos2077/sfall/issues/63
Fakeman
6 September 2017 | 19:22
Еще интересует можно ли проверить имеет ли объект контейнер анимацию открывания/закрывания т.е. имеет ли он фреймов >1 ?
в скриптах есть функция obj_is_open она возвращает true если объект открыт (похоже она проверяет номер текущего кадра, если последний то 1), в противном случае false, для тех объектов у которых анимации нет тоже false, но они по сути открыты. вот такая досадная недоработка у функции.
Crafty
7 September 2017 | 04:08
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
7 September 2017 | 13:39
CraftyЧё-то ты не то сделал с APPEARANCE MOD. Если критеры используют стандартную анимацию игрока, то они ее меняют на ту, что выбрал игрок в APPEARANCE.
Смотри, как забавно в Неваде это выглядит :)
http://i91.fastpic.ru/big/2017/0907/3e/211...b0f7bb8a83e.jpg
Crafty
7 September 2017 | 14:14
QUOTE (Foxx) |
Смотри, как забавно в Неваде это выглядит :) |
Лучше бы сейв подкинул :-p (хз что означает "критеры используют стандартную анимацию игрока").
Foxx
7 September 2017 | 14:42
CraftyНу стандартные анимации ГГ: HMJMPSAA, HMLTHRAA, HMMAXXAA и т.д.
У меня сейв только от Nevada CE 3.0 (не запустится на другой)
https://yadi.sk/d/mFp-Nmsj3MgVjUP.S.На сейве только лысый будет. Негра я проверял, чтобы точно удостовериться. В Блэк-Рок Юджин тоже меняется и караванщики в Рино :)
Fakeman
7 September 2017 | 15:32
QUOTE |
Смотри, как забавно в Неваде это выглядит :) |
После твоих манипуляций c добавлением ресурсов из олимпа не совсем понятно, что не так на этом скрине. :)
Crafty
7 September 2017 | 15:41
QUOTE (Foxx) |
Ну стандартные анимации ГГ: HMJMPSAA, HMLTHRAA, HMMAXXAA и т.д. |
Технически всё верно нпс и ГГ используют одну общую анимацию, которую подменяет хиромод. Раньше работало потому что в хиромоде был трюк со сдвигом fid'а у ГГ вверх на количество существующих анимаций из critters.lst.
Могу откатить, но тогда опять вернётся проблема с ГГ'шным fid'ом (/суммон Fakeman ;)) и вроде ещё из-за этого в Мегамоде была проблема с исчезающим тотемным столбом на стартовой локации.
Foxx
7 September 2017 | 15:54
Ну раньше хоть была какая-то индивидуальность при выборе внешности, а теперь кругом лысые/патлаты/блондинки/рыжие. Весь смысл appearance_mod пропадает )))
QUOTE ("Mr.Stalin") |
После твоих манипуляций c добавлением ресурсов из олимпа не совсем понятно, что не так на этом скрине :) |
А, что зря ресурсам пропадать, да и лишняя реклама Олимпу не повредит ;)
Fakeman
7 September 2017 | 16:07
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
7 September 2017 | 17:11
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
7 September 2017 | 18:23
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
7 September 2017 | 19:44
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
7 September 2017 | 20:39
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
7 September 2017 | 21:58
Притормозил конечно ;)
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
7 September 2017 | 22:45
да условие не выполняется frame = 0
без условия max_frames всегда = -1
Crafty
7 September 2017 | 22:51
Объект-то есть? Дай свой полигон для тестов.
Fakeman
7 September 2017 | 23:02
QUOTE |
Объект-то есть? Дай свой полигон для тестов. |
да есть конечно.
Crafty
8 September 2017 | 00:29
Докумекал что я хз как ссылку передать скриптово и потому вместо ссылки на 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
8 September 2017 | 02:34
QUOTE |
sfall_func2("obj_art_max_frames", object, animID) |
ну ты не понял главной фишки) мне нужно то для старых версий под оригинал.
без всяких новых функций.
Fakeman
13 September 2017 | 20:28
QUOTE |
У функции add_mult_objs_to_inven есть забавный недокументированный эффект |
Можно этот эффект выключить? :)
Crafty
13 September 2017 | 22:39
QUOTE (Fakeman) |
Можно этот эффект выключить? :) |
Могут быть последствия (ну как с текущим лимитом в то время никому и в голову не пришло что можно его превысить).
Fakeman
13 September 2017 | 23:16
QUOTE |
как с текущим лимитом |
текущий лимит это что?
да а я что-то это прямо из скрипта пропатчил двиг.
теперь думаю вернуть обратно скриптовой вариант исправления.
Странное какое-то решение почему именно 500? для чего как думаешь?
по логике должно быть ограничение в 99999 но не как в 500 баг точно.
Crafty
14 September 2017 | 01:20
QUOTE (Fakeman) |
текущий лимит это что? |
Вот эти 99999, видимо из-за навязчивого окошка для указания количества при передаче предмета.
QUOTE (Fakeman) |
Странное какое-то решение почему именно 500? для чего как думаешь? |
Звёзды так сложились, прикололись, а может спец.значение чтобы показать что было переполнение.
Fakeman
14 September 2017 | 01:53
QUOTE |
а может спец.значение чтобы показать что было переполнение. |
это навряд ли, если добавлять 500 предметов то тоже получим типа переполнение)
я кстати пробовал сменил там 99999 на MAXINT, и нормально без каких либо видимых проблем добавляет сразу 200к
Crafty
20 September 2017 | 02:35
Вообще шикарный способ увидеть цель в бою:
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
20 September 2017 | 16:55
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;
|