Перейти к содержимому


Фотография

(sfall) дополнения


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1246

#361 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 19 марта 2016 - 23:37

Новая версия ;)

- Добавлены режимы возвращаемые функцией get_game_mode: INTFACEUSE (открыто окно инвентаря при курсорном использовании предмета из рюкзака), INTFACELOOT (открыто окно обшаривания ящиков/трупиков) и BARTER (открыто окно торговли).
- Исправлен функционал hs_ammocost и CheckWeaponAmmoCost — теперь они функционируют независимо друг от друга.
- Добавлена переменная CarryWeightLimit для изменения лимита веса.
- Переписан, исправлен и доведён до ума CritterInvSizeLimitMode — теперь это полностью функциональное и интересное расширение. Значение переменной CritterInvSizeLimit применяется ко всем персонажам и для его хранения используется STAT_unused этого персонажа, что позволяет изменять значение с помощью set_critter_stat. На экране снаряжения игрока, а также в окне настроек сопартийца в поле "Несёт" кроме "общий вес/максимальный вес" показывается (при соответствующем режиме) дополнительно "общий размер/максимальный размер".
- Теперь FreeWeight поддерживает любой режим CritterInvSizeLimitMode, но чтобы не возникла путаница пришлось изменить формат отображения отказавшись от показа максимального значения. Сейчас формат — "свободный вес" для персонажей и "свободный размер" для контейнеров, а при включённом режиме CritterInvSizeLimitMode для заданных персонажей — "свободный вес/свободный размер". (в F1-версии изменился формат отображения).
- Исправлен hs_invenwield.
- Добавлена переменная CarChargingFix для изменения возможности зарядки автомобиля с помощью использования топливных элементов на других объектах.
- Доработано исправление бага "форсированного использования взрывчатки если взрыв задевает кого-либо рядом, возврата на карту и снова выхода с карты". (в F1-версии тоже).
- Исправлено неправильное определение пути при чтении/записи файлов sfallgv.sav и sfallfs.sav.
- Исправлен obj_can_hear_obj и чутка подправлен obj_can_see_obj. (в F1-версии тоже).
- Теперь при включённой переменной UseScrollWheel можно прокручивать инвентарь цели в окне обшаривания ящиков/трупиков или окне торговли. (в F1-версии тоже).


Отправлено: 20 мар 16 02:07
Fakeman
QUOTE
Жаль, но она чего-то работает также как и obj_can_see_obj — можно позади криттера бегать он и не узнает.
А как проверял?
Если цель расположена перед лицом проверяющего, то проверяющий "видит"/"слышит" цель в пределах своего восприятия*5 (это без учёта рабочего режима Скрытности и наличия режима невидимости у цели если это игрок), а если сзади/сбоку то пределы ограничены значением восприятия (опять же без учёта рабочего режима Скрытности для игрока; А если в бою, то восприятие умножается на 2). При этом у "видимости" не должно быть препятствий на пути, а у "слышимости" препятствия на пути могут быть.

QUOTE
Я то думал что радиус будет круговой — со всеми этими случайными проверками.
Поразглядывал is_within_perception_, и как раз исправленный obj_can_hear_obj работает в некоторой степени правильно с круговой проверкой, а вот obj_can_see_obj логически сделан неправильно — можно "видеть" (глазами на затылке?) цель сзади. Детально чё-то лень расписывать, потому как движок поправить можно, но в обязательном порядке придётся править все скрипты с содержимым вида "obj_can_see_obj(self_obj,dude_obj)" на "(obj_can_see_obj(self_obj,dude_obj) or obj_can_hear_obj(self_obj,dude_obj))".


#362 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 20 марта 2016 - 03:25

QUOTE
и чутка подправлен obj_can_see_obj.

Так и что ты там чутка подправил????

QUOTE
А как проверял?

Легко) Подцепил скрипт к собаке поставил ей 10 восприятие и бегал во круг нее) как тока она "слышала" сразу сообщалось в логе.

QUOTE
а вот obj_can_see_obj логически сделан неправильно — можно "видеть" (глазами на затылке?) цель сзади.

Все правильно там сделано!
оно то видит не на 10 гексов) а когда подходишь сзади практически в упор криттер начинает видеть игрока — аля чувствует что сзади подошли :)
это нормально и правильно, так что obj_can_see_obj не надо трогать иначе криттеры вообще ослепнут!

QUOTE
При этом у "видимости" не должно быть препятствий на пути, а у "слышимости" препятствия на пути могут быть.

тут тоже ты чего напутал!
obj_can_see_obj не должен видеть через объекты и блокираторы типа Scenery/Walls.
а obj_can_hear_obj по идеии должен "слышать" только через объекты/блокираторы типа Scenery, а тип Walls должны блокировать.
А еще у объектов есть флаг видимости через них! это тоже должно учитываться.

QUOTE
UseScrollWheel

Вот за вот это спасибо!
Как работает без глюков? :)

Это сообщение отредактировано Fakeman - 20 марта 2016 | 03:29


#363 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 20 марта 2016 - 15:37

QUOTE
Так и что ты там чутка подправил????
Чуть выше же Phobos'у отвечал на этот вопрос с примерами.
QUOTE
тут тоже ты чего напутал!
Ничего не путал — говорю как это сделано в движке. Что за собака у тебя такая, что при 10 восприятия (как устанавливал?) не слышит? Я особо не мудрствовал — пошёл в Дыре к Мецгеру и сохранился, чтобы был готовый сейв. Потом декомпильнул DCMETZGE.int и добавил в конец critter_p_proc:
CODE
set_npc_stat_max(1, 1); // восприятие = 1
display_msg("hear, see="+obj_can_hear_obj(self_obj,dude_obj)+", "+obj_can_see_obj(self_obj,dude_obj));

Компильнул обратно, забросил в \scripts и загрузил подготовленный сейв. Стою сзади Мецгера — видит и слышит, отхожу на гекс — не видит и не слышит. Становлюсь у него перед лицом — видит и слышит в пределах 5 гексов.
Перекомпилил скрипт с set_npc_stat_max(1, 2) (восприятие = 2) — сзади видит и слышит в пределах 2 гексов, впереди слышит на 10 гексов, через стену не видит, через окно/дверной проём видит при ObjCanSeeObj_ShootThru_Fix=1. Притащил Сулика, ставлю сзади/впереди Мецгера — слышит, но не видит.

Я согласен, что несмотря на своё название obj_can_see_obj задействует и глаза, и уши. Но считаю что реализация не совсем правильная. И влияет на воровство:
QUOTE
the scripts for using the Steal skill. 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. (In F2 you can do this with Metzger's fridge and room, Stark's desk, the downstairs room in the Mordino's club to get the Bullets magazine, etc. There seem to be some tough scripts in Buster's tent in F2 so maybe those can be applied to F1 Fixt.
Даже замена в скриптах конструкций "obj_can_see_obj(self_obj,dude_obj)" на "(obj_can_see_obj(self_obj,dude_obj) or obj_can_hear_obj(self_obj,dude_obj))" криво, но поможет.

QUOTE
Как работает без глюков? :)
Вроде, а ещё пока делал так разобрался с совместимостью со старыми версиями HRP.


#364 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 20 марта 2016 - 16:21

QUOTE
Чуть выше же Phobos'у отвечал на этот вопрос с примерами.

из тех примеров я понял что добавилась такая конструкция к проверке and (source.tile_num != -1)
все? или что то еще.

имхо, obj_can_see_obj лучше не трогать сильно.
можно конечно внести какие-либо изменения но только с вкл/выкл через ini.

Отправлено: 20 мар 16 17:13
по тестил я еще раз obj_can_hear_obj
у "собаки" спереди c восприятием 6 слышит ГГ через здание(блокираторы стены) на расстояние от нее в 25 гексов при этом подхожу сзади на расстоянии в ~5 гексов не слышит ГГ — да ну это не правильно!
еще радиус слышимости должен быть намного меньше чем дальность самого обзора(видимости) нпс.
и если гг стоит(не шевелится) то НеПеСь не должен его слышать.

Это сообщение отредактировано Fakeman - 30 марта 2016 | 19:02


#365 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 марта 2016 - 01:35

Есть какая-то странность при пере компиляции проекта начиная с версии 1.5.7(и выше) в игре возникают баги, а именно при подключенном файле Stats.ini(даже пустом) в инвентаре не отображаются некоторые итемы(нет картинки). при выходе из игры возникает стандартная ошибка "память не может ляляля", возможно еще есть какие-то сопутствующие баги, заметил только это.
При этом на твоих скомпилированных дллках бага не возникает.
Изменения в код проекта не вносил, и без разницы какую версию создаешь TRACE/RELEASE, при компиляции никаких ошибок не возникает.
В чем такой косяк при компиляции на другой системе/машине?
все младшие версии компилируются без бага.

Где-то ты допустил ошибку в stats.cpp

Это сообщение отредактировано Fakeman - 30 марта 2016 | 15:36


#366 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 марта 2016 - 17:10

в общем не "хитрыми" манипуляциями удалось выявить баг
вернул старые процедуры из 1.5.6

CODE
static void __declspec(naked) _stdcall ProtoPtr(DWORD pid, int** proto) {
__asm {
 mov eax, [esp+4];
 mov edx, [esp+8];
 call proto_ptr_
 retn 8;
}
}
static void __declspec(naked) stat_recalc_derived_hook() {
__asm {
 push edx;
 push ecx;
 push eax;
 call StatRecalcDerived;
 pop ecx;
 pop edx;
 retn;
}
}

и чутка подправил эту процедуру
CODE

static void _stdcall StatRecalcDerived(DWORD* critter) {
int basestats[STAT_lu+1];
for (int stat = STAT_st; stat <= STAT_lu; stat++) {
 basestats[stat] = stat_level(critter, stat);
}
int* proto;
ProtoPtr(critter[25], &proto);
for (int i = STAT_max_hit_points; i <= STAT_max_derived; i++) {
 if (i >= STAT_dmg_thresh && i <= STAT_dmg_resist_explosion) continue;
 double sum = 0;
 for (int j = STAT_st; j <= STAT_lu; j++) {
  sum += (basestats[j] + StatShifts[i][j]) * StatMulti[i][j];
 }
 proto[i+9] = StatFormulas[i].base + (int)floor(sum);
 if (proto[i+9] < StatFormulas[i].min) proto[i+9] = StatFormulas[i].min;
}
}

Не знаю чего изменилось, но теперь вроде все работает)

я думаю баг где то здесь зарыт.
CODE
static void __declspec(naked) stat_recalc_derived_hook() {
__asm {
 pushad
 sub  esp, 4
 mov  edx, esp
 push eax
 mov  eax, [eax+0x64]                     // eax = pid
 call proto_ptr_
 push [edx];
 call StatRecalcDerived
 add  esp, 4
 popad
 retn
}


#367 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 марта 2016 - 19:56

QUOTE
Где-то ты допустил ошибку в stats.cpp
Верно, исправил. Спасибо ;)
QUOTE
При этом на твоих скомпилированных дллках бага не возникает.
А вот это странно.


#368 Foxx

Foxx

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 120 сообщений

Отправлено 30 марта 2016 - 20:42

Crafty можно ли изменить клавиши "Быстрое сохранение" на F5, а "Быструю загрузку" на F9.


#369 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 марта 2016 - 22:20

QUOTE
А вот это странно.

Ну может баг в чем-то другом проявлялся — это же дело такое непредсказуемое)
в моем случае баг вылазил наружу, если при отрытом инвентаре выполнить функцию create_object_sid.


#370 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 31 марта 2016 - 02:51

Foxx
QUOTE
можно ли изменить клавиши "Быстрое сохранение" на F5, а "Быструю загрузку" на F9.
Конечно. Сделал сначала через правку движка, чтобы через скрытую переменную можно было включать, но потом решил что не очень практично.
А потому подправил обработчик клавиатуры, чтобы с помощью hs_keypress (позже hookscripts.txt отредактирую) можно было менять нажимаемую клавишу на нужную. Вот hs_keypress.ssl:
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;
 if (keyDX == 64) then set_sfall_return(63);     // F6? Теперь F5
 else if (keyDX == 63) then set_sfall_return(64);// F5? Теперь F6
 else if (keyDX == 67) then set_sfall_return(65);// F9? Теперь F7
 else if (keyDX == 65) then set_sfall_return(67);// F7? Теперь F9
end
end

Fakeman
QUOTE
Ну может баг в чем-то другом проявлялся — это же дело такое непредсказуемое)
в моем случае баг вылазил наружу, если при отрытом инвентаре выполнить функцию create_object_sid.
Я забыл сохранять нужный позже регистр, а тестировал только на игроке (в этом случае регистр не портится). В общем разновидность "комфортной ситуации" ;(


#371 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 31 марта 2016 - 13:54

QUOTE
Вот hs_keypress.ssl:

О это ты замечательно придумал!
только я вот думаю что мистер Фокс не понимает в скриптах)

посмотри еще функции get_screen_height/get_screen_width
суть бага, если сменить разрешение без перезагрузки игры, то функции будут возвращать предыдущее разрешение окна/экрана, можно это подправить?
если там придется много ковырять то не надо.

Это сообщение отредактировано Fakeman - 31 марта 2016 | 13:58


#372 Pyran

Pyran

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

Отправлено 31 марта 2016 - 16:13

Заметил такую вещь — RP ругается на несоответствие ddraw.ini при использовании Crafty 1.6 / 1.6.7 — при использовании 1.5 — молчит.


#373 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 31 марта 2016 - 16:44

QUOTE
Заметил такую вещь — RP ругается на несоответствие ddraw.ini при использовании Crafty 1.6 / 1.6.7 — при использовании 1.5 — молчит.

в одной из твоей сборок с 3.6 sfall'ом такая же байда писалась, ini я не трогал.
имхо пусть в самом рп вырубят эту ни к чему ненужную проверку.

Grafty убей этот опкод что-бы больше недоставало никого это сообщение)
хах глянул исходник — да ты его почти убил но этот гад еще полуживой — добей его)))
Для чего ты весь исходный код переписываешь? — это же ты представь сколько ошибок мог наделать!

Это сообщение отредактировано Fakeman - 31 марта 2016 | 17:51


#374 Foxx

Foxx

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 120 сообщений

Отправлено 31 марта 2016 - 18:39

В скриптах я полный ноль, но версия изменилась на .0.7.
Mr. Сталин можешь добавить в версию SE.

Это сообщение отредактировано Foxx - 31 марта 2016 | 18:41


#375 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 31 марта 2016 - 19:23

QUOTE
Mr. Сталин можешь добавить в версию SE.

это надо отдельный скриптом.
может тогда ф6 на ф8 кинуть?
логично же получается
ф4 — сохран.
ф5 — быстрое сохран.
...
ф8 — загрузка
ф9 — быстрое загрузка


#376 Foxx

Foxx

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 120 сообщений

Отправлено 31 марта 2016 - 19:59

Именно, что F5 и F9 стандарт для нынешних игр (палец так и тянется, привычка).

Это сообщение отредактировано Foxx - 31 марта 2016 | 20:00


#377 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 31 марта 2016 - 20:21

так я тебе про ф6(это загрузка, которая была на ф5) на ф8 перекинуть?

Это сообщение отредактировано Fakeman - 31 марта 2016 | 20:28


#378 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 01 апреля 2016 - 00:23

Pyran
QUOTE
Заметил такую вещь — RP ругается на несоответствие ddraw.ini при использовании Crafty 1.6 / 1.6.7 — при использовании 1.5 — молчит.
Та то я кастрировал функцию modified_ini и удалил обработку переменной ModifiedIni в ddraw.ini, а RP использует глобальный скрипт (glmodini.int) для проверки значения этой переменной, такая себе псевдозащита (главное чтобы ModifiedIni не равнялось 0) от перезаписи ddraw.ini. Поправил modified_ini для возврата фейкового значения > 0. Может позже верну обработку переменной ModifiedIni (хоть и не вижу в этом смысла)...

Fakeman
QUOTE
посмотри еще функции get_screen_height/get_screen_width
Функции читают фиксированные значения в движке, а вот изменяет их HRP (исходников нет) и видимо только при перезапуске игры, но при смене разрешения об этом забывает. Может позже подробнее гляну.
QUOTE
это же ты представь сколько ошибок мог наделать!
А сколько исправить :-p

Foxx
QUOTE
В скриптах я полный ноль, но версия изменилась на .0.7.
Да там делов-то и без знания скриптов — компильнуть hs_keypress.ssl с приведённым содержимым и скопировать получившийся hs_keypress.int в \data\scripts.


#379 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 01 апреля 2016 - 03:16

QUOTE
Может позже верну обработку переменной ModifiedIni (хоть и не вижу в этом смысла)...

Верно! нет смысла от этого Modified_Ini, к тому-же есть рабочие аналоги get_ini_*
если бы он дату изменения файла возвращал было бы другое дело.

QUOTE
А сколько исправить :-p

ага и жизни не хватит, что бы избавить фол от багов)
Вот к примеру обработчик damage_p_proc привязанный к объекту двери — если гг по ним промазывает то он все равно гад срабатывает.


#380 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 02 апреля 2016 - 00:57

QUOTE
ага и жизни не хватит, что бы избавить фол от багов)
Не, тут речь именно о коде sfall.

QUOTE
Вот к примеру обработчик damage_p_proc привязанный к объекту двери — если гг по ним промазывает то он все равно гад срабатывает.
Не баг, так задумано.
Если у цели, получившей повреждения, есть скрипт, то сработает damage_p_proc, но функция, которая выводит в монитор сообщения игнорирует цели, если они не являются персонажами и вместо "правильного" промаха ("Ой! Стена получает удар вместо намеченной цели (Нарк)!") сообщает о фальшивом промахе ("Вы : промах").
Подправил, если цель — дверь и у неё есть скрипт , то в мониторе вместо фальшивого промаха будет "правильный" ("Ой! Деревянная дверь получает удар вместо намеченной цели (Нарк)!").

PS. Хотя можно было оставить и первый вариант (цель не персонаж и у неё есть скрипт) без проверки что цель является дверью со скриптом.

Это сообщение отредактировано Crafty - 2 апреля 2016 | 02:55




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных

Рейтинг@Mail.ru