Полная Версия: (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
'delete'  — Тупанул :)
Phobos
QUOTE
Done (though I didn't test) ;)

QUOTE
Беспредельщик же ;-p

QUOTE
3 байта против 5 :-p


Вот после таких фраз и закрадывается недоверие к твоему коду.
Слышал про такую вещь как читаемость кода? :)
Во многих случаях (а это именно такой случай) эффективностью пренебрегают ради качества кода. Оптимизация по размеру кода нужна в каких-нибудь макросах... а по быстродействию — внутри циклов, выполняемых миллионы раз в секунду...
Crafty
QUOTE
Вот после таких фраз и закрадывается недоверие к твоему коду.
Так это, я же его не продаю и не заставляю использовать :-p
Ethereal
Раз уж тема про Сфалл, то опишу тут.
Дело в том, что я играю в гремучаю смесь RP, MM и собственных наработок. Сфал и HiRes начал использовать недавно, поскольку ранее не знал как отключить блокировку сав-лоада в бою. (Спасибо Crafty).

Речь пойдёт о дополнении RandomLoot. Это дополнение регенит случайным образом в пустых контейнерах различные предметы. Это конечно здорово, найти в Кламате диск с данными модернизации энергооружия и броню братства, но есть и большой недостаток. Предметы регенятся по классам, а в классе предметов "Misc" есть масса вещей, которые ни при каких условиях не должны попадать внутрь контейнеров. Причём регенит их крайне успешно, но после этого начинаются страшные глюки. Так в Брокен Хиле в доме одного мутанта в шкафу обнаружился разлагающийся труп, что вообще на мысли наводит... Труп я не взял, а потом на карту зайти больше не мог. Висло всё напрочь (и в маппере карта из сохранения так же висла). Кроме того, этот труп запорол весь сейв. На остальных картах начало происходить то же самое.

Что бы избежать подобных вещей надо в RandomLoot.ini установить RandomMiscPercent=0 . А лучше найти способ прописать конкретно — какие вещи будут регенится. И не в скрипте, а в том же ini-файле.

Разобрался с High Resolution. Всё в нём было хорошо (Особенно туман войны), но бесила блокировка опций мыши за границами исконной активной зоны карты. Я там накопал секретных подвалов в разных городах, а попав в них ничего зделать и взять там невозможно было. Выяснив, что f2_res использует какие-то свои границы для карт — распоковал f2_res.dat в одноимённую папку в корне игры и уничтожил там папку "maps", а оригинальный файл здал в архив для бэкапа. Теперь всё работает отлично — все опции f2_res, включая туман войны, работают, при этом мод более не видит никаких границ карт и ничего не блокирует. Впоследствии некоторым картам всё-же вернул "ограничители", но... Границы границами, а блокировку нафига надо было делать?
Fakeman
Так меня посетила идея для фишки, сделать возможность переключаться между со партийцами во время обмена с контейнером, как сделано с трупами.
Реализуемо?
Foxx
Использую sfall от crafty с Olympus 2207. Все вроде работает, но есть один глюк.
Когда доктор в Метро лечит меня от радиации происходит вот это:
http://i67.fastpic.ru/big/2015/0829/b8/3dd...fcb5d54f2b8.jpg
Fakeman
Эта рамка появляется только от сфалла крафти? А на оригинале сфала 3,6 пробовал?

Лучше запостит этот баг на форуме олимпа, т.к скритпы олимпа писались под старую версию 2.12 сфалла, и поэтому глюко-баги возможны.

Да и куды крафти пропал? :(
Foxx
Попробывал sfall 3.4 из базы Дробовика, такая же фигня с рамкой.

На оригинальном sfall 2.12a, который с Олимпом устанавливается бага нет.
Fakeman
QUOTE
Попробывал sfall 3.4 из базы Дробовика, такая же фигня с рамкой.

Хм, так и при чем тут версия от Crafty... иди Артема пинай :)
Кстати может они версию 1.1 под последнию версию сфалла замутят, так что пока они тестируют 1.1 иди баг-репортани, может фиксанут глюк.

Upd.
Кстати у тебя судя по скрину стоит мой интерфейсный мод, хз может я там в скрипте чего перешаманил, :-p попробуй без мода, т.е. с оригинальными скриптами олимпа.
Foxx
[цитата]
Кстати у тебя судя по скрину стоит мой интерфейсный мод, хз может я там в скрипте чего перешаманил, :-p попробуй без мода, т.е. с оригинальными скриптами олимпа.

Мод скачал с базы Дробовика "Hi-Res Patch 4.1.8 & InterfaceMod for Olympus_v1.05". Пробовал без него, тоже самое.
Эта рамка отдельно лепится к диалоговому окну, вырезать бы ее из "master.dat", но какое у нее название файла FRM не знаю.
Fakeman
QUOTE
Мод скачал с базы Дробовика "Hi-Res Patch 4.1.8 & InterfaceMod for Olympus_v1.05".

Угу оно самое :)

QUOTE
Эта рамка отдельно лепится к диалоговому окну, вырезать бы ее из "master.dat", но какое у нее название файла FRM не знаю.

там не fmr а pcx, но если удалить будет "Error" в виде черных полос :)
Я когда полгода назад правил баги скрипта сделал так, чтобы эта рамка показывалась при любых разрешениях, а не только при 800х600, ибо так красивее, так что выпилить можно только из скрипта :)
Elkantar
Приветствую форумчан!
Помогите пожалуйста разобраться вот с какой задачей.

Хочу играть в фоллаут 1,2 и тд с разрешением 1360х768 (например) и использовать функции ScaleFilter от sFall`а.

Я имею ввиду это:

CODE

;Set to something other than 0 to apply a software scaler in graphics modes 4 or 5
;This can be used instead of, or in addition to, the hardware global.fx shader
;This option is unsupported when using Mash's resolution patch
;0 - Default scaler
;1 - 2xSai
;2 - SuperEagle
;3 - Super2xSai
;4 - hq2x
;5 - AdvancedMame2x
;6 - letterbox
;7 - no scaling
ScaleFilter=5


Перебор всех установок от 0 до 7 никак на картинке не отражается.

Никак не могу разобраться как в точности должен выглядеть мой конфиг. Как я понял, есть два отдельных дополнения для игры, Mash's resolution patch и sFall. И вроде как они друг с другом не очень то уживаются. Так, в комментариях файла ddraw.ini о функции ScaleFilter что она с хайрез патчем не работает. Так как же быть тогда? Есть решения какие нибудь.

Каждое дополнение снабжено отдельным ini файлом f2_res и ddraw. И там и там есть строки чтобы выставлять разрешение экрана. Но работают они почему то по разному.

Помогите, камрады, разобраться?

П.с. Если это существенно, то моя видюха не поддерживает шейдеры.
Fakeman
А что за необходимость использовать эту древнию версию Sfallа c этой функцией?... сейчас в тренде использовать Sfall2 от Crafty.
И использовать Mash's resolution patch, религия не позволяет? выстави там свое любимое разрешение и играй.

QUOTE
Каждое дополнение снабжено отдельным ini файлом f2_res и ddraw. И там и там есть строки чтобы выставлять разрешение экрана. Но работают они почему то по разному.

Если тебе надо растянуть картинку игры до твоего разрешеия, используй sfall
Если разрешение окна игры то используй resolution patch
Так что тебе надо?

зы; Я уж думал Crafty вернулся.
Elkantar
Сейчас в Олимпус играю, а sfall от крафти с ним почему-то не работает.
Но дело здесь в другом. Я хочу включить функцию scalefilter, например AdvancedMame2x. Из опыта использования dropbox, в котором точно также используются эти функции, эти функции должны сглаживать текстуры и убирать зернистость. Но как ни старался, никакого эффекта ожидаемого это не принесло.

Сейчас я играю на 1280х720 и меня немного раздражает то, что всё стало слишком мелкое, в особенности текст. Если переключиться на 1024 например, играть становится гораздо удобней в плане эргономики объектов, элементов интерфейса и текста. Но вместе с тем становится всё слишком зернистым и размазанным, и функция scalefilter была бы очень кстати.

Может я не очень прав в своих ожиданиях, поскольку до конца не понимаю как эти технологии устроенны и работают. Если это так, то пожалуйста объясните в чём я не прав.
Fakeman
QUOTE
Я хочу включить функцию scalefilter, например AdvancedMame2x. Из опыта использования dropbox, в котором точно также используются эти функции, эти функции должны сглаживать текстуры и убирать зернистость. Но как ни старался, никакого эффекта ожидаемого это не принесло.

потому что в олипе 1.1 версия Sfall'а сейчас 3.4 в новых версиях больше нет поддержки этих возможностей, последний sfall в которой это будет работать это 2.16 У вас вообще в олимпе какая версия sfall стоит. :)
Возьмите sfall из версии олимпа 1.05 и настраивайте его.

Я так понял тебе нужен х2 режим в игре, если есть монитор с поддержкой разрешения 1920х1080 то используй Mash's resolution patch версии 4.18 адаптированный под олимп, и будет то что ты хочешь — все крупное)
ссылку надо?
Elkantar
Спасибо ) Не надо ) Насколько я понимаю он ничем не отличается от того который запакован в HD релиз версии 1.1 Или есть разница?

п.с.

разархивировал архив Olympus_HiRes4.1.8_sfall 3.4
в файле ddraw написано:

CODE
;sfall configuration settings
;v2.12


Хотя сам dll версии 3.4.1.305

У меня точно такое и установлено и там есть строки:
CODE
;Set to something other than 0 to apply a software scaler in graphics modes 4 or 5
;This can be used instead of, or in addition to, the hardware global.fx shader
;This option is unsupported when using Mash's resolution patch
;0 - Default scaler
;1 - 2xSai
;2 - SuperEagle
;3 - Super2xSai
;4 - hq2x
;5 - AdvancedMame2x
;6 - letterbox
;7 - no scaling
ScaleFilter=0


Но судя по тому что что вы сказали, эти функции остались прописанными рудиментами которые более не работают. Это объясняет почему у меня ничего не получается. Пичаль.

п.п.с. Как правильно настроить функцию х2? Максимальное разрешение моего монитора 1360, но я всё равно хотел бы чтобы картинка масштабировалась.
Fakeman
Видимо конфиг в игре остался старый от версии олипа 1.05. ничего страшного.

Если моник не поддерживает 1920 то смысла включать х2 нет, олимп не будет нормально работать — т.е. не будет работать кнопка HMS, и его окна будут не корректно отображаться.
х2 — это ScalingX2 в настройках Hi-Res 4.1.8.
Я на самом деле не пробовал на таком разрешении как у тебя, у меня в конфиге Hi-Res при х2 доступны только 1280х1024 и 1920х1080 и вот в первом разрешении игра не работает, не знаю как будет у тебя, попробуй может будет работать.

Возьми старую dll'ку Sfallа(без конфига) и настраивай.
Elkantar
Я правильно понимаю, что x2 умножает параметр разрешение экрана на 2? Т.е. если параметр разрешения выставить 800х600 то игра запуститься 1600х1200? Аналогично если ставить 640х480 то на выходе будет 1280х960?

QUOTE
Возьми старую dll'ку Sfallа(без конфига) и настраивай.


А контролировать напарников с ним можно будет? И прочие радости!
Fakeman
с кем с ним? со старым сфалом? вроде да.
Elkantar
Да. Сообщение выше обновил.
Fakeman
QUOTE
Я правильно понимаю, что x2 умножает параметр разрешение экрана на 2?

Родное разрешение увеличивается в 2 раза(1280х960), а дальше патч просто изменяет размер окна игры. вроде как-то так это работает.
Elkantar
Значит настраиваю конфиг следующим образом.

f2_res:

QUOTE
; Set GRAPHICS_MODE=2 to enable DirectX9 mode.
GRAPHICS_MODE=2

; Set SCALE_2X=1 to scale the game x2.
; Note: This will increase the minimum resolution to from 640x480 to 1280x960.
SCALE_2X=1

; Set the Fullscreen resolution here.
SCR_WIDTH=0
SCR_HEIGHT=0

; Set the Fullscreen colours here.
; 8 for 8bit colour output (original)
; 16 for 16bit colour output (set only if your not using Sfall with graphics modes 4 or 5)
; 32 for 32bit colour output (set only if your not using Sfall with graphics modes 4 or 5)
COLOUR_BITS=(????)


И ddraw

QUOTE
[Graphics]
;Set to 0 for 8 bit fullscreen
;Set to 4 for dx9 fullscreen
;Set to 5 for dx9 windowed
;A dx9 mode is required for any graphics related script extender functions to work (i.e. fullscreen shaders)
;Modes 1, 2 and 3 are no longer supported
Mode=(????)

;If using a dx9 mode, this changes the resolution
;The graphics are simply stretched to fit the new window; this does _not_ let you see more of the map
GraphicsWidth=1280
GraphicsHeight=720

;Set to something other than 0 to apply a software scaler in graphics modes 4 or 5
;This can be used instead of, or in addition to, the hardware global.fx shader
;This option is unsupported when using Mash's resolution patch
;0 — Default scaler
;1 — 2xSai
;2 — SuperEagle
;3 — Super2xSai
;4 — hq2x
;5 — AdvancedMame2x
;6 — letterbox
;7 — no scaling
ScaleFilter=(????)

;Set to 1 for a linear texture filter, or 0 to disable
TextureFilter=(????)


Как быть с (????) ??
Fakeman
Я без понятия как тебе настравать сфалл, пробуй разные варианты, единственное что надо соблюдать это одинаковое разрешение в сфалл и в hres. Для насройки hres есть утилитка, или в меню игры его настраивай.
Sfall
TextureFilter=1
Mode=4
Crafty
По случаю праздника новая версия ;)

Сначала общие (ну или почти) изменения для F1/F2 — версий:
- в F2-версии переписан оригинальный explosion_crash_fix на "правильный" вариант :-p В F1-версию он добавлен.
- Исправлен приводящий к крашу баг с форсированным (подбросить взрывчатку и покинуть карту до взрыва) использованием взрывчатки если взрыв задевает кого-либо рядом, возвратом на карту и снова выходом с карты.
- Теперь при форсированном использовании взрывчатки и смерти жертвы вызывается destroy_p_proc.
- Значение переменной SpeedInterfaceCounterAnims может быть равно 2 — в этом случае значение счётчиков будет изменяться мгновенно (но в момент смерти всё так же с анимацией).
- Добавлена переменная InstanWeaponEquip, включение которой отключает анимацию убирания/доставания оружия при его смене, открытии ящиков и т.д..
- В F2-версии переписан оригинальный TimeLimit с исправлениями (потерянное время, обработка очереди событий), а в F1-версию он добавлен. Удалено значение -2 (переполнение счётчика и зависание игры. Какая от него польза?). Если всё же -2 используется, то эффект такой же как если бы указали -3. Правильно отображается возраст игрока (впрочем он ограничен 99, чтобы не портить вывод) на экране персонажа.
- Добавлена переменная PipboyTimeAnimDelay для изменения скорости анимации времени в будильнике пипбоя.
- В F2-версии оптимизирован AnimationsAtOnceLimit, в результате чего dll'ка похудела на 10 Kb ;) В F1-версию AnimationsAtOnceLimit добавлен.
- Исправлено отображение полученного дамага при мгновенной смерти.

Изменения в F2-версии:
- Вместо переменных BodypartHitMod0...BodypartHitMod8 используются BodyHit_Head...BodyHit_Uncalled как в sfall1.
- Удалена устаревшая переменная WorldMapFPS и связанная с ней ForceLowResolutionTimer (обрабатывались только если WorldMapFPSPatch=0), а также WorldMapDelay (обрабатывалась только если WorldMapFPS и WorldMapFPSPatch равны 0).
- Теперь WorldMapEncounterFix обрабатывается независимо от значения WorldMapFPSPatch (ранее только если WorldMapFPSPatch=0).
- Из ddraw.ini удалена переменная MultiHexPathingFix, причина аналогична удалению BlackSkilldexFix.
- Исправлен функционал переменной OverrideMusicDir.
- Теперь при включённой переменной CheckWeaponAmmoCost проверяется ещё и количество патронов у оружия при стрельбе очередью.
- Добавлены изменения из sfall:
>Fixed incorrect bonuses on AC and Melee Damage from Heavy Handed trait when using perks.ini
>A new hook script: hs_invenwield (when wielding or unwielding an armor or a weapon by a critter)
>Expanded message_str_game function to support all pro_*.msg files as well
>Removed obsolete Jim's damage formula

Изменения в F1-версии:
- Исправлен баг использования в бою лишних очков действия вместо указанных (2 ОД) при использовании предмета в руке (5 ОД) или с помощью значка действия "Использовать предмет из рюкзака" (3 ОД).
Foxx
Большое спасибо
Fakeman
Ну здравствуй пропащий)

Возможно ли доработать функцию sfallа 'get_game_mode'
чтобы можно было получить список не достающих режимов в котором находится игра?
в данном случае не хватает для USE и LOOT окон интерфейса.

CODE
//Recognised modes for set_shader_mode and get_game_mode
#define WORLDMAP   (0x1)
#define LOCALMAP   (0x2)
#define DIALOG     (0x4)
#define ESCMENU    (0x8)
#define SAVEGAME   (0x10)
#define LOADGAME   (0x20)
#define COMBAT     (0x40)
#define OPTIONS    (0x80)
#define HELP       (0x100)
#define CHARSCREEN (0x200)
#define PIPBOY     (0x400)
#define PCOMBAT    (0x800)
#define INVENTORY  (0x1000)
#define AUTOMAP    (0x2000)
#define SKILLDEX   (0x4000)


Отправлено: 26 фев 16 20:24
QUOTE
- Добавлена переменная InstanWeaponEquip, включение которой отключает анимацию убирания/доставания оружия при его смене, открытии ящиков и т.д.

а может при "его смене" не надо убирать анимацию?
Crafty
Foxx
QUOTE
Большое спасибо
Да не за что :)

Fakeman
QUOTE
Ну здравствуй пропащий)
Такой хитрый план :-p

QUOTE
в данном случае не хватает для USE и LOOT окон интерфейса.
Добавил INTFACEUSE и INTFACELOOT (или лучше именно USE и LOOT?):
CODE
#define INTFACEUSE  (0x8000)
#define INTFACELOOT (0x10000)
Проверяй, если то что нужно и без изменений, то так и оставим.

QUOTE
а может при "его смене" не надо убирать анимацию?
Почему? Это клавиша 'B', очень долгая задержка.
Fakeman
QUOTE
Добавил INTFACEUSE и INTFACELOOT (или лучше именно USE и LOOT?):

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

QUOTE
Почему? Это клавиша 'B', очень долгая задержка.

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

QUOTE
Теперь при включённой переменной CheckWeaponAmmoCost проверяется ещё и количество патронов у оружия при стрельбе очередью.

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

тут как бы если ты хочешь менять эти значение прямо из игры то придется вводить новые ОpСode, а соответственно и в компилятор(декомпилятор) тоже надо его вводить.
а вот просто получить значение из ini и записать их в переменную можно через get_ini_setting — но это вероятно не то что тебе нужно.

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

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

Я так понимаю, этот адрес постоянно меняется после перезахода в игру, да? Иначе можно было бы его найти через ArtMoney.
Fakeman
Привязка к гваре — чувствую это еще тот геморрой в реализации будет. — Какой номер ей присваивать прописывать в ини тоже. К сфаловской гваре только.
Адрессное пространство видимо да меняется но оффсет относительно начала постоянен.
Вообще в чем фишка этого лимита веса инвентаря — в чем ее суть?
Nordan
Фишка этого лимита в том, что вещи имеют не только вес, но и размер, ведь невозможно же в одной сумке уместить 10 миниганов. ) А динамическое изменение этого лимита немного бы разнообразило характеристики брони, наличие дополнительных карманов увеличивало бы это значение. Типа того. Вообще, насколько это трудоемко — мне не известно, так как в моем представлении это реализуется заменой проверки параметра в ини файле на проверку ГВАРы (а номер, в принципе не особо важен).
Fakeman
QUOTE
;Only the PC uses CritterInvSizeLimit. Other critters will use the extra unused stat (STAT_unused = 10)

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

UPD: Нет, с лимитом так не получится, адрес меняется...
Crafty
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 работает...
Fakeman
QUOTE
и неописанный режим торговли. Последний, если его нужно будет добавить, логично было бы назвать BARTER (INTFACEBARTER режет глаза ;)). Поэтому вероятно INTFACEUSE и INTFACELOOT лучше сделать без INTFACE, чтобы вписывались...

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

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

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

Еще очень важный вопрос! есть ли какая-нибудь функция в движке игры которая перерисовывает итемы в слотах инвентаря? чтобы можно было ее как-нибудь вызвать из скрипта функцией call_offset_v0(int address)
в чем суть — если при отрытом инвентаре скриптово добавить итем в сумку игроку(криттеру) то инвентарь не перерисовывается и добавленный итем не появляется на экране пока не по клацаешь стрелочки управления.
Crafty
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);
Fakeman
Мне нужно для цели и для игрока именно для инвентарей loot и barter — для других инвентарей нету проблемы с обновлением их можно обновлять по клавиши home/end.
Попробую поюзать, потом напишу о результате.

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

Может ты посмотришь какие функции забиндины на клавиши home/end инвентаря игрока.
Crafty
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 полностью сломаны (неправильно читают аргументы). И даже после быстрого исправления я начал получать краш (до него просто не работало). Поскольку скриптовыми обработчиками я пока ещё не занимался, то и исправить пока ничего не могу... ;(
Fakeman
AllowUnsafeScripting — Про это я вкурсе.
Ну ладно фиг сним — так сказать не прокатил вариант.
Nordan
Чего то у меня вообще не так, версия sfall 3.7 релизная.
Пробовал затолкать функцию call_offset_v3(0x46FDF4, 0, -1, 0) в скрипт предмета в обработчик destroy_p_proc, чтобы он выполнялся из инвентаря непосредственно.

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

При включенном, ничего не появляется и не крашится, может быть даже работает.
Fakeman
Да не работает оно, я проверял на своем плагине фильтре инвентаря — неперерисовывает итемы. А крашится в интерфейсе бартера.
Crafty
В своё время мне 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
Nordan
Круто. Я так понимаю, ты все это делаешь под версию 3.6 ? На 3.7 не собираешься переходить?
Fakeman
QUOTE
На 3.7 не собираешься переходить

На сколько я понял у него свой Sfall и со своим блэкджеком и... переход на 3.7 невозможен по причине того что у его Sfall'а исходный код конкретно изменен.
а зачем переходить на 3.7 он может плюхи из 3.7 добавить в свою версию, что и было сделано.
Crafty
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
Fakeman
QUOTE
Вот hs_keypress для проверки, аналог home в инвентаре игрока, только на клавишу F11:

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

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

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

И еще найди функцию которая обновляет статы в Инвентаре игрока — это когда предметы таскаешь оно обновляется.
Crafty
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
И еще найди функцию которая обновляет статы в Инвентаре игрока — это когда предметы таскаешь оно обновляется.
Добавил.
Fakeman
Огромное СПС, НО не работает)
Обновление для цели не корректно работает — нужно поводить мышкой по слоту чтобы нарисовались итемы, аля такой фотошоп получается) в чем проблема?

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

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

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

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

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

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

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