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


Фотография

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


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

#281 Nordan

Nordan

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

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

Отправлено 27 февраля 2016 - 17:06

QUOTE
тут как бы если ты хочешь менять эти значение прямо из игры то придется вводить новые ОpСode, а соответственно и в компилятор(декомпилятор) тоже надо его вводить.
Не, я говорю щас о том, чтобы привязать его, например, к ГВАРе, или к глобальной сфаллической переменной, чтобы максимальная вместимость бралась именно из нее (и ее можно было динамически менять в процессе игры), а не из INI файла, вот это было бы круто. )

QUOTE
вот только бы адресс узнать остается где это записано)

Я так понимаю, этот адрес постоянно меняется после перезахода в игру, да? Иначе можно было бы его найти через ArtMoney.

Это сообщение отредактировано Nordan - 27 февраля 2016 | 17:17


#282 Fakeman

Fakeman

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

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

Отправлено 27 февраля 2016 - 17:52

Привязка к гваре — чувствую это еще тот геморрой в реализации будет. — Какой номер ей присваивать прописывать в ини тоже. К сфаловской гваре только.
Адрессное пространство видимо да меняется но оффсет относительно начала постоянен.
Вообще в чем фишка этого лимита веса инвентаря — в чем ее суть?


#283 Nordan

Nordan

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

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

Отправлено 27 февраля 2016 - 18:03

Фишка этого лимита в том, что вещи имеют не только вес, но и размер, ведь невозможно же в одной сумке уместить 10 миниганов. ) А динамическое изменение этого лимита немного бы разнообразило характеристики брони, наличие дополнительных карманов увеличивало бы это значение. Типа того. Вообще, насколько это трудоемко — мне не известно, так как в моем представлении это реализуется заменой проверки параметра в ини файле на проверку ГВАРы (а номер, в принципе не особо важен).

Это сообщение отредактировано Nordan - 27 февраля 2016 | 18:06


#284 Fakeman

Fakeman

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

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

Отправлено 27 февраля 2016 - 18:30

QUOTE
;Only the PC uses CritterInvSizeLimit. Other critters will use the extra unused stat (STAT_unused = 10)

Как оптимальный вариант можно это записывать не в гвару, а в неиспользованный стат игрока — но я не знаю на сколько это реально.

Это сообщение отредактировано Fakeman - 27 февраля 2016 | 18:54


#285 Nordan

Nordan

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

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

Отправлено 27 февраля 2016 - 22:44

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

UPD: Нет, с лимитом так не получится, адрес меняется...


Это сообщение отредактировано Nordan - 28 февраля 2016 | 08:36


#286 Crafty

Crafty

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

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

Отправлено 28 февраля 2016 - 17:10

Fakeman
QUOTE
Ого как оперативненько, спасибо — думал месяц будешь ковырять))
Да это не важно как ты назвал — главное, что теперь поддерживается.
Дак дело буквально на 15 минут, что касается названий — там 4 варианта интерфейсных режимов для работы с инвентарём: рюкзак игрока (клавиша 'I', INVENTORY), курсорное использование предмета из рюкзака (INTFACEUSE), обшаривание контейнеров/персонажей (INTFACELOOT) и неописанный режим торговли. Последний, если его нужно будет добавить, логично было бы назвать BARTER (INTFACEBARTER режет глаза ;)). Поэтому вероятно INTFACEUSE и INTFACELOOT лучше сделать без INTFACE, чтобы вписывались... Но если устраивает, то так и оставим.
QUOTE
может циферку 2 введешь для такого случая? :)
Пока лень :-p
QUOTE
А до твоего изменения она чего делала?
Если не использовался hs_ammocost, то всего лишь запрещала использовать Суперэлектрокнут и Силовой суперкастет если у них остался 1 "патрон" (они требуют 2 для удара). И подключала дополнительные обработчики для hs_ammocost.
Вообще реализация hs_ammocost и CheckWeaponAmmoCost невероятно кривая — они завязаны друг на друга, не обрабатывается стрельба очередью. К примеру для пистолета-пулемёта (SMG), при CheckWeaponAmmoCost=0 и простеньким hs_ammocost, меняющим расход патронов на 2, можно стрелять очередями по 2 патрона, но получаемые жертвой повреждения расчитываются как для очереди из 10 патронов.
Так что я исправил hs_ammocost (хуки я вообще уже все переписал) и CheckWeaponAmmoCost, который теперь действует только на игрока (такое ограничение :( Это уже после предыдущего исправления проверки при стрельбе очередью).

Отправлено: 28 фев 16 18:22
Nordan
QUOTE
В настройках сфалла можно менять максимальную вместимость инвентаря (не вес, а именно вместимость по размеру), можно ли этот параметр привязать к переменной?
Ну как заметил Fakeman можно будет для игрока использовать STAT_unused (в оригинальном sfall STAT_unused используется для хранения прошедших лет для TimeLimit). В общем потом погляжу как CritterInvSizeLimit работает...


#287 Fakeman

Fakeman

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

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

Отправлено 28 февраля 2016 - 22:18

QUOTE
и неописанный режим торговли. Последний, если его нужно будет добавить, логично было бы назвать BARTER (INTFACEBARTER режет глаза ;)). Поэтому вероятно INTFACEUSE и INTFACELOOT лучше сделать без INTFACE, чтобы вписывались...

О блин так нужно было и Бартер добавить — а то приходиться по хуку определять когда гг в бартер заходит.
Мне вообще фиолетово как ты дэфайны называешь — у меня свой дэфайн файл)

QUOTE
STAT_unused (в оригинальном sfall STAT_unused используется для хранения прошедших лет для TimeLimit)

О не знал что туда это записывается — а ничего не поломается если поменять это.

Еще очень важный вопрос! есть ли какая-нибудь функция в движке игры которая перерисовывает итемы в слотах инвентаря? чтобы можно было ее как-нибудь вызвать из скрипта функцией call_offset_v0(int address)
в чем суть — если при отрытом инвентаре скриптово добавить итем в сумку игроку(криттеру) то инвентарь не перерисовывается и добавленный итем не появляется на экране пока не по клацаешь стрелочки управления.

Это сообщение отредактировано Fakeman - 29 февраля 2016 | 01:53


#288 Crafty

Crafty

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

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

Отправлено 04 марта 2016 - 02:45

QUOTE
О блин так нужно было и Бартер добавить — а то приходиться по хуку определять когда гг в бартер заходит.
Добавил BARTER:
CODE
#define BARTER      (0x20000)
но ещё не заливал новую версию (переписал CritterInvSizeLimitMode, нужно сначала слегка проверить).

QUOTE
О не знал что туда это записывается — а ничего не поломается если поменять это.
Нет — в движке STAT_unused не используется.

QUOTE
Еще очень важный вопрос! есть ли какая-нибудь функция в движке игры которая перерисовывает итемы в слотах инвентаря? чтобы можно было ее как-нибудь вызвать из скрипта функцией call_offset_v0(int address)
в чем суть — если при отрытом инвентаре скриптово добавить итем в сумку игроку(криттеру) то инвентарь не перерисовывается и добавленный итем не появляется на экране пока не по клацаешь стрелочки управления.
Это весьма брутально, на твой страх и риск :-p
Вызов display_inventory_ для перерисовывания инвентаря игрока (для цели другая функция используется):
CODE

call_offset_v3(0x46FDF4, inventory_offset, visible_offset, mode);

inventory_offset - для рюкзака можно читать содержимое в памяти read_int(0x59E844) чтобы получить смещение вещи которая сейчас видна первой (если прокрутил инвентарь вниз) или же 0 для отрисовки инвентаря начиная с самой верхней вещи;
visible_offset - -1 должно хватить, если положительное значение, то вроде номер (1-6?) конкретной вещи видимой сейчас в инвентаре;
mode - режим интерфейсного окна: 0 (INVENTORY), 1 (INTFACEUSE), 2 (INTFACELOOT) и 3 (BARTER);


Это сообщение отредактировано Crafty - 6 марта 2016 | 14:07


#289 Fakeman

Fakeman

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

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

Отправлено 04 марта 2016 - 13:48

Мне нужно для цели и для игрока именно для инвентарей loot и barter — для других инвентарей нету проблемы с обновлением их можно обновлять по клавиши home/end.
Попробую поюзать, потом напишу о результате.

Попробовал для BARTER вызвать — но игра вываливается с ошибкой рисуя какие-то диагональные темно-серые полосы в той части где сам интерфейс обмена.
Для проверки решил и для INVENTORY тоже пробовать но ничего не происходит, нет перерисовки. пробовал с разными аргументами вызова.

Может ты посмотришь какие функции забиндины на клавиши home/end инвентаря игрока.

Это сообщение отредактировано Fakeman - 4 марта 2016 | 18:10


#290 Crafty

Crafty

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

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

Отправлено 05 марта 2016 - 01:58

QUOTE
Может ты посмотришь какие функции забиндины на клавиши home/end инвентаря игрока.
Именно display_inventory_ с нужными параметрами, то есть для home это выглядит как call_offset_v3(0x46FDF4, 0, -1, 0), впрочем это уже не важно — ты написал о call_offset_v0(int address), ну я и подумал что уже где-то используешь, а значит это работает, проверять не стал и предложил подходящий аналог. Но дело в том, что call_offset_* и функции работы с памятью относятся к небезопасным и в релизной версии намертво отключены, их можно включить в отладочной версии с помощью AllowUnsafeScripting=1 в секции Debugging. Но и это не поможет — как выяснилось call_offset_[v|r]1-call_offset_[v|r]4 полностью сломаны (неправильно читают аргументы). И даже после быстрого исправления я начал получать краш (до него просто не работало). Поскольку скриптовыми обработчиками я пока ещё не занимался, то и исправить пока ничего не могу... ;(


#291 Fakeman

Fakeman

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

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

Отправлено 05 марта 2016 - 10:07

AllowUnsafeScripting — Про это я вкурсе.
Ну ладно фиг сним — так сказать не прокатил вариант.


#292 Nordan

Nordan

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

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

Отправлено 05 марта 2016 - 11:09

Чего то у меня вообще не так, версия sfall 3.7 релизная.
Пробовал затолкать функцию call_offset_v3(0x46FDF4, 0, -1, 0) в скрипт предмета в обработчик destroy_p_proc, чтобы он выполнялся из инвентаря непосредственно.

При отключенным AllowUnsafeScripting игра не крашится, но в дебаге появляется ошибка.

При включенном, ничего не появляется и не крашится, может быть даже работает.


#293 Fakeman

Fakeman

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

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

Отправлено 05 марта 2016 - 13:34

Да не работает оно, я проверял на своем плагине фильтре инвентаря — неперерисовывает итемы. А крашится в интерфейсе бартера.


#294 Crafty

Crafty

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

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

Отправлено 05 марта 2016 - 21:33

В своё время мне CritterInvSizeLimitMode не понравился — в русской версии на экране снаряжения игрока (который в рюкзаке игрока по клавише 'I') данные о "общий размер/максимальный размер" обрезались из-за "Общ. вес:", да и нельзя было нормально определить размер вещи. К тому же я считал что вес "заменяется" на размер.
На самом деле CritterInvSizeLimitMode — шикарная вещь, и размер не заменяет вес, а является дополнительным ограничением (перегруженным можно быть не только из-за веса, но и из-за размера вещей). Оригинальная версия конечно бедненькая и нормально работающая только с игроком (остальным персонажам нужны подправленные pro'шники)...

Nordan
QUOTE
В настройках сфалла можно менять максимальную вместимость инвентаря (не вес, а именно вместимость по размеру), можно ли этот параметр привязать к переменной?

В общем допилил — значение переменной CritterInvSizeLimit применяется ко всем заданным персонажам и для его хранения используется STAT_unused этого персонажа, что позволяет изменять (не напрямую) значение с помощью set_critter_stat.
На экране снаряжения игрока, а также в окне настроек сопартийца в поле "Несёт" кроме "общий вес/максимальный вес" показывается (при соответствующем режиме) дополнительно "общий размер/максимальный размер".

Какой русский вариант для "It occupies 1 unit."/"It occupies %d units."?
"Занимает 1 ячейку."/"Занимает %d ячеек." — ничего лучше в голову пока не пришло.

Есть задумка сделать CritterInvSizeLimit динамически расчитываемым в зависимости от статов, как навык. К примеру использовать выносливость или силу (причём базовое значение, но для ГГ с учётом трейтов) и интеллект (а тут уже учитывать химию, влияет на компактность складывания вещей).
Что-то вроде при CritterInvSizeLimit = 5:
CODE
5 * ((2 * текущий интеллект) + базовая выносливость)

-----------------------------------------------------------------------

Доработал FreeWeight — теперь поддерживается любой режим CritterInvSizeLimitMode, но чтобы не возникла путаница пришлось изменить формат отображения отказавшись от показа максимального значения. Сейчас формат — "свободный вес" для персонажей и "свободный размер" для контейнеров, а при включённом режиме CritterInvSizeLimitMode для заданных персонажей — "свободный вес/свободный размер".

PS. Вот простенький hs_invenwield добавляющий/отнимающий 10 "ячеек" при одевании/снятии любой брони сопартийцем:
CODE
procedure start;

procedure start begin
variable critter, armor, slot, hooktype, returned;
begin
 critter := get_sfall_arg;
 armor := get_sfall_arg;
 slot := get_sfall_arg;
 hooktype := get_sfall_arg;
 returned := -1;
 if (slot == 0) then
  begin
   if (party_member_obj(obj_pid(critter)) != 0) then
    begin
     if (hooktype == 1) then
      begin
       set_critter_stat(critter, 10, 10);
      end
     else
      begin
       set_critter_stat(critter, 10, -10);
      end
     end
    end
   set_sfall_return(returned);
  end
end


#295 Nordan

Nordan

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

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

Отправлено 05 марта 2016 - 22:45

Круто. Я так понимаю, ты все это делаешь под версию 3.6 ? На 3.7 не собираешься переходить?


#296 Fakeman

Fakeman

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

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

Отправлено 06 марта 2016 - 00:32

QUOTE
На 3.7 не собираешься переходить

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

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


#297 Crafty

Crafty

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

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

Отправлено 06 марта 2016 - 02:52

QUOTE
И даже после быстрого исправления я начал получать краш
То я тупанул и забыл проверять режим с помощью get_game_mode.

Вы бы хоть пример простенького скрипта для проверки кинули...

Nordan
QUOTE
Чего то у меня вообще не так, версия sfall 3.7 релизная.
Конечно не работает :-p
QUOTE
как выяснилось call_offset_[v|r]1-call_offset_[v|r]4 полностью сломаны (неправильно читают аргументы)

Fakeman
QUOTE
Да не работает оно, я проверял на своем плагине фильтре инвентаря — неперерисовывает итемы. А крашится в интерфейсе бартера.
Работает :-p
Вот hs_keypress для проверки, аналог home в инвентаре игрока, только на клавишу F11:
CODE
procedure start;

procedure start begin
variable event, keyDX, keyVK;
begin
 event := get_sfall_arg;
 keyDX := get_sfall_arg;
 keyVK := get_sfall_arg;
 if ((event == 1) and (keyDX == 87) and ((get_game_mode bwand 4096) != 0)) then
  begin
   display_msg("_stack_offset = " + read_int(0x59E844));
   write_int(0x59E844, 0);
   call_offset_v3(0x46FDF4, 0, -1, 0);
  end
end
end


Это сообщение отредактировано Crafty - 6 марта 2016 | 02:53


#298 Fakeman

Fakeman

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

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

Отправлено 06 марта 2016 - 03:01

QUOTE
Вот hs_keypress для проверки, аналог home в инвентаре игрока, только на клавишу F11:

а можно это прикрутить именно к интерфейсу бартера и LOOT для цели и игрока?
для инвентаря игрока это как бы это и не надо.

write_int(0x59E844, 0); — это обязательно записывать?

Во общем затестил в LOOT и BARTER (кстати бартер это аргумент 3 а не 4) для игрока замечательно работают — нужно такую же функцию и для цели.

И еще найди функцию которая обновляет статы в Инвентаре игрока — это когда предметы таскаешь оно обновляется.

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


#299 Crafty

Crafty

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

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

Отправлено 06 марта 2016 - 05:17

QUOTE
Во общем затестил в LOOT и BARTER (кстати бартер это аргумент 3 а не 4) для игрока замечательно работают — нужно такую же функцию и для цели.
Верно 3 — тоже прозевал :(
CODE
procedure start;

procedure start begin
variable event, keyDX, keyVK;
variable inventory_offset, target_inventory_offset, _target_pud, display_inventory_, display_target_inventory_;
begin
 event := get_sfall_arg;
 keyDX := get_sfall_arg;
 keyVK := get_sfall_arg;
 if ((event == 1) and (keyDX == 87)) then
  begin
   inventory_offset := 0x59E844 + (read_int(0x59E96C) * 4);
   target_inventory_offset := 0x59E7EC + (read_int(0x59E948) * 4);
   _target_pud := read_int(0x59E978);
   display_inventory_ := 0x46FDF4;
   display_target_inventory_ := 0x47036C;
   if ((get_game_mode bwand 0x1000) != 0) then /* INVENTORY */
    begin
     call_offset_v0(0x471D5C);             /* display_stats_ */
     write_int(inventory_offset, 0);
     call_offset_v3(display_inventory_, 0, -1, 0);
    end
   else if ((get_game_mode bwand 0x8000) != 0) then /* INTFACEUSE */
    begin
     write_int(inventory_offset, 0);
     call_offset_v3(display_inventory_, 0, -1, 1);
    end
   else if ((get_game_mode bwand 0x10000) != 0) then /* INTFACELOOT */
    begin
     write_int(target_inventory_offset, 0);
     call_offset_v4(display_target_inventory_, 0, -1, _target_pud, 2);
     call_offset_v1(0x4D6F5C, read_int(0x59E964));/* win_draw_ */
     write_int(inventory_offset, 0);
     call_offset_v3(display_inventory_, 0, -1, 2);
    end
   else if ((get_game_mode bwand 0x20000) != 0) then /* BARTER */
    begin
     write_int(target_inventory_offset, 0);
     call_offset_v4(display_target_inventory_, 0, -1, _target_pud, 3);
     call_offset_v1(0x4D6F5C, read_int(0x59E964));/* win_draw_ */
     write_int(inventory_offset, 0);
     call_offset_v3(display_inventory_, 0, -1, 3);
    end
  end
end
end

QUOTE
write_int(0x59E844, 0); — это обязательно записывать?
Да, это чтобы номер текущего элемента соответствовал отрисованному.
Попробуй не записывать, прокрути инвентарь в конец, отрисуй и увидишь ;)
QUOTE
И еще найди функцию которая обновляет статы в Инвентаре игрока — это когда предметы таскаешь оно обновляется.
Добавил.

Это сообщение отредактировано Crafty - 6 марта 2016 | 23:46


#300 Fakeman

Fakeman

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

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

Отправлено 06 марта 2016 - 17:39

Огромное СПС, НО не работает)
Обновление для цели не корректно работает — нужно поводить мышкой по слоту чтобы нарисовались итемы, аля такой фотошоп получается) в чем проблема?

CODE
inventory_offset := 0x59E844 + (read_int(0x59E96C) * 4);

а тут это у тебя уже по другому адресу записывается в чем разница?

CODE
call_offset_v0(0x471D5C);             /* display_stats_ */

Не стал проверять на оригинальной длл сфала — это там тоже будет корректно работать?

Слушай, я наверное тебя уже достал) но давай тогда еще найдем функцию которая обновляет параметры на главной панели игрока такие как AP/AC/HP
- заметил обновление происходит когда закрываешь окно с характеристиками игрока, или когда броню одеваешь, но тут наверное просто счетик АС обновляется.

А можно доработать еще скриптовую функцию critter_inven_obj чтобы она получала указатель так-же и на предмет который находится в неактивном слоте руки. а то это вроде как баг, но с другой стороны и не баг, поэтому желательно наверное через ini опцию это фиксить, если не трудно будет. :)

Еще есть такой баг в двиге — если клацнуть по пустому месту в слоте для предметов интерфейса USE — то игра крашится.

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




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

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


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

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

Рейтинг@Mail.ru