Полная Версия: (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
в меню это для пользователя, скрипт этого не видит.
может крафти это уже и сделал, я то уже давно это просил.
Crafty
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
QUOTE
А что там новенького?

ну тебе ж виднее)

CODE
Нельзя, int же возвращает.

какая разница преобразуй в стринг, в скриптах нет понятия типа данных)

QUOTE
Используется всеми персонажами при критических попаданиях

почему тогда у всех персонажей там всегда нуль?
Crafty
QUOTE (Fakeman)
почему тогда у всех персонажей там всегда нуль?
Что в pro'шнике прописали, то и получили (base_stat_better_criticals + bonus_stat_better_criticals).
Foxx
Crafty, а можно сделать так чтобы Очки Действия ещё и цифрами отображались. Просто с некоторыми способностями их больше, чем лампочек на панели.
Как-то так:
http://i85.fastpic.ru/big/2016/0921/b4/d46...6a9da282db4.jpg

Может конечно это и глупое предложение))
Fakeman
Крафти, еще такой технический вопрос, можно ли как-то добраться до свойств флага объекта(криттера) расположенного на карте и изменить его значение???

Вариант изменить флаг в про, а потом создать обьект не подходит.
Crafty
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
QUOTE
Это которые в define_extra.h описаны как CFLG_*

Нет, это не эти. Вот эти PROTO_IT_FLAG (0x14) (в define_extra оно не определено взял по смешению из итемов.)
оно точно в памяти хранится или в карте для каждого объекта на карте,
в общем нужен бит прозрачности. :)
Crafty
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
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
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
QUOTE (Ты)

QUOTE (Я)
Ну нету же там понятия String или Integer.

Да ладно :-p

Так это тип который возвращается функцией, мы же когда определяем переменную в скрипте не пишем какого типа данные она будет содержать.
ну во общем, я так понял там с твоей стороны тех.проблемы преобразования из инт в стринг.
509 — т.е. это константа?

Отправлено: 25 сен 16 19:45
QUOTE
boolean — логическая переменная (TRUE или FALSE)

var:=true;
var:=1;
if var...
там в движке между boolean и int есть какая либо разница в использовании?
Crafty
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
QUOTE (Fakeman)
Кстати прицельный в тело вроде как дает какой-то бонус? не в курсе где про это написано)
QUOTE (Crafty)
У него нет штрафа, а это бонус

По моему, при прицельном выстреле в любую часть тела (даже торс) — дается 5% шанс нанести критическое повреждение. Или я не прав?
Хотел ещё спросить: кроме torso в ddraw.ini есть ещё BodyHit_Uncalled — это что за часть тела?)
Crafty
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
QUOTE
refresh_pc_art

А есть что-то подобное, только для криттера/карты?
Crafty
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
QUOTE
art_change_fid_num(who, obj_art_fid(who));

о а я не и додумался флаг ставить пред сменой фида, спасибо за подсказку.

QUOTE
Базовый PROTO — файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника.

Может еще вот это глянешь, или там все сложно).
Crafty
QUOTE (Fakeman)
QUOTE
Базовый PROTO — файл партийца, у которого повышаются уровни, ДОЛЖЕН быть упакован в master.dat. Иначе уровень будет все время сбрасываться до базового прошника.
Может еще вот это глянешь, или там все сложно).
Не улавливаю суть, давай попроще на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается) ;)
Fakeman
QUOTE
на примере Вика (у меня с ним сейв есть, убиваю пару гекко и он апается)

а где находится его базовый прошник?
может это уже исправили, или вообще это миф)
нафига тогда RP упаковывает прошки в дат?
Crafty
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
QUOTE (Fakeman)
нафига тогда RP упаковывает прошки в дат?
QUOTE (Crafy)
Чтобы не заморачиваться с установкой read-only, не? ;)
RP упаковывает только начальные (базовые) прошки напарников, которые редактировались:
00000079.pro
00000089.pro
00000107.pro
00000502.pro
00000503.pro
00000504.pro
Fakeman
Нет, там упаковываются именно базовый кессади и робомозга и еще какието новые партийцы. Остальные просто в папке дата с R/O
Положи базовый вика 62.pro в дата.
Может это будет справидливо только для новой игры, тогда вик несможет апнуться, а так он у тебя уже 2 ур...
Я сам никогда не проводил эксперементы с этими партийцами, возможно, что это как и с древним мифом TeamX о локальной переменной #5 которая как бы дижковая, я давно еще решил полезть и проверить это дело оказалось, что нифига она не движковая, а движковой оказалась вообще нулевая. Тут тоже наверное надо самому все перепроверить. :)
Crafty
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
Ясненько)
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
Crafty, у тебя в новой версии SFALL2 написано маленькими буквами sfall2, но в игре выглядит как 8fall2. Или мне так кажется))
Crafty
Удалил из 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
Ничего не понял)
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
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
Чутка подправил пару последних постов, чтобы понятнее выглядело.

Поменял все фиксированные "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
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
QUOTE (Fakeman)
QUOTE
в бою восприятие умножается на 2
Можно узнать смещение этого значения, хочется увеличить до х3
0x42BACA, но не поможет из-за способа "умножения" — сложения.

QUOTE (Fakeman)
а то некоторые с низким ВС стоят в сторонке и курят.
Там скорее всего причина в другом...
Можешь попробовать добавить в секцию [Misc] переменную SmarterAI=1.

QUOTE (Fakeman)
Что именно ты там изменил с перк.ини ?
Без этого изменения нельзя нормально поменять эффект gain* перков через perks.ini, потому что +1 к стату всё равно добавляет движок.
В perks.ini пропиши:
CODE
[86]
Stat=2
StatMag=1
Возьми перк "Добавить выносливости" и посмотри на результат (ну и чтобы выносливости было меньше 9).

QUOTE (Fakeman)
нельзя просто заменить на явные номера PID итемов? т.е. чтоб не было никакого хардкодинга.
или же оставить как есть, но добавить возможность вписывать кастомные пиды.
Пока нельзя:
QUOTE
QUOTE (Ethereal)
Кстати, от идеи управления отображением брони на напарниках, в "NPC Armor" моде, отказался окончательно?
Почему, просто времени нет.


Отправлено: 1 окт 16 17:06
QUOTE (Fakeman)
QUOTE
Поменял все фиксированные "data\" на использование master_patches
а всякие временные прохи и worldmap.dat которые создает двиг все равно создаются в DATA?
Другое поменял — в исходниках были зашиты пути с фиксированным "data\".
Fakeman
QUOTE
0x42BACA, но не поможет из-за способа "умножения" — сложения.

т.е там типа ADD EAX,EAX, а нельзя сменить на MUL — или она не влезет в размер.

0x42BACA — дай лучше которое в файле.

QUOTE
Там скорее всего причина в другом...

явно видно что из-за расстояния ставишь два криттера с разным ВС тот у которого больше бежит.
хотя да тут в чем-то другом дело, видимо другой алгоритм есть
типа ВСx2 потом еще что прибавляется где-то в коде + учитывается куда зырит(повернут) криттер.
вот пример расстояние до тестируемых критеров 35+ гексов тот который с 8 ВС бежит, рядом стоит с ВС 7 не бежит, пока ближе не подойдешь — разумеется это все в режиме боя.
ладно забей на это.

SmarterAI=1 — что это за недокументированная опция?
попробовал без разницы.
Crafty
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
QUOTE
Мои эксперименты с улучшением AI.

а понятно — ну дерзай, дерзай! :)

QUOTE
К тому же это меняет восприятие целей которые стоят за спиной.

ну вот тут как раз бы и надо увеличить, а то эти вообще злоядлые курильщики — с восприятием 6-7 (15 гексов) резня у них за спиной происходит, а они отдыхают)

QUOTE
Восприятие умножается на 5, если цель перед глазами.

Тогда все сходится с ВС=7 как раз не и доставал до тех гексов.
Fakeman
объясни мне принцип работы сфалла, вот есть MakeCall(addr, func, true);
с помощью нее я смогу сделать ассембл. вставку в код?
addr — это адрес в движке с которого будет вызваться моя вставки(func)?
а команда которая непосредственна находится в addr будет выполнена или нет?
и на какой потом адрес происходит возврат из вставки, на след за addr или продолжает с addr?
и для чего нужен третий аргумент функции MakeCall
Foxx
Crafty, есть ли в движке какие-нибудь различия у режимов холодного оружия: Свинг, Укол? Или это сделано, так для антуража.
Crafty
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
QUOTE
Если речь о умножении на 3, то с последней версией это не сработает — я переписал оригинальную функцию с дополнениями.

Да просто стало интересно, поставил IDA и залез в движок, ты там idb базу не обновлял?

Почему не через ini изменения вносишь, или в отладочную версию бы вносил.

QUOTE
Думаю в вики/etc это уже описано.

Что-то ничего там нету по этому поводу... хотя может не нашел.
Foxx
QUOTE (Crafty)
Думаю в вики/etc это уже описано.
Все нашел. Цитата:
QUOTE
Свинг
Основной тип удара холодным оружием. При расчёте урона в рукопашном бою учитывается модификатор силы. Параметр урона прибавляется к базовому урону оружия. Чем он выше, тем больше повреждений вы будете наносить.

Колоть
Часть видов холодного оружия предназначена для колющих ударов. Они тоже получают бонус от урона в рукопашной. Между свингами и уколами нет принципиальных различий.
Crafty
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
Ничего не понял)
это типа если в бою между НПЦ и ГГ есть этот самый obj_sight_blocking_at_ (кстати что за блокиратор(с каким флагами), и в чем его отличие от obj_blocking_at_ ?) то НПЦ не побежит к ГГ так как не видит его, или чего?

QUOTE
Действительно нужна переменная CanSeeAndHearFix?

ну конечно, чем больше всяких крутилок тем лучше)
давай переменную буду тестить чего там изменилось.
Crafty
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
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
QUOTE (Fakeman)
Непонятно! последний это конкретно кто?)
Сопартиец.
QUOTE
и X*2.5=?
X=?
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
QUOTE
Сопартиец.

эээ, а причем тут сопартийцы ГГ, и зачем ему(Сопартийцу ГГ) видеть на 10*2*2.5=50 гексов -еще больше стало непонятно)))
Crafty
QUOTE (Fakeman)
эээ, а причем тут сопартийцы ГГ
QUOTE
Персонаж (ГГ или НПЦ), которого обидели, после получения урона запускает процедуру в которой все сопартийцы (team_num) в пределах is_within_perception_ которых находится обиженный входят в бой.
Для любого персонажа другой персонаж с такой же team_num является сопартийцем.
Fakeman
Определение Сокомандник уместнее было бы, и понятнее в техническом плане, а то сопартийцы уже устоялось, что это именно напарники ГГ.
Fakeman
Вопрос, можно ли увеличить скорость внутри-игрового времени в игре, без увеличения скорости анимации и п.р. или на этих тиках в движке завязано все-и-вся ?

И почини пути Шейдеров — не работают после правки путей, видать не находит путь 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
CODE
CanSeeAndHearFix=1

Сколько не пытался так, и не увидел и не понял в чем конкретно заключается твой фикс, они как бегали на расстояние ВС х 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 файлами.
Ваш ответ: