Полная Версия: (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
Fakeman
Вот я уже и не помню что там конкретно было, еще год назад что-то там мутил, но точно что-то связанное с map_enter_proc в скрипте критера и получением координат игрока при его заходе не по координатам указанным в карте. как узнаю точно что конкретно сообщу.

Сейчас попробовал по тестировать это дело, и как оказывается в движке есть баг. critter_attempt_placement/override_map_start в map_enter_proc для игрока вообще не работают.

имеем такую конструкцию в скрипте карты.
CODE
map_enter_proc begin
     display_msg("map_enter:" + dude_tile);
     critter_attempt_placement(dude_obj, 20100, 0);
     display_msg("map_enter:" + dude_tile);
end

map_update_p_proc begin
   display_msg("map_update:" + dude_tile);
end

в логе у нас появляется такая последовательность:
CODE
"map_enter: 26000" //координаты захода на карту указанные в самой карте (стартовых координатах карты)
"map_enter: 20100" //координаты куда переместился наш игрок
-
"map_update:" 20100"  // ну да так и есть стоит там где надо
"map_update:" 26000"  // и тут БАЦ!!! что-то щелкнуло в движке, и игрока перекидывает обратно в стартовые координаты карты (или на координаты на которые указываю сетки перехода).

critter_attempt_placement в маппере работает корректно только при первом заходе на карту, в самой игре нет.
critter_attempt_placement/override_map_start — работает если их применять только в map_update.
это тесты для DUDE, для криттеров с critter_attempt_placement вроде проблем с этим нет.

а set_map_start — вообще какой-то не рабочий что-ли (тупо не меняет координаты карты еще и в дебаг-логе ошибку выдает) или я не понял как и где его можно правильно применить.

Отправлено: 13 мая 17 18:25
Вот еще тест с использованием добавочного криттера.
CODE
map_enter_proc begin
     display_msg("Critter map_enter:" + dude_tile);
end
map_update_p_proc begin
     display_msg("Critter map_update:" + dude_tile);
end

скрипт карты тот-же только без critter_attempt_placement
Просто заходим на карту из другой карты на координаты 11000, лог такой:
CODE
"MAP map_enter: 26000" //стартовые координаты указанные в самой карте.
"Critter map_enter: 26000"
-
"MAP map_update: 26000"  
"Critter map_update: 26000"
//второй проход update
"MAP map_update: 11000"  //координаты указанные в сетке перехода из другой карты.
"Critter map_update: 11000"

Вот о чем я говорил, не можем получить в map_enter_proc координаты игрока при заходе на карту, также сразу не можем получить и в map_update_proc, а только со второго прохода.
Можно с этим что-то сделать, или это специфика работы такая? — и нафига нужен этот двух проходный map_update может один удалить :P
а еще у криттеров обработчик start тоже всегда два раза под ряд выполняется.

И кстати заметил что стартовые координаты всегда открывают на авто-картах кусочек карты, как будто игрок там уже побывал — видимо по причине того что игрок всегда заходит на стартовые координаты, а потом его перемещает куда нужно.
Crafty
override_map_start сработает всегда, но эффект виден только при первой загрузке карты. При переходах через сетки выхода используются переменные в которые заносятся данные о точке выхода. Можно воспользоваться set_exit_grids для переопределения этих данных, но эффект будет постоянный. Или же, когда переход осуществляется через сетку выхода, отключать использование переменных с данными точки выхода. Если же нужен переход по координатам при использовании конкретной сетки выхода, то можно сравнивать значения переменных точки выхода:
CODE
read_int(0x631D2C) = elev
read_int(0x631D30) = tile_num, если равно 0 то пропускается установка данных сетки выхода
read_int(0x631D34) = rotation

Вот пример с переопределением координат при первой загрузке и при заходе через храм (если заходить через деревню, то используются координаты сетки), artemple.ssl:
CODE
procedure map_enter_p_proc begin
 display_msg("before:" + tile_num(dude_obj));
 override_map_start(18482 % 200, 18482 / 200, 0, 5);
 display_msg("override:" + tile_num(dude_obj)+", elev="+read_int(0x631D2C)+", tile_num="+read_int(0x631D30)+", rotation="+read_int(0x631D34));
 if read_int(0x631D28) > 0 and read_int(0x631D2C) == 0 and read_int(0x631D30) == 16486 then write_int(0x631D30, 0); // переход через сетку, игнорируем данные
 display_msg("after:" + tile_num(dude_obj));
end

QUOTE (Fakeman)
игрок всегда заходит на стартовые координаты, а потом его перемещает куда нужно.
Всё верно.
Fakeman
А может тогда можно получить координаты игрока в map-enter, через read_int? Адресок не подскажешь?) 0x631D30 или это оно и ест.
Crafty
QUOTE (Fakeman)
А может тогда можно получить координаты игрока в map-enter, через read_int? Адресок не подскажешь?) 0x631D30 или это оно и ест.
tile_num(dude_obj), не? Если значение по адресу 0x631D30 не равно 0, то гг будет перемещён в это место.
Fakeman
Dude_tile выше в логах видно что возвращает номер тайла указанный в карте, мне нужно координаты на которые будет перемещен гг в мап update.
read_int(0x631D30) — попробовал, это как раз то что нужно.

Crafty
QUOTE (Fakeman)
Dude_tile выше в логах видно что возвращает номер тайла указанный в карте, мне нужно координаты на которые будет перемещен гг в мап update
Я же специально привёл пример с уже готовыми отладочными строчками — достаточно добавить и проверить (начать новую игру, зайти в храм, потом выйти), чтобы на выходе получить (с настроенным map_update):
QUOTE
before:18492
override:18482, elev=0, tile_num=0, rotation=0
after:18482
update:18482
Вы находитесь в темном, сыром храме. Вам повсюду мерещатся тени, вы слышите слабые звуки — похоже, там кто-то движется.
before:18492
override:18482, elev=0, tile_num=16486, rotation=0
after:18482
update:18482
update:18482
Fakeman
Ну что там у тебя... придумал для игры чего-нибудь нового и полезного?)

CODE
! Исправлен неправильный подсчёт количества вещей в движковой функции item_count_.
! Исправлен перк "Размах", а функция apply_heaveho_fix ничего не делает (пустышка).

а чего делал этот apply_heaveho_fix
и как ты исправил перк? :)

Чего там за баг такой был при подсчете в item_count_ ?
вроде как проблем с подсчетом не замечал, фильтр нормально работал и без фикса, единственное с сумками проблема.

CODE
* Теперь функция sfall_ver_build всегда возвращает "sfall2".

Ну вот видишь можешь, а говорил про какой-то несовместимый int
Crafty
QUOTE (Fakeman)
Ну что там у тебя... придумал для игры чего-нибудь нового и полезного?)
Мелкими улучшениями занимаюсь :-p

QUOTE (Fakeman)
и как ты исправил перк? :)
Описание для F1 звучит так:
QUOTE
{236}{}{За каждый уровень этой cпособности вы получаете +2 к cиле при применении метательного оружия, но только для определения расстояния.}
А для F2 более развёрнуто:
QUOTE
{1136}{}{Каждый уровень способности дает вам +2 к Силе (до 10) для повышения дальности броска. Она не позволяет превышать максимальную дальнобойность оружия.}

В данных перка есть защита от его взятия если сила превышает 8, однако с помощью эксплоита химии/радиации можно (при 10 силы) понизить до 4 и взять 3 уровня перка, получив при этом 16 силы (после окончания действия химии) для расчёта дальности. Сама же дальность считается как 3 гекса за 1 очко силы. Поэтому можно сделать дальность броска равной 48 гексам и это при том, что дальность у снайперской винтовки равна 50, а у другого оружия так и меньше. Что за нафик олимпийский метатель? Всё равно обычная дальность метательного оружия не превышает 15 гексов (максимум у святой гранаты = 20).
Теперь есть проверка и урезание силы до 10, а значит и максимальная дальность 30 гексов (но оружия такого всяко нет).

QUOTE (Fakeman)
а чего делал этот apply_heaveho_fix
Масло маслянное — убирал защиту от значения силы для взятия перка и менял формулу расчёта дальности с "дальность = (сила + (уровень_перка * 2)) * 3" на "дальность = ((сила * 3) + (уровень_перка * 6))".

QUOTE (Fakeman)
Чего там за баг такой был при подсчете в item_count_ ?
вроде как проблем с подсчетом не замечал, фильтр нормально работал и без фикса, единственное с сумками проблема.
Функция используется в destroy_object, rm_mult_objs_from_inven, destroy_mult_objs и при торговле. Вот с сумками это и проявлялось — неправильный переход в функции приводил к продолжению "подсчёта" несуществующих вещей ещё и в сумке, а потом сбрасывал количество ранее найденных вещей в 0, что в конечном итоге приводило к проблемам:
QUOTE
Per's guide said:
    The Bag is responsible for an inventory bug which sometimes lets you keep items that are really supposed to disappear from your inventory, depending on which script command is being used to remove them. Items are "protected" if they're below the Bag in your inventory, apparently because the engine can't handle the container item type properly.
С скриптовыми командами хлопотно заморачиваться, есть более простой способ для проверки бага — сумка и вещь, открыть с кем-то торговлю и перетащить на стол обмена сначала сумку, а потом вещь и нажать Esc (отмену торговли). Снова открыть торговлю — вещь и сумка вернулись в наш инвентарь. Теперь перетащить сначала вещь, а потом сумку и нажать Esc. Открыть торговлю — добро тю-тю.

QUOTE (Fakeman)
Ну вот видишь можешь, а говорил про какой-то несовместимый int
Да там полная анархия :(
Fakeman
CODE
с
дальность = (сила + (уровень_перка * 2)) * 3
на
дальность = ((сила * 3) + (уровень_перка * 6))

не понял, тут у формул результат "дальность" один и тот же.
это две одинаковые формулы только написаны по разному.
в чем тут прикол?)
Crafty
QUOTE (Fakeman)
это две одинаковые формулы только написаны по разному.
в чем тут прикол?)
Вот в том и прикол — масло ;) Не считая конечно снятия ограничения на силу для получения перка. Что всё равно лишено смысла из-за отсутствия подходящего метательного оружия и абсурдности с дальностью в 48 гексов при максимуме.
Описание:
QUOTE
Edit2: In any case, I'll work the way through the rest of the useless perks in per's list, and see if any of the others can be easily altered. I'll alter heave ho to give bonuses above the normal cap on throwing range, at least.
.....
Heave ho will now increase thrown weapon range beyond their usual maximums
Crafty
QUOTE (Foxx)
не работает скорость DialogPanelAnimDelay — это касается только Невады.

QUOTE
not important — ERROR: At address 0x446846 expecting 0x0F30FE83, got 0x0F31FE83
DialogueFix.
QUOTE
not important — ERROR: At address 0x4BF3BA expecting 0xB8147431, got 0xB814EB31
Так называемый CityLimit patch.
QUOTE
not important — ERROR: At address 0x447EB5 expecting 0x000021BB, got 0x000012BB
DialogPanelAnimDelay.

Это "другой способ проверки целостности данных". Если экзешник (даже не сам экзешник, а код/данные в памяти) подправлен в нужном нам месте, то "патч" не накатывается, чтобы не возникли проблемы.
Не опасно если это "not important" — ну только что-то перестанет, как DialogPanelAnimDelay, работать, да и в faq придётся это отметить ;-p

Но можно вернуть данные в экзешнике на оригинальные (конечно там где возможно).
А вообще я наверное потом подправлю код чтобы сократить подобное (но не везде это выйдет, да и смысл проверки целостности данных теряется).
Fakeman
Жаль, что я сейчас пока занят другим, а не скриптингом, а то бы занял бы тебя чем-нибудь более полезным, чем вот эта проверка данных на целку) Ничего скоро допишу программу и вернуть к скриптам, ты главное в режим Frozzzen не впадай)
Crafty
QUOTE (Foxx)
Цитирую полностью пользователя с ошибкой в Nevade:
QUOTE (milkinway)
Довольно неприятная ситуация, может быть БАГ, связанный с инвентарем. Ситуация следующая — нахожусь в Лас-Вегасе, побывал в нарколаборатории в Питомники, разобрался с местным "населением", когда собирал вещички, кое-что уложилось в инветаре странным образом. Так например вместо одних пустых шприцов в инвентаре появились сразу три независимых друг от друга набора пустых шприцов, то же самое — с цветками брока (4 и 3 в каждом "наборе").
Поправил (наверное) это (и только это). Проверить толком не могу — сейвы не исправить (вообще можно — так не_толком проверял), а начинать новую игру и искать карту (двигаясь по сюжету) где появляется, к примеру, корень брока в столе/ящике/etc нет времени.
Fakeman
Скажи мне пожалуйста, мне необходимо в движке найти все возможные варианты опций к параметрам из конфигурационного файла AI.txt
на примере
hurt_too_much = string
ее варианты опций
crippled
blind
crippled_arms
Может еще чего там есть.
Еще несколько параметров есть которые хотелось бы проверить, а может там какие новые найду, которые отсутствуют в самом файле.

Еще хотелось бы про шерстить код двига на параметры из файла worldmap.txt, может тоже чего нового найдется, там меня интересуют условия
CODE
If:<something> -- conditionals, allows <,>,<=,>=,==,& as well as tests
;    on Player(<stat/attribute/skill/etc.>), Enctr(Num_Critters),
;    Time, Global(<variable index>), Rand(Chance%)

в частности интересует Player(<stat/attribute/skill/etc.>)
действительно ли можно задавать условия ну например на скиллы, или это так -написали без реализации... как-то сомнения есть что реализовали, потому как кроме проверка игрока на уровень там ничего больше и не проверяется.

Вообще это видно будет не вооруженным глазом в коде движка? — или там без спец оборудования не обойтись)
Crafty
QUOTE (Fakeman)
на примере
hurt_too_much = string
Открываешь в Иде окно строк (Shift-F12), потом фильтруешь (Ctrl-F) по hurt_too_much, переходишь по адресу и через ссылки (X) попадаешь в кусок кода где это используется. Обращаешь внимание на функцию parse_hurt_str_, заходишь в неё и видишь _matchHurtStrs с вариантами.

QUOTE (Fakeman)
действительно ли можно задавать условия ну например на скиллы, или это так -написали без реализации... как-то сомнения есть что реализовали, потому как кроме проверка игрока на уровень там ничего больше и не проверяется.
Видимо хотели, но не доделали — wmParseSubConditional_ обрабатывает rand, global, player(level), days_played, time_of_day и enctr(num_critters).
Fakeman
ага спасибо нашел не достающие опции.
там как еще оказывается таких "<=",">=" операторов сравнения нет.
но и есть другие, типа "_" не знаешь, что это за такой новый знак для сравнения?)
"|" такую палку знаю, а нижнюю палку что-то никогда не видел в использовании.
Crafty
QUOTE (Fakeman)
там как еще оказывается таких "<=",">=" операторов сравнения нет.
но и есть другие, типа "_" не знаешь, что это за такой новый знак для сравнения?)
Посмотрел где в дальнейшем (конкретнее wmEvalSubConditional_) это проверяется — "_" не используется, также как " ", "and" и "or".
Fakeman
как это AND не используется, вот
CODE
If(Global(386) > 0) And If(Global(386) < 6)


Вот OR там ни где нет, это точно что он не реализован?
Crafty
QUOTE (Fakeman)
как это AND не используется
Не, речь о другом.

QUOTE
там как еще оказывается таких "<=",">=" операторов сравнения нет.
но и есть другие, типа "_"
Если смотреть на список условий _wmConditionalOpStrs, то к нему можно случайно добавить ещё 3 условия из _wmConditionalQualifierStrs (поскольку на него нет ссылок) и предположить, что если бы варианты Player(<stat/attribute/skill/etc.>) были полностью реализованы, то вполне возможно в условии можно было бы делать проверку конкретного флага (или наверное атрибута).

С rand, global, player(level), days_played, time_of_day и enctr(num_critters) можно использовать только "==", "!=", "<" и ">".

QUOTE
Вот OR там ни где нет, это точно что он не реализован?
Так-то AND и OR конечно используются:
CODE
If(Player(Level) == 5) Or (Player(Level) == 7)
Crafty
QUOTE (Pyran)
До этого был sfall 1.7.31r3 и пара глюков
КАТЕГОРИЧЕСКИ не советую пользоваться версией 1.7.31r3 (и меньше) ;)
Fakeman
31имхо самая лучшая) все что выше ты там много повыпиливал.
А что в 31 и ниже что-то не так работает?)

Crafty
QUOTE (Fakeman)
31имхо самая лучшая) все что выше ты там много повыпиливал.
Например? DebugEditorKey — это много? ;)

QUOTE (Fakeman)
А что в 31 и ниже что-то не так работает?)
В сишном коде куча проблем.
Fakeman
QUOTE
DebugEditorKey — это много? ;)

Это главная программулина сфалла, без нее даже играть и не хочется)
вот еще DontDeleteProtos вырезал)

QUOTE
В сишном коде куча проблем.

Та ну не больше чем машинных мнемониках. :)
Сам то подумай где легче всего ошибиться.
Кстати давно не запускал мнемоневкую версию, может там новые ошибки посыпятся)
Crafty
QUOTE (Fakeman)
Сам то подумай где легче всего ошибиться.
Я говорю о уже существующих ошибках, а не о возможных из-за выбора языка.
Fakeman
А в чем выражаются эти ошибки, они как то влияют на игру, или чисто технические?

Ты у себя пофиксил баг связанный с flare c включенной опцией "снаряды испускают свет" непомню как там по английски, еще есть баг с изменением базового фида у игрока при включеном моде смены скина игрока.
Баг случайно не починил про который я писал несколько месяцев назад связанный с мультинех криттерами? Вроде как ты что-то буркнул про это и тишина)
Crafty
QUOTE (Fakeman)
А в чем выражаются эти ошибки, они как то влияют на игру, или чисто технические?
Будто есть отличие технических ошибок от влияющих на игру, а впрочем мне всё равно — я предупредил ;-p

QUOTE (Fakeman)
Баг случайно не починил про который я писал несколько месяцев назад связанный с мультинех криттерами? Вроде как ты что-то буркнул про это и тишина)
Ничего вообще не говорил, к тому же не понимаю о чём речь и как это воспроизвести (сходил к королю Крыыс, ближайшей мультихекс животинке).
Fakeman
Вот
QUOTE
во время боя такие криттеры вплотную подходят к игроку, т.е к своему центральному гексу а не к крайнему, и гг как бы оказывается внутри моба :) но это фигня, главное то что моб тратит при подходе на одно очко AP больше.

+ если такому мобу дать метательное оружие он будет попадать сам в себя)

если будешь править то желательно чтоб с исходником правки, чтоб я в это 31 версию это встроил)
Crafty
QUOTE (Fakeman)
если будешь править то желательно чтоб с исходником правки, чтоб я в это 31 версию это встроил)
CountWrite8 0xEB,0x42A153,0x42A17C
Fakeman
Благодарю!
На попадание 'самим в себя' тоже действует? — а то не проверял на это дело.
Crafty
QUOTE (Fakeman)
На попадание 'самим в себя' тоже действует? — а то не проверял на это дело.
Не проверял, также как и мультихекс атакует мультихекса. Мне воссоздать такую ситуацию весьма сложно (искать энкаунтер вроде "кентавры нападают на кротокрысов"), в наличии были только ГГ и король Крыыс.
Fakeman
Ну ты ды даешь ты что там по картам фола бегаешь в поисках подходяших доноров?)
Ведь ничего сложного нет — поставить на пустую карту криттеров, потом установить карту в конфиге в качестве стартовой (или запустить ее по Cntl+R но вроде как бои не пашут таком режиме).
Попадание самого в себя, можно на цветке проверить, предварительно сделав его мультинехом, и дав ему шипов, подходишь в упор к цветку и начинаешь смотреть как он попадает сам в себя) тут это похоже зависит от его % попадания, на расстоянии такого глюка не наблюдается вроде как, или он просто очень низок.

Бой между криттерами тоже просто сделать, устанавливаешь на карте одному из криттеров команду игрока в 0, + убрать привязанный скрипт у криттера, чтоб команда не переопределялась.
Я проверил, и что-то не особо то и понятно, заходят ли они друг на друга или нет, ну то ладно это уже их интимные проблемы, нас они не волнуют)
Crafty
QUOTE (Fakeman)
Ну ты ды даешь ты что там по картам фола бегаешь в поисках подходяших доноров?)
В принципе да.
QUOTE (Fakeman)
Ведь ничего сложного нет
Тому, кто этим занимается :-p
QUOTE (Fakeman)
поставить на пустую карту криттеров, потом установить карту в конфиге в качестве стартовой
Тю, так делай сразу нужную artemple.map карту и кидай ссылку.
QUOTE (Fakeman)
Попадание самого в себя, можно на цветке проверить, предварительно сделав его мультинехом, и дав ему шипов, подходишь в упор к цветку и начинаешь смотреть как он попадает сам в себя) тут это похоже зависит от его % попадания, на расстоянии такого глюка не наблюдается вроде как, или он просто очень низок.
Тогда те два адреса здесь не помогут.

Отправлено: 23 июн 17 00:40
QUOTE (Foxx)
по умолчанию CanSeeAndHearFix=1 включена.
Заметил, что с ней в Неваде наблюдается проседание fps в некоторых локациях. Могут с ней еще какие-нибудь проблемы выскочить или это не опасно))
Поправил эту пичальку ;)
Fakeman
QUOTE
Тому, кто этим занимается :-p
Тю, так делай сразу нужную artemple.map карту и кидай ссылку.

Маппер вроде не такая уж и высокая наука. :)
У меня только оригинальная artemple.map, может все-же пустую тебе сделать?

QUOTE
Тогда те два адреса здесь не помогут.

да я уже посмотрел что там только на движения.
Crafty
QUOTE (Fakeman)
Маппер вроде не такая уж и высокая наука. :)
Не интересно :-p
QUOTE (Fakeman)
У меня только оригинальная artemple.map, может все-же пустую тебе сделать?
Да без разницы, главное чтобы её достаточно было скопировать в data\maps\ и запустив новую игру получить нужный энкаунтер.
Crafty
В хиромоде давным-давно есть одна особенность которой не было в оригинальном варианте: сначала обрабатываются файлы в каталоге, а затем в dat-файле. Иными словами — можно упаковать, к примеру, содержимое HMR00S01 (с английским описанием стиля) в dat-файл, поместить его в \Appearance, там же создать каталог HMR00S01 и поместить в него AppStyle.msg, но уже с русским описанием.
Foxx
Crafty
Значит сейчас можно папки из APPEARANCE запаковать в .dat, каждую папку в отдельный .dat (HFR00S01.dat, HFR00S02.dat и т.д.)?

Или все папки в APPEARANCE.dat [было бы круто] ;)
Crafty
QUOTE (Foxx)
Значит сейчас можно папки из APPEARANCE запаковать в .dat, каждую папку в отдельный .dat (HFR00S01.dat, HFR00S02.dat и т.д.)?
Этот способ. Вообще-то он всегда и существовал, но в оригинальном варианте если нашли dat-файл, то файлы читались только из него. Если не нашли — из каталога.
Когда переписывал хиромод так подправил обработку чтобы обрабатывалось содержимое каталога, а затем и dat-файла. Удобно для мультиязычных вариантов.

Отправлено: 25 июн 17 20:06
У всех персонажей в игре постоянно и очень-очень часто вызывается скриптовый обработчик critter_p_proc (конечно если определён) внутри которого как правило происходит проверка видимости ГГ, и если этот персонаж "видит/слышит" ГГ, то может совершать разные сюжетные действия — атаковать, к примеру ;)

Видимость и слышимость персонажа зависят от его восприятия — для видимости это восприятие*5 когда цель находится перед лицом, а для слышимости равна восприятие*1 не_в_бою или восприятие*2 в_бою. Результаты могут быть меньше в зависимости от некоторых факторов (у цели включён стелсбой или режим скрытности), но они не существенны для понимания и их опустим.

Есть две скриптовые функции для проверок: obj_can_see_obj и obj_can_hear_obj. В нормальной реализации они должны были бы использоваться в обработчике critter_p_proc вместе, примерно как "if obj_can_see_obj(source,target) or obj_can_hear_obj(source,target) then source_видит_ИЛИ_слышит_target", а их содержимое упрощённо выглядело бы примерно так:
QUOTE (obj_can_see_obj)
if (source не слепой) and (target перед лицом source) and (между source и target нет преград) and (расстояние не превышает видимость) then return TRUE; else return FALSE;
QUOTE (obj_can_hear_obj)
if (между source и target нет стены) and (расстояние не превышает слышимость) then return TRUE; else return FALSE;

Однако вместо этого их содержимое частично объединили в одну универсально-урезанную движковую функцию:
QUOTE (is_within_perception_)
if ((target перед лицом source) and (расстояние не превышает видимость)) or ((расстояние не превышает слышимость)) then return TRUE; else return FALSE;

И стали её использовать внутри obj_can_see_obj и obj_can_hear_obj, при этом вторая функция просто вызывает is_within_perception_ и более ничего не делает, а первая теперь выглядит примерно так:
QUOTE (obj_can_see_obj)
if is_within_perception_(source,target) and (между source и target нет преград) then return TRUE; else return FALSE;

Для проверки наличия преград есть несколько движковых функций, но используется та, в которой объект является преградой если у него сброшен флаг NoBlock и это элемент интерьера (стол, стул), персонаж (у живых флаг сброшен, а у мёртвых нет) или стена (ну тут понятно что флаг должен быть сброшен).

В 99.9% используется только obj_can_see_obj, ну и последствия реализации видны, к примеру, тут:
QUOTE
In both F1 and F2 Steal detection is on a line-of-sight basis. IE if you have an NPC and you stand near Killian the NPC will be near by. You can then tell the NPC to leave the party and if he blocks Killian's line-of-sight you can just steal every item on Killian's desks with 100% immunity and a Steal skill of 0. The F2 engine should mean you can now push an NPC right next to Killian with no trouble.

obj_can_hear_obj практически не используется — слепого повара можно не учитывать, да и без проверки на слепоту он вообще круче зрячего.

Но и это не всё ;) Функция is_within_perception_ используется самим движком в бою для оповещения собутыльников об агрессивных действиях. Без проверки на преграды! Ну ладно, слышимость через стены ещё можно принять (да и другого способа нет) — допустим из-за эволюции или радиационных мутаций слышимость в бою трансформируется в сверхчувствительность по отношению к собутыльникам, но видимость...! Абсурдно же, когда напали на персонажа, а его собутыльник в десяти+ метрах этого не слышит только потому что стоит спиной. В то время как другой собутыльник, стоящий лицом на расстоянии в два раза большем и с несколькими стенами в качестве преграды, ломится к обидчику.

Что представляет из себя CanSeeAndHearFix? Изменяет is_within_perception_ на что-то вроде:
QUOTE (is_within_perception_)
if (source не слепой) and (target перед лицом source) and (между source и target нет преград) and (расстояние не превышает видимость) then return TRUE;
if ((в бою) or (между source и target нет стены)) and (расстояние не превышает слышимость) then return TRUE;
return FALSE;

В obj_can_see_obj не будет вызова проверки преград (зачем второй раз вызывать), в obj_can_hear_obj source временно становится слепым перед вызовом is_within_perception_, а после восстанавливает состояние зрения.

После включения (CanSeeAndHearFix=1) source может не видеть, но слышать (особенно когда он слепой), нормально работает obj_can_hear_obj. Некоторые бои могут стать легче (в Реддинге в бою с королевой несколько собутыльников не прибегает с другого конца карты).

Добавил в example_mods\is_within_perception_\ скрипт с оригинальной F2-реализацией функции. Можно включить CanSeeAndHearFix и в бою посмотреть кто перестал видеть ГГ.
Diana
Какая-то беда с последним SFall2 (v1.7.44) — меня периодически в упор перестают замечать криттеры (на полях с собачкой слева от Арройо, например).
Причём это не зависит ни от настройки CanSeeAndHearFix, ни от наличия hs_withinperception.int в Fallout2/Data/scripts.
Иногда сразу после загрузки игры видят, а при перезаходе в локацию или после быстрой загрузки перестают. Никакой последовательности такого их поведения пока установить не удалось.
Foxx
Diana
Гекко в Арройо и в оригинальной игре так себя вели.
Diana
Серьёзно??
Ну тогда извиняюсь за беспокойство, значит просто никогда не замечала раньше.
ento
Наверно вопрос не совсем по теме, но все же спрошу тут.
Как добавить анимацию использования для модели, у которой по дефолту этой анимации нет?
Crafty
QUOTE (Diana)
меня периодически в упор перестают замечать криттеры (на полях с собачкой слева от Арройо, например).
Помню такое, сам удивлялся ;-p
Посмотрел скрипты: при первом заходе на карту создаётся случайное количество добрых (4-7, PID_GECKO_SMALL) и злых (1-3, PID_TOUGH_GECKO_SMALL) гекко, но визуально они все одинаковые. Первые, если их не бить, сами не нападают, а вот вторые агрессивные и напав на ГГ могут "сообщать" первым о враге. Если ГГ сам нападает, то гекко его запомнит и увидев, даже если это добряк, нападёт сам (ГГ ударил, убежал с карты, а затем вернулся).

QUOTE (Diana)
Иногда сразу после загрузки игры видят, а при перезаходе в локацию или после быстрой загрузки перестают.
Подтвердить не могу, у меня при загрузке/перезаходе поведение остаётся прежним.
Но если прошли сутки с последнего создания криттеров, то будет повторная генерация — может добавится злой гекко, или если ранее всех убили, то будет новое случайное количество и в случайном порядке (если раньше в одном месте был добрый гекко, то теперь может оказаться злой).
Diana
Интересно, спасибо.
Ещё заметила, что если включить CanSeeAndHearFix=1, то на меня перестают нападать муравьи и скорпионы в Храме, пока к ним не подойдёшь на два гекса.
Crafty
QUOTE (ento)
Как добавить анимацию использования для модели, у которой по дефолту этой анимации нет?
Читаешь Формат содержимого файла critter.dat.
И на примере (отключи хиромод) стартовой модели ГГ (hmwarr), заглянув в critter.dat выясняешь что ГГ умеет пользоваться только копьём (hmwarrG?), а ты хочешь чтоб он ещё мог ножиком пользоваться. Значит нужно создать анимацию hmwarrD? и добавить в critter.dat или в data\art\critters\. Однако вместо создания анимации с нуля можно пойти на хитрость и использовать уже существующую анимацию для дикаря (nmwarr) и скопировать nmwarrD? в hmwarrD?, а потом подправить где нужно (бошка).

Отправлено: 27 июн 17 17:25
QUOTE (Diana)
Ещё заметила, что если включить CanSeeAndHearFix=1, то на меня перестают нападать муравьи и скорпионы в Храме, пока к ним не подойдёшь на два гекса.
Ай-ай, действительно сломал всем зрение не в бою (у них восприятие=2, потому только слышали) :(
Спасибо, поправил.
Foxx
Crafty

Ты в новых sFall2 вырезал отключение обработки GVAR_MODOC_SHITTY_DEATH:=1; // (491) для Невады?
ento
QUOTE
Читаешь Формат содержимого файла critter.dat.
И на примере (отключи хиромод) стартовой модели ГГ (hmwarr), заглянув в critter.dat выясняешь что ГГ умеет пользоваться только копьём (hmwarrG?), а ты хочешь чтоб он ещё мог ножиком пользоваться. Значит нужно создать анимацию hmwarrD? и добавить в critter.dat или в data\art\critters\. Однако вместо создания анимации с нуля можно пойти на хитрость и использовать уже существующую анимацию для дикаря (nmwarr) и скопировать nmwarrD? в hmwarrD?, а потом подправить где нужно (бошка).

Спасибо за ответ, но столкнулся с проблемой — фоллач( первый, если что) не видит распакованный critter.dat. А найти работающий паковщик для дат файлов первого фоллаута у меня не получилось( установил плагин для тотал коммандера, но он выдает ошибку при попытке добавить файлы в архив).

И сразу спрошу, можно ли использовать анимацию другого действия для той же модели, но для нужного мне действия?
Crafty
QUOTE (Foxx)
Ты в новых sFall2 вырезал отключение обработки GVAR_MODOC_SHITTY_DEATH:=1; // (491) для Невады?
Нет, Невада "определяется по размеру файла", а у тебя размерчик не тот ;) Но я обнаружил в exe'шнике маркер ("FALLOUT:NEVADA 1.0 ") и уже поменял способ определения на маркерный.

QUOTE (ento)
столкнулся с проблемой — фоллач( первый, если что) не видит распакованный critter.dat.
Видит, вероятно неправильный путь — содержимое critter.dat нужно распаковать в указаный в critter_patches каталог (скорее всего это будет fallout\data\).

QUOTE (ento)
А найти работающий паковщик для дат файлов первого фоллаута у меня не получилось( установил плагин для тотал коммандера, но он выдает ошибку при попытке добавить файлы в архив).
Да их достаточно, я F1/2 DAT-files packer/unpacker (DAT2) использую и вот для F1-dat файлов ему нужно опцию -s указывать.

QUOTE (ento)
И сразу спрошу, можно ли использовать анимацию другого действия для той же модели, но для нужного мне действия?
Конечно.
Diana
Ещё такой вопрос, может не совсем в тему.
Нету ли какого способа назначить кнопку на использование активного предмета из «текущей руки»? Ну то есть чтобы не надо было тыкать мышкой в оружие перед ударом/выстрелом. А то если переназначить "A" вместо "Enter" (чтобы одной кнопкой начинать и завершать бой) ещё можно через AutoHotKey, то тут вроде как ой.
Вроде бы есть какой-то Key Mod, который делает что мне надо, но отдельно я его не нашла, только в составе Fixed Edition.
Foxx
Diana
Вот держите из Fixed Edition: https://yadi.sk/d/sFfFTETp3Ka5xm
========================
Распаковать в папку с игрой
========================
* F4 — Сохранение, F8 — Загрузка.
* F5 — Быстрое сохранение, F9 — Быстрая загрузка.
* A — Вход в бой и выбор курсора "прицел", E — Закончить бой.
* Q — Переключение режимов оружия.
* H — убрать оружие/предмет из рук.
Diana
То что нужно, спасибо большое. Скачать ту сборку я ещё догадалась, а вот поискать в скриптах — нет.
И да, можно на «ты». :)
Ваш ответ: