Fakeman
19 September 2016 | 19:19
в меню это для пользователя, скрипт этого не видит.
может крафти это уже и сделал, я то уже давно это просил.
Crafty
20 September 2016 | 20:38
QUOTE (Fakeman) |
Не понял, почему у тебя уже другое смещение?. |
Перевёл из локального смещения (9F947) в глобальное (0x4AF547).
QUOTE (Fakeman) |
a STAT_better_crit (16) я так понял у dude тоже не используется? |
Используется
всеми персонажами при критических попаданиях для расчёта какая таблица критических эффектов будет
использована:
QUOTE |
The critical hits are chosen by rolling a random number in the range [1, 100], adding 20 if the player has the Better Criticals perk (technically, the crit table modifier stat, which Better Criticals adds 20 to, so other critters can have modifiers), and subtracting 30 if the player has the Heavy Handed trait. The result is looked up in the following table |
random(1, 100) + get_critter_stat(source, STAT_better_crit)
QUOTE (Fakeman) |
Когда уже дополнишь Changelog.txt новыми нововведениями? |
А что там новенького? ;)
QUOTE (Fakeman) |
прикрути к sfall_ver_build чтобы возвращала еще опознавательные знаки, что используется не ориг. версия, что-то в стиле #_CRAFTY |
Нельзя, int же возвращает. Возвращает "sfall2".
Fakeman
21 September 2016 | 01:02
QUOTE |
А что там новенького? |
ну тебе ж виднее)
CODE |
Нельзя, int же возвращает. |
какая разница преобразуй в стринг, в скриптах нет понятия типа данных)
QUOTE |
Используется всеми персонажами при критических попаданиях |
почему тогда у всех персонажей там всегда нуль?
Crafty
21 September 2016 | 01:29
QUOTE (Fakeman) |
почему тогда у всех персонажей там всегда нуль? |
Что в pro'шнике прописали, то и получили (base_stat_better_criticals + bonus_stat_better_criticals).
Foxx
21 September 2016 | 15:11
Crafty, а можно сделать так чтобы
Очки Действия ещё и цифрами отображались. Просто с некоторыми способностями их больше, чем лампочек на панели.
Как-то так:
http://i85.fastpic.ru/big/2016/0921/b4/d46...6a9da282db4.jpgМожет конечно это и глупое предложение))
Fakeman
22 September 2016 | 15:26
Крафти, еще такой технический вопрос, можно ли как-то добраться до свойств флага объекта(криттера) расположенного на карте и изменить его значение???
Вариант изменить флаг в про, а потом создать обьект не подходит.
Crafty
23 September 2016 | 22:12
QUOTE (Foxx) |
Может конечно это и глупое предложение)) |
Выглядит хлопотно... :-p
QUOTE (Fakeman) |
можно ли как-то добраться до свойств флага объекта(криттера) расположенного на карте и изменить его значение???
Вариант изменить флаг в про, а потом создать обьект не подходит. |
Это которые в define_extra.h описаны как CFLG_*? Так через изменение pro'шника (как в твоём примере с CFLG_BARTER) в памяти они не хранятся и движок использует pro'шник.
Или так:
CODE |
call_offset_r2(0x42E6AC, who, flags); // critter_flag_check_ call_offset_v2(0x42E6F0, who, flags); // critter_flag_set_ call_offset_v2(0x42E71C, who, flags); // critter_flag_unset_ call_offset_v2(0x42E74C, who, flags); // critter_flag_toggle_ |
Fakeman
24 September 2016 | 00:36
QUOTE |
Это которые в define_extra.h описаны как CFLG_* |
Нет, это не эти. Вот эти PROTO_IT_FLAG (0x14) (в define_extra оно не определено взял по смешению из итемов.)
оно точно в памяти хранится или в карте для каждого объекта на карте,
в общем нужен бит прозрачности. :)
Crafty
24 September 2016 | 19:34
QUOTE (Fakeman) |
оно точно в памяти хранится или в карте для каждого объекта на карте |
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14 (одинаково у всех объектов).
QUOTE (Fakeman) |
в общем нужен бит прозрачности. :) |
hs_keypress на F11:
CODE |
procedure start;
procedure start begin if not init_hook then begin variable event := get_sfall_arg, keyDX := get_sfall_arg, keyVK := get_sfall_arg; variable flags; if (keyDX == 87) and (event == 0) then begin flags := read_int(dude_obj+0x24); if (flags bwand 0x20000) != 0 then begin flags := flags bwand bwnot(0x20000); end else begin flags := flags bwor 0x20000; end write_int(dude_obj+0x24, flags); refresh_pc_art; end end end |
Только не забывай что бит прозрачности используется "Невидимкой" и при установленном значении видимость врагов уменьшается в 2 раза.
А ещё попробуй бит энергии (0x80000) вместо бита стекла (0x20000) :)
QUOTE (Fakeman) |
QUOTE (Crafty) | QUOTE (Fakeman) | прикрути к sfall_ver_build чтобы возвращала еще опознавательные знаки, что используется не ориг. версия, что-то в стиле #_CRAFTY |
Нельзя, int же возвращает. |
какая разница преобразуй в стринг, в скриптах нет понятия типа данных) |
Да ладно. Действительно, полная анархия.
sfall_ver_build теперь возвращает 509 "sfall2" (без кавычек).
Fakeman
24 September 2016 | 21:06
QUOTE |
Только не забывай что бит прозрачности используется "Невидимкой". |
да блин, мне не у DUDE флаг нужен.
QUOTE |
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14 |
Это Не верно!
Если поставить на карту объект, то потом хоть как ты меняй флаг в pro, он на карте так и останется с таким каким его туда поставили, так же с текущими жизнями у криттера и их FrmID.
QUOTE |
Да ладно. sfall_ver_build теперь возвращает 509. |
Ну нету же там понятия String или Integer.
Там же переменные на подобие как в старом VisualBasic
CODE |
Variant - данный тип добавлен в Visual Basic 5 из версии 2.0. Переменная типа variant может содержать данные любого типа. |
чего значит это 509? -это твое счастливое число, почему не 404)
Отправлено: 24 сен 16 21:14
так стоп
QUOTE |
write_int(dude_obj+0x24, flags); |
То есть вместо dude можно подставить другой указатель на объект?
что-то я не понял.
Crafty
24 September 2016 | 22:17
QUOTE (Fakeman) |
да блин, мне не у DUDE флаг нужен. |
Вот и используй нужный тебе ObjectPtr вместо dude_obj.
QUOTE (Fakeman) |
Это Не верно! Если поставить на карту объект, то |
Инициализируется начальными битами всё так же из pro'шника именно по смещению 0x14.
QUOTE (Fakeman) |
потом хоть как ты меняй флаг в pro, он на карте так и останется с таким каким его туда поставили |
Потом да.
QUOTE (Fakeman) |
Ну нету же там понятия String или Integer. |
Да ладно :-p
CODE |
В описаниях функций компилятора приняты следующие обозначения: ..... Тип_возвращаемого_значения: void - неопределённый тип (функция не возвращает никакого значения) int - целочисленный тип unsigned int - целочисленный беззнаковый тип ObjectPtr - указатель на объект string или char* - символьная строка boolean - логическая переменная (TRUE или FALSE) |
lex.h:
CODE |
typedef struct { int token; /* token we just parsed */ int type; /* will be either T_INT, T_FLOAT, T_STRING, or T_SYMBOL */ union { char *stringData; int intData; float floatData; }; } LexData; |
QUOTE (Fakeman) |
чего значит это 509? -это твое счастливое число, почему не 404) |
Типа того, и 404 тоже весёленькое.
QUOTE (Fakeman) |
То есть вместо dude можно подставить другой указатель на объект? |
Верно.
Fakeman
25 September 2016 | 19:30
QUOTE (Ты) |
QUOTE (Я) | Ну нету же там понятия String или Integer. |
Да ладно :-p
|
Так это тип который возвращается функцией, мы же когда определяем переменную в скрипте не пишем какого типа данные она будет содержать.
ну во общем, я так понял там с твоей стороны тех.проблемы преобразования из инт в стринг.
509 т.е. это константа?
Отправлено: 25 сен 16 19:45
QUOTE |
boolean логическая переменная (TRUE или FALSE) |
var:=true;
var:=1;
if var...
там в движке между boolean и int есть какая либо разница в использовании?
Crafty
25 September 2016 | 21:02
QUOTE (Fakeman) |
Так это тип который возвращается функцией, мы же когда определяем переменную в скрипте не пишем какого типа данные она будет содержать. |
Но компилятор генерирует код исходя из типа обрабатываемых данных. И движок потом обрабатывает переменную исходя из её текущего типа.
QUOTE (Fakeman) |
ну во общем, я так понял там с твоей стороны тех.проблемы преобразования из инт в стринг. |
Глупости-то какие :-p
QUOTE (Fakeman) |
var:=true; var:=1; if var... там в движке между boolean и int есть какая либо разница в использовании? |
lex.c:
CODE |
lexAddConstant(C_TRUE, "true", T_INT, 1); lexAddConstant(C_FALSE, "false", T_INT, 0); |
Foxx
26 September 2016 | 00:07
QUOTE (Fakeman) |
Кстати прицельный в тело вроде как дает какой-то бонус? не в курсе где про это написано) |
QUOTE (Crafty) |
У него нет штрафа, а это бонус |
По моему, при прицельном выстреле в любую часть тела (даже торс) дается 5% шанс нанести критическое повреждение. Или я не прав?
Хотел ещё спросить: кроме torso в ddraw.ini есть ещё BodyHit_Uncalled это что за часть тела?)
Crafty
26 September 2016 | 14:09
QUOTE (Foxx) |
По моему, при прицельном выстреле в любую часть тела (даже торс) дается 5% шанс нанести критическое повреждение. Или я не прав? Хотел ещё спросить: кроме torso в ddraw.ini есть ещё BodyHit_Uncalled это что за часть тела?) |
О выборе части тела для НПС писал выше, для ГГ же, если его атака прицельная, то возвращается та часть тела, в противном случае Body_Uncalled. Далее (некоторые детали я пропущу):
CODE |
1. Определить "шанс_попадания" в часть тела (учитываются штрафы). 2. Замена Body_Uncalled на Body_Torso. 3. min = "шанс_попадания", max = get_critter_stat(source, STAT_crit_chance) - штраф. 4. Определить "тип попадания" (roll_check(min, max)), результат равен 0-3 (ROLL_CRITICAL_FAILURE-ROLL_CRITICAL_SUCCESS). 5. Потом "тип попадания" может поменяться, к примеру с ROLL_SUCCESS на ROLL_CRITICAL_SUCCESS если это ГГ использующий UNARMED/MELEE и у него взят перк Slayer/Смертельный удар. Ну и т.д. |
Пример: у ГГ 8% шанс на крит, 33% шанс попадания в глаза (штраф -60):
min = 33, max = 8 (-60) = 68.
"тип попадания" = roll_check(33, 68) = 3 = ROLL_CRITICAL_SUCCESS.
QUOTE |
Хулио получает критическое ранение (глаза), теряет здоровье (- 54), и этот резкий удар ослепляет его. Хулио умирает. |
Вот из-за второго пункта по-хорошему BodyHit_Uncalled нужно удалить из ini, потому что если его значение не совпадает с BodyHit_Torso, то это не торт.
PS. На всякий, вот так определяется "тип попадания" (roll_check(min, max)):
CODE |
min := min - random(1,100); if min < 0 then begin result := ROLL_FAILURE; if ((game_time/ONE_GAME_DAY) >= 1) and (random(1,100) <= (-min/10)) then begin result := ROLL_CRITICAL_FAILURE; end end else begin result := ROLL_SUCCESS; if ((game_time/ONE_GAME_DAY) >= 1) and (random(1,100) <= (min/10 + max)) then begin result := ROLL_CRITICAL_SUCCESS; end end return result; |
С помощью переменной RemoveCriticalTimelimits можно отключить проверку первого дня.
Fakeman
26 September 2016 | 18:42
А есть что-то подобное, только для криттера/карты?
Crafty
26 September 2016 | 19:19
QUOTE (Fakeman) |
А есть что-то подобное, только для криттера/карты? |
Для криттера:
CODE |
metarule3(107, who, obj_art_fid(who), 0); // art_change_fid_num(who, obj_art_fid(who)); |
Для карты попробуй:
CODE |
call_offset_v0(0x4B12D8); // tile_refresh_display_ |
Fakeman
26 September 2016 | 20:37
QUOTE |
art_change_fid_num(who, obj_art_fid(who)); |
о а я не и додумался флаг ставить пред сменой фида, спасибо за подсказку.
QUOTE |
Базовый PROTO файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника. |
Может еще вот это глянешь, или там все сложно).
Crafty
27 September 2016 | 01:51
QUOTE (Fakeman) |
QUOTE | Базовый PROTO файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника. |
Может еще вот это глянешь, или там все сложно). |
Не улавливаю суть, давай попроще на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается) ;)
Fakeman
27 September 2016 | 02:15
QUOTE |
на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается) |
а где находится его базовый прошник?
может это уже исправили, или вообще это миф)
нафига тогда RP упаковывает прошки в дат?
Crafty
27 September 2016 | 03:07
QUOTE (Fakeman) |
а где находится его базовый прошник? |
PID_VIC = 16777278 (00000062.pro), PID_VIC_STAGE1-PID_VIC_STAGE6 = 16777589-16777594 (00000373.pro-00000378.pro).
QUOTE (Fakeman) |
может это уже исправили, или вообще это миф) |
У меня Вик второго уровня, ну я подсунул в data\proto\critters\ вместо 00000375.pro переименованный 00000378.pro и с атрибутом read-only при апе получаю статы 6 уровня. Вот и не улавливаю суть проблемы ;-p
QUOTE (Fakeman) |
нафига тогда RP упаковывает прошки в дат? |
Чтобы не заморачиваться с установкой read-only, не? ;)
Foxx
27 September 2016 | 08:59
QUOTE (Fakeman) |
нафига тогда RP упаковывает прошки в дат?QUOTE (Crafy) | Чтобы не заморачиваться с установкой read-only, не? ;) |
|
RP упаковывает только начальные (базовые) прошки напарников, которые редактировались:
00000079.pro
00000089.pro
00000107.pro
00000502.pro
00000503.pro
00000504.pro
Fakeman
27 September 2016 | 08:59
Нет, там упаковываются именно базовый кессади и робомозга и еще какието новые партийцы. Остальные просто в папке дата с R/O
Положи базовый вика 62.pro в дата.
Может это будет справидливо только для новой игры, тогда вик несможет апнуться, а так он у тебя уже 2 ур...
Я сам никогда не проводил эксперементы с этими партийцами, возможно, что это как и с древним мифом TeamX о локальной переменной #5 которая как бы дижковая, я давно еще решил полезть и проверить это дело оказалось, что нифига она не движковая, а движковой оказалась вообще нулевая. Тут тоже наверное надо самому все перепроверить. :)
Crafty
28 September 2016 | 00:13
QUOTE |
Базовый PROTO файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника. |
Разобрался, формулировка сбила с толку.
На примере Вика суть такова: его базовый прошник 00000062.pro (и он всегда используется из-за PID_VIC=16777278), а уровни хранятся в 00000373.pro-00000378.pro (но у них другие pid'ы). При получении уровня новые данные (все статы и скиллы) копируются в базовый прошник заменяя собою старые и сохраняя новый базовый прошник в master_patches (data\proto\critters\00000062.pro), а при записи игры в сейвслоте (data\savegame\slot#\proto\critters\00000062.pro), ну а при загрузке восстанавливается в master_patches. Соответственно, если в master_patches есть базовый прошник с read-only, то новые данные не сохраняются и всегда используются из этого базового прошника (потому что движок сначала ищет в master_patches, а потом в master_dat). И уровень не сбрасывается, потому что данные о уровне сопартийцев хранятся в другом месте, а не в их базовых прошниках.
Вывод:
QUOTE |
Базовый PROTO-файл партийца, у которого повышаются уровни, НЕ ДОЛЖЕН быть в master_patches (data\proto\critters\) с атрибутом read-only, а должен быть упакован в master.dat. Иначе статы и скиллы будут всё время сбрасываться до базового прошника. |
Fakeman
28 September 2016 | 00:48
Ясненько)
QUOTE (Crafty) |
Вывод: Базовый PROTO-файл партийца, у которого повышаются уровни, НЕ ДОЛЖЕН быть в master_patches (data\proto\critters\) с атрибутом read-only, а должен быть упакован в master.dat. |
Каким образом это можно побороть?)
А если эти измененные базовые прошки упаковывать в patch.dat, двиг его от туда будет брать, или все равно из master.dat?
QUOTE |
(потому что движок сначала ищет в master_patches, а потом в master_dat). |
patch.dat высший приоритет же имеет.
если это не так то может поправишь чтоб хобя из patch.dat брал.
хотя фиг его знает, нужна ли эта поправка или нет.
Foxx
28 September 2016 | 17:11
Crafty, у тебя в новой версии SFALL2 написано маленькими буквами sfall2, но в игре выглядит как 8fall2. Или мне так кажется))
Crafty
28 September 2016 | 20:07
Удалил из ini переменную NumberPatchLoop, теперь эффект включения постоянный с движковым лимитом 1000 (000-999).
QUOTE (Fakeman) |
А если эти измененные базовые прошки упаковывать в patch.dat, двиг его от туда будет брать, или все равно из master.dat? |
Будет брать там, где найдёт первым. Эффект от базовых прошек в patch###.dat такой же как и от этих прошек в master_patches с атрибутом read-only, то есть после левелапа будет откат на базовые статы и скиллы.
Пример для старой версии с patch001.dat, patch002.dat (но без использования NumberPatchLoop) и подключённым HRP, который добавляет в цепочку каталогов/dat-файлов f2_res.dat и каталог "data\" (Предположение что master_patches всегда указывает на "каталог_игры\data\"? А если будет, к примеру, "левый_каталог\data1\"...).
После инициализации цепочка выглядит так:
CODE |
"patch002.dat" -> master_patches -> critter_dat -> "data\" -> "f2_res.dat" -> master_dat |
QUOTE (Fakeman) |
если это не так то может поправишь чтоб хобя из patch.dat брал. хотя фиг его знает, нужна ли эта поправка или нет. |
Очень даже нужна, и именно так и должен был быть сделан способ с patch###.dat.
Сейчас в новой версии после инициализации цепочка с примером выше выглядит так:
CODE |
master_patches -> critter_patches -> "patch002.dat" -> "patch001.dat" -> critter_dat -> "data\" -> "f2_res.dat" -> master_dat |
Ну и бонус если critter_patches и master_patches одинаковые, то critter_patches из цепочки будет удалён.
QUOTE (Foxx) |
но в игре выглядит как 8fall2. Или мне так кажется)) |
Шрифт, да и не смертельно :-p
Fakeman
28 September 2016 | 20:57
Ничего не понял)
QUOTE |
Будет брать там, где найдёт первым. Эффект от базовых прошек в patch###.dat такой же как и от этих прошек в master_patches с атрибутом read-only, то есть после левелапа будет откат на базовые статы и скиллы. |
Почему откат, ведь если
QUOTE |
При получении уровня новые данные (все статы и скиллы) копируются в базовый прошник заменяя собою старые и сохраняя новый базовый прошник в master_patches ... Соответственно, если в master_patches есть базовый прошник с read-only, то новые данные не сохраняются и всегда используются из этого базового прошника |
в patch.dat у файлов нет никаких read-only и двиг же должен его распаковать в master_patches(т.е в DATA) и записать данные в него, или он напрямую в patch.dat пишет?
и что если patch.dat является папкой, а не архивом?
Сделай вывод, а то ничего не понятно)
Ладно я уже понял, что ты исправил это дело.
а как на счет того чтобы сфалл свои скрипты брал из папки на которую указывал master_patches, а то он всегда берет из Data.
QUOTE |
Ну и бонус если critter_patches и master_patches одинаковые, то critter_patches из цепочки будет удалён. |
Ээээ, тут как бы бессмысленно использовать разные пути.
CODE |
Чтобы сохраненки работали, нужно чтобы critter_patches и master_patches указывали на одну и ту же директорию! |
Crafty
28 September 2016 | 23:38
QUOTE (Fakeman) |
Почему откат, ведь если |
В оригинальной формулировке patch.dat не упоминался и его использование конечно же вносит дополнительные требования. Примерно так для оригинальной игры:
QUOTE |
Базовый прошник партийца, у которого повышаются уровни, НЕ ДОЛЖЕН быть упакован в patch###.dat или быть в master_patches\proto\critters\ с атрибутом read-only, а должен быть упакован в master_dat. Иначе статы и скиллы будут всё время сбрасываться до базового прошника. |
QUOTE (Fakeman) |
в patch.dat у файлов нет никаких read-only и двиг же должен его распаковать в master_patches(т.е в DATA) и записать данные в него, или он напрямую в patch.dat пишет? |
Движок может только читать файлы из .dat-архива.
QUOTE (Fakeman) |
Сделай вывод, а то ничего не понятно) |
Базовый прошник партийца, у которого повышаются уровни, НЕ ДОЛЖЕН быть в master_patches\proto\critters\ с атрибутом read-only, а должен быть упакован в patch###.dat или master_dat (при этом версия в patch###.dat приоритетнее версии в master_dat). Иначе статы и скиллы будут всё время сбрасываться до базового прошника.
QUOTE (Fakeman) |
а как на счет того чтобы сфалл свои скрипты брал из папки на которую указывал master_patches, а то он всегда берет из Data. |
Ага, надо будет поправить, и для gl* и для hs_*.
QUOTE (Fakeman) |
Ээээ, тут как бы бессмысленно использовать разные пути. |
Речь о другом ;) Без этого "бонуса" новая развёрнутая цепочка выглядит так (для простоты без patch.dat и HRP):
CODE |
"D:\Games\Fallout2\data" -> "D:\Games\Fallout2\data" -> "D:\Games\Fallout2\critter.dat" -> "D:\Games\Fallout2\master.dat" |
И при поиске, к примеру, 00000062.pro, который есть только в master_dat, файл дважды будет искаться в "D:\Games\Fallout2\data".
В оригинале так и происходит:
QUOTE |
"D:\Games\Fallout2\data" -> "D:\Games\Fallout2\critter.dat" -> "D:\Games\Fallout2\data" -> "D:\Games\Fallout2\master.dat" |
А нет, приврал в движке уже есть проверка на одинаковые имена.
Переменные critter_patches и master_patches используются только при инициализации движка для создания цепочки каталогов/dat-файлов и поэтому "critter_patches из цепочки будет удалён" © не несёт никакой угрозы :-p
Crafty
30 September 2016 | 23:39
Чутка подправил пару последних постов, чтобы понятнее выглядело.
Поменял все фиксированные "data\" на использование master_patches: глобальные и хуковые скрипты (scripts\gl*.int и scripts\hs_*.int), avi-мувики (\art\cuts\), авто быстросейвы (savegame\), говорящие бошки (art\heads\) и что-то там с шейдерами (shaders\ и art\stex\).
Изменил способ добавления стата при получении перка "Gain stat"/"Добавить стат" теперь можно нормально (без получения +1 к стату) менять gain* перки через perks.ini.
Однако нужно будет допилить DrugExploitFix (разбор очереди событий, одетых вещей с перками), да и всяко это давно планировалось сделать...
Fakeman
1 October 2016 | 15:44
QUOTE |
в бою восприятие умножается на 2 |
Можно узнать смещение этого значения, хочется увеличить до х3, а то некоторые с низким ВС стоят в сторонке и курят.
Что именно ты там изменил с перк.ини ?
Отправлено: 1 окт 16 16:46
и еще по армор ини
CODE |
PID=16777313 Default=16777280 Leather=16777325 Power=16777324 ;Advanced=16777287 Metal=16777323 Cured=16777321 Combat=16777322 ;Robe=16777218 |
вот эти вот Metal/Leather...
нельзя просто заменить на явные номера PID итемов? т.е. чтоб не было никакого хардкодинга.
или же оставить как есть, но добавить возможность вписывать кастомные пиды.
Отправлено: 1 окт 16 16:59
QUOTE |
Поменял все фиксированные "data\" на использование master_patches: |
а всякие временные прохи и worldmap.dat которые создает двиг все равно создаются в DATA?
Crafty
1 October 2016 | 16:59
QUOTE (Fakeman) |
QUOTE | в бою восприятие умножается на 2 |
Можно узнать смещение этого значения, хочется увеличить до х3 |
0x42BACA, но не поможет из-за способа "умножения" сложения.
QUOTE (Fakeman) |
а то некоторые с низким ВС стоят в сторонке и курят. |
Там скорее всего причина в другом...
Можешь попробовать добавить в секцию [Misc] переменную SmarterAI=1.
QUOTE (Fakeman) |
Что именно ты там изменил с перк.ини ? |
Без этого изменения нельзя нормально поменять эффект gain* перков через perks.ini, потому что +1 к стату всё равно добавляет движок.
В perks.ini пропиши:
Возьми перк "Добавить выносливости" и посмотри на результат (ну и чтобы выносливости было меньше 9).
QUOTE (Fakeman) |
нельзя просто заменить на явные номера PID итемов? т.е. чтоб не было никакого хардкодинга. или же оставить как есть, но добавить возможность вписывать кастомные пиды. |
Пока нельзя:
QUOTE |
QUOTE (Ethereal) | Кстати, от идеи управления отображением брони на напарниках, в "NPC Armor" моде, отказался окончательно? |
Почему, просто времени нет. |
Отправлено: 1 окт 16 17:06
QUOTE (Fakeman) |
QUOTE | Поменял все фиксированные "data\" на использование master_patches |
а всякие временные прохи и worldmap.dat которые создает двиг все равно создаются в DATA? |
Другое поменял в исходниках были зашиты пути с фиксированным "data\".
Fakeman
1 October 2016 | 17:11
QUOTE |
0x42BACA, но не поможет из-за способа "умножения" сложения. |
т.е там типа ADD EAX,EAX, а нельзя сменить на MUL или она не влезет в размер.
0x42BACA дай лучше которое в файле.
QUOTE |
Там скорее всего причина в другом... |
явно видно что из-за расстояния ставишь два криттера с разным ВС тот у которого больше бежит.
хотя да тут в чем-то другом дело, видимо другой алгоритм есть
типа ВСx2 потом еще что прибавляется где-то в коде + учитывается куда зырит(повернут) криттер.
вот пример расстояние до тестируемых критеров 35+ гексов тот который с 8 ВС бежит, рядом стоит с ВС 7 не бежит, пока ближе не подойдешь разумеется это все в режиме боя.
ладно забей на это.
SmarterAI=1 что это за недокументированная опция?
попробовал без разницы.
Crafty
1 October 2016 | 20:16
QUOTE (Fakeman) |
т.е там типа ADD EAX,EAX, а нельзя сменить на MUL или она не влезет в размер. 0x42BACA дай лучше которое в файле. |
Да, и в размер не влезет и на mul нельзя поменять (требует подготовки регистров). К тому же это меняет восприятие целей которые стоят за спиной. Восприятие умножается на 5, если цель перед глазами.
0x1BECA.
QUOTE (Fakeman) |
ладно забей на это. |
Ну вот кусок движка:
CODE |
distance = obj_dist_(target, source); source_perception = stat_level_(source_, STAT_pe); target_skill_sneak = skill_level_(target_, SKILL_SNEAK); if (can_see_(_source_, target_)) { // перед лицом computed_distance = 5 * source_perception; if (target_->flags3 & TransGlass_) computed_distance /= 2; if (target_ == obj_dude) { if (is_pc_sneak_working_()) { ..... } else if (is_pc_flag_(sneak)) { computed_distance = 2 * computed_distance / 3; } } if (distance <= computed_distance) return 1; } if (combat_state & 1) // в бою? computed_distance_ = 2 * source_perception; // 0x42BACA else computed_distance_ = source_perception; if (target_ == obj_dude) { if (is_pc_sneak_working_()) { ..... } else if (is_pc_flag_(sneak)) { computed_distance_ = 2 * computed_distance_ / 3; } } if (distance <= computed_distance_) return 1; else return 0; |
QUOTE (Fakeman) |
SmarterAI=1 что это за недокументированная опция? попробовал без разницы. |
Мои эксперименты с улучшением AI.
Ну так сразу разницу и не заметишь. Там дофига описывать оригинальный алгоритм и что я поменял. Лень и никому не интересно.
Fakeman
1 October 2016 | 20:41
QUOTE |
Мои эксперименты с улучшением AI. |
а понятно ну дерзай, дерзай! :)
QUOTE |
К тому же это меняет восприятие целей которые стоят за спиной. |
ну вот тут как раз бы и надо увеличить, а то эти вообще злоядлые курильщики с восприятием 6-7 (15 гексов) резня у них за спиной происходит, а они отдыхают)
QUOTE |
Восприятие умножается на 5, если цель перед глазами. |
Тогда все сходится с ВС=7 как раз не и доставал до тех гексов.
Fakeman
2 October 2016 | 21:43
объясни мне принцип работы сфалла, вот есть MakeCall(addr, func, true);
с помощью нее я смогу сделать ассембл. вставку в код?
addr это адрес в движке с которого будет вызваться моя вставки(func)?
а команда которая непосредственна находится в addr будет выполнена или нет?
и на какой потом адрес происходит возврат из вставки, на след за addr или продолжает с addr?
и для чего нужен третий аргумент функции MakeCall
Foxx
3 October 2016 | 13:17
Crafty, есть ли в движке какие-нибудь различия у режимов холодного оружия: Свинг, Укол? Или это сделано, так для антуража.
Crafty
3 October 2016 | 20:58
QUOTE (Fakeman) |
ну вот тут как раз бы и надо увеличить, а то эти вообще злоядлые курильщики с восприятием 6-7 (15 гексов) резня у них за спиной происходит, а они отдыхают) |
Там не только завязка на "видимости", ещё куча условий отбора цели... К примеру, то, что сейчас меняет SmarterAI можно заметить если есть сопартийцы их просто выносить будут очень быстро если они бегают далеко от ГГ.
QUOTE (Fakeman) |
объясни мне принцип работы сфалла, вот есть MakeCall(addr, func, true); |
Так это не сфалл это ассемблер.
QUOTE (Fakeman) |
с помощью нее я смогу сделать ассембл. вставку в код? addr это адрес в движке с которого будет вызваться моя вставки(func)? |
Да, да.
QUOTE (Fakeman) |
а команда которая непосредственна находится в addr будет выполнена или нет? |
Нет, а поэтому её нужно будет выполнить в твоей вставке. И размер вызова твоей вставки равен 5 байтам.
QUOTE (Fakeman) |
и на какой потом адрес происходит возврат из вставки, на след за addr или продолжает с addr? и для чего нужен третий аргумент функции MakeCall |
Если true, то это вызов функции (call) и возврат из функции будет через retn на addr+5, а если false то это переход по адресу (jmp) и возврат нужно будет указать в твоей вставке.
Если речь о умножении на 3, то с последней версией это не сработает я переписал оригинальную функцию с дополнениями.
Используй хуковый скрипт, не? Вот аналог оригинальной движковой is_within_perception_ в F2, hs_withinperception.ssl:
CODE |
procedure start;
procedure start begin if not init_hook then begin variable source := get_sfall_arg, target := get_sfall_arg, original := get_sfall_arg; variable distance, perception, result; result := 0; if target != 0 then begin perception := get_critter_stat(source, 1); // STAT_pe if combat_is_initialized then distance := perception * 2; else distance := perception; if call_offset_r2(0x412BEC, source, target) then begin // can_see_(source, target) distance := perception * 5; if (read_int(target+0x26) bwand 2) != 0 then distance := distance / 2; // target.flags3 & TransGlass_? end if target == dude_obj then begin if call_offset_r0(0x42E3F4) then begin // is_pc_sneak_working_ distance := distance / 4; if has_skill(target, 8) > 120 then distance := distance - 1; // SKILL_SNEAK end else if call_offset_r1(0x42E2F8, 0) then distance := distance * 2 / 3; // is_pc_flag_(Sneak_) end if call_offset_r2(0x48BBD4, target, source) <= distance then result := 1; // obj_dist_(target, source) end // if original != result then display_msg(obj_name(source)+"->"+obj_name(target)+": "+original+"!="+result); // для отладки return result; end end |
QUOTE (Foxx) |
есть ли в движке какие-нибудь различия у режимов холодного оружия: Свинг, Укол? Или это сделано, так для антуража. |
Хз, искать лень. Может и нет и единственное отличие в анимации. Думаю в вики/etc это уже описано.
Fakeman
4 October 2016 | 02:31
QUOTE |
Если речь о умножении на 3, то с последней версией это не сработает я переписал оригинальную функцию с дополнениями. |
Да просто стало интересно, поставил IDA и залез в движок, ты там idb базу не обновлял?
Почему не через ini изменения вносишь, или в отладочную версию бы вносил.
QUOTE |
Думаю в вики/etc это уже описано. |
Что-то ничего там нету по этому поводу... хотя может не нашел.
Foxx
4 October 2016 | 07:58
QUOTE (Crafty) |
Думаю в вики/etc это уже описано. |
Все нашел. Цитата:
QUOTE |
Свинг Основной тип удара холодным оружием. При расчёте урона в рукопашном бою учитывается модификатор силы. Параметр урона прибавляется к базовому урону оружия. Чем он выше, тем больше повреждений вы будете наносить.
Колоть Часть видов холодного оружия предназначена для колющих ударов. Они тоже получают бонус от урона в рукопашной. Между свингами и уколами нет принципиальных различий. |
Crafty
5 October 2016 | 00:13
QUOTE (Fakeman) |
Да просто стало интересно, поставил IDA и залез в движок, ты там idb базу не обновлял? |
Не обновлял, в старой всё что нужно есть...
QUOTE (Fakeman) |
Почему не через ini изменения вносишь, или в отладочную версию бы вносил. |
Сделал сначала переключение через переменную (но не отразил это в ченжлоге и ini), потом решил что исправление заслуживает постоянного включения (просто как обычно было лень придумывать связное описание в ini да ещё и переводить его) и убрал переменную.
Функция
is_within_perception_ используется в скриптовых функциях
obj_can_see_obj и
obj_can_hear_obj. Опуская предварительные проверки на наличие цели, одинакового уровня карты и прочее (исправление рассмотрели
тут) эти функции выглядят так:
QUOTE |
obj_can_hear_obj:CODE | if is_within_perception_(source, target) then return 1; else return 0; |
obj_can_see_obj:
CODE | if is_within_perception_(source, target) and проверка_препятствий(source, target) then return 1; else return 0; |
Тут для проверки препятствий используется obj_blocking_at_ (результат можно менять с помощью hs_hexmoveblocking). |
В самом движке функция используется, к примеру, при оповещении сопартийцев (и введении их в бой) что ГГ в бою и для этого используется вариант obj_can_hear_obj.
Сама же реализация is_within_perception_ (опять же, опустив всякие дополнительные проверки на скрытность, стелсбой и прочее) всегда при 10 восприятия проверяющего подразумевает что слышит он в радиусе 10 гексов, а если цель перед его лицом так слышит(!) и видит на все 50 . Но что если проверяющий слепой или между его целью есть препятствие, которое сводит на нет его зрение. Вот я и расширил строчку:
QUOTE |
CODE | if call_offset_r2(0x412BEC, source, target) then begin // can_see_(source, target) |
до CODE | if call_offset_r2(0x412BEC, source, target) and (read_int(source+0x44) bwand 0x40) == 0 and проверка_препятствий(source, target) then begin // can_see_(source, target) |
Но тут для проверки препятствий используется obj_sight_blocking_at_ (результат можно менять с помощью hs_hexsightblocking). |
Действительно нужна переменная CanSeeAndHearFix?
Fakeman
5 October 2016 | 02:35
Ничего не понял)
это типа если в бою между НПЦ и ГГ есть этот самый obj_sight_blocking_at_ (кстати что за блокиратор(с каким флагами), и в чем его отличие от obj_blocking_at_ ?) то НПЦ не побежит к ГГ так как не видит его, или чего?
QUOTE |
Действительно нужна переменная CanSeeAndHearFix? |
ну конечно, чем больше всяких крутилок тем лучше)
давай переменную буду тестить чего там изменилось.
Crafty
5 October 2016 | 16:07
QUOTE (Fakeman) |
Ничего не понял) это типа если в бою между НПЦ и ГГ есть этот самый obj_sight_blocking_at_ (кстати что за блокиратор(с каким флагами), и в чем его отличие от obj_blocking_at_ ?) то НПЦ не побежит к ГГ так как не видит его, или чего? |
QUOTE |
obj_sight_blocking_at_ (не установлен флаг LightThru и это Scenery или Wall):CODE | if (obj.flags bwand 0x20000000) == 0 and (obj_type(obj) == 2 or obj_type(obj) == 3) then return obj; else return 0; |
obj_blocking_at_ (не установлен флаг NoBlock и это Critter, Scenery или Wall):
CODE | if (obj.flags bwand 0x10) == 0 and (obj_type(obj) == 1 or obj_type(obj) == 2 or obj_type(obj) == 3) then return obj; else return 0; |
|
Персонаж (ГГ или НПЦ), которого обидели, после получения урона запускает процедуру в которой все сопартийцы (team_num) в пределах is_within_perception_ которых находится обиженный входят в бой. При этом игнорируются любые преграды вроде стен, а если обиженный находится перед лицом обрабатываемого сопартийца, то последний видит в 2.5 раза дальше. Дополнительная проверка на sight убирает этот бонус к расстоянию, если обиженного не видно глазками (есть преграда в виде Scenery/Wall без флага LightThru (через объект проходит свет)).
Чтобы объяснить "слышимость" персонажей сквозь стены/etc можно считать что у всех слух развился в телепатию и они "слышат" чужие мысли в радиусе своего восприятия (в бою *2).
Что касается проверки на слепоту настоящий слепой, вроде повара с базы Наварро (а он действительно такой подробнее в CCCOOK.SSL/map_enter_p_proc), не будет слышать так же как видит зрячий только из-за того, что цель располагается перед его лицом.
QUOTE (Fakeman) |
QUOTE | Действительно нужна переменная CanSeeAndHearFix? |
давай переменную буду тестить чего там изменилось. |
Добавил... :-p
PS. Поправил объяснение.
Fakeman
5 October 2016 | 21:50
QUOTE |
а если обиженный находится перед лицом обрабатываемого сопартийца, то последний видит в 2.5 раза дальше. |
Непонятно! последний это конкретно кто?)
и X*2.5=?
X=?
QUOTE |
Дополнительная проверка на sight убирает этот бонус к расстоянию, если обиженного не видно глазками (есть преграда в виде Scenery/Wall без флага LightThru (через объект проходит свет)). Чтобы объяснить "слышимость" персонажей сквозь стены/etc можно считать что у всех слух развился в телепатию и они "слышат" чужие мысли в радиусе своего восприятия |
Понятно)
Но! тогда нужно сделать некое исключение для НПЦ которые находятся на небольшом расстоянии от ГГ или обиженного НПЦ.
Вот к примеру, есть дом где в одной из комнат ГГ мучает НПЦ резиновой дубинкой) и получается что НПЦ стоящий в соседней комнате с тем же team_num не среагирует на БОЙ, -да? или он услышит визги)
Вообще что-то не особо понятно с этим obj_can_hear_obj, как они там слышат.
Отправлено: 5 окт 16 22:17
И это.
QUOTE |
если обиженного не видно глазками (есть преграда в виде Scenery/Wall без флага LightThru (через объект проходит свет). |
В ванили(в мапере проверил) через уст.флаг LightThru, все равно НПЦ не могут видеть ГГ, так как на объекте есть блокиратор (не уст.флаг NoBlock).
И вроде как в сфалл не фиксит это дело, чтобы НПЦ видели через LightThru, только через ShotThru.
или LightThru может пропускать "звук" для obj_can_hear_obj, да?
Crafty
5 October 2016 | 22:36
QUOTE (Fakeman) |
Непонятно! последний это конкретно кто?) |
Сопартиец.
QUOTE |
Сама же реализация is_within_perception_ (опять же, опустив всякие дополнительные проверки на скрытность, стелсбой и прочее) всегда при 10 восприятия проверяющего подразумевает что слышит он в радиусе 10 гексов, а если цель перед его лицом так слышит(!) и видит на все 50. |
QUOTE |
в радиусе своего восприятия (в бою *2) |
X=10, но поскольку есть обиженный, то это бой и X=10*2=20.
10*2*2.5=50.
QUOTE |
или он услышит визги) |
Угу, или "услышит" чужие мысли.
QUOTE |
В ванили(в мапере проверил) через уст.флаг LightThru, все равно НПЦ не могут видеть ГГ, так как на объекте есть блокиратор (не уст.флаг NoBlock). |
Не зацикливайся на скриптовой obj_can_see_obj, проверка на LightThru нужна в основном чтобы избежать движкового абсурда вроде "видимости" обижаемого на расстояние 40 гексов через кучу стен только потому что сопартиец случайно смотрит в его направлении.
Fakeman
5 October 2016 | 22:56
эээ, а причем тут сопартийцы ГГ, и зачем ему(Сопартийцу ГГ) видеть на 10*2*2.5=50 гексов -еще больше стало непонятно)))
Crafty
5 October 2016 | 23:34
QUOTE (Fakeman) |
эээ, а причем тут сопартийцы ГГ |
QUOTE |
Персонаж (ГГ или НПЦ), которого обидели, после получения урона запускает процедуру в которой все сопартийцы (team_num) в пределах is_within_perception_ которых находится обиженный входят в бой. |
Для любого персонажа другой персонаж с такой же team_num является сопартийцем.
Fakeman
6 October 2016 | 00:22
Определение Сокомандник уместнее было бы, и понятнее в техническом плане, а то сопартийцы уже устоялось, что это именно напарники ГГ.
Fakeman
7 October 2016 | 01:43
Вопрос, можно ли увеличить скорость внутри-игрового времени в игре, без увеличения скорости анимации и п.р. или на этих тиках в движке завязано все-и-вся ?
И почини пути Шейдеров не работают после правки путей, видать не находит путь master_patches=data
Может это дело тоже через переменную фиксить, а то мало ли где-нибудь, когда-нибудь возникнут не стыковки в модах.
QUOTE |
отключена обработка GVAR 491 GVAR_MODOC_SHITTY_DEATH |
это что движковая гвара? для каких целей она обрабатывается.
QUOTE |
* Теперь эффект TurnHighlightContainers действует и на мёртвых персонажей. |
Круто)
Теперь бы еще научить мышку цеплять трупы, если он упал за какой-нибудь объект.
CODE |
;Set to 1 to allow attaching sound files to combat float messages AllowSoundForFloats=1 |
какие такие sound files, такие разве есть?
CODE |
;Set to 1 to enable functions relating to overriding the file system UseFileSystemOverride=1
;Set to 1 to always reload messages, rather than only at map load AlwaysReloadMsgs=0 |
Не в курсе для чего эти??? у тебя кстати их нет в конфиге.
Fakeman
7 October 2016 | 19:14
Сколько не пытался так, и не увидел и не понял в чем конкретно заключается твой фикс, они как бегали на расстояние ВС х 2 х 2.5 = гексов через стенки так и продолжают.
Можешь на словах описать как должны стоять НПЦ, кто на кого должен смотреть, через стену или нет, чтоб хотя бы на живом примере увидеть это.
или же скрином из маппера.
QUOTE |
я переписал оригинальную функцию с дополнениями. Используй хуковый скрипт, не? |
Не это слишком сложно) тем более когда ты уже все сам там сделал, я просто добавлю немного водички :)
CODE |
shl eax, 1 // eax = восприятие * 2 add eax, ebp // + восприятие source notCombat:
|
У тебя в Changelogе не все исправления и добавления написаны. Не хватает.
Исправление сдвига положения курсора ГГ на глобальной карте, при выходе из локации.
Что-то там со скриптовой анимацией Amin в бою.
Исправление минусовых очков SPECIAL при создании персонажа.
Исправление obj_can_see_obj и obj_can_hear_obj
Исправление неправильной инициализации очков действия в начале каждого хода.
Кстати вот это зачем в ТRACE поместил, вроде нормальный баг исправляет.
// Исправление вызова damage_p_proc при промахах если цель не_персонаж
К этой бы тоже переменную замутил. Вроде не сложно.
// Исправление видимости предмета только в активной руке игрока для critter_inven_obj
Кстати combat_is_starting_p_proc очень даже пригодился мне.
CODE |
sprintf(buf, "%s\\art\\heads\\%s\\%d.png" |
это что сфалл головы PNG формата поддерживает?!!!
или что он такое делает с этими PNG файлами.