Полная Версия: Изменение формулы расчета скилл поинтов
Nordan
Возникла проблема: нужно подкорректировать формулу расчета скилл поинтов. Раньше казалось, что через sfall это сделать не составит труда, однако, при детальном изучении возможностей сфалла, возможность реализации этого не нашлась.

Akella в мегамоде каким то образом сделал это. Возможно через редактирование самого движка, хотя не факт.

Так вот собственно, существует ли возможность правки этой формулы (путем редактирования смещений в движке или через сфалл) без глобальной переделки движка?
The Master
Да нет ничего глобального, в hex-редакторе подправить чуток, потом если нужен sfall, через modderpack ExtraCRC прописать и пользоваться.
Дефолтная формула:
CODE
Интелект * 2 + 5 + 2(если educated) + 5 (если skilled)

Лезем в Fallout2.exe hex-редактором, меняем следующее
CODE
2С676 01 90
2С677 C0 90
2С67A 05 0A


Это поменяет формулу на Интеллект+5, бонусы от Educated и Skilled остаются.

А вообще вроде говорили, что есть в sfall такая возможность, за давностью лет не припомню, правда или нет. Akkella в Глобале делал через движок.

Это всё само собой для 1.02d US
Fakeman
Мастер а есть еще какие-нибудь полезные смещения в движке?
все же вы там двиг для невады так перелопатили — остались хоть какие-то данные по раскопкам двига?
The Master
Да я целый документ делал, с пояснениями и таблицей, потом весь жёсткий того-самого и остатки сожрало время. Наработки по Неваде у меня лежат, но там всё скопом, до систематизации я доберусь... когда-нибудь.

Кучу полезностей накопали, и сейчас вспомнить весело :)
Fakeman
когда-нибудь, это типа никогда?)
может так выложишь как есть, а то вдруг завтра-после-завтра там где оно лежит прикажет долго жить))
Fakeman
QUOTE (Nordan)
Раньше казалось, что через sfall это сделать не составит труда, однако, при детальном изучении возможностей сфалла, возможность реализации этого не нашлась.

CODE
> void mod_skill_points_per_level(int x)
- accepts a value of between -100 and 100, and modifies the number of skill points the player recieves when they level up.
- This is a modification of what would otherwise happen, rather than a replacement.
- The value is not saved into the save game, so should be reset in the game_loaded section of a script.

А это разве не то?
Nordan
QUOTE
А это разве не то?

Не совсем. Идея была впихнуть в формулу зависимость от наличия у Чузена специального трейта, который влияет на количество получаемых скиллпоинтов.

Хотя, теоретически, это можно реализовать и через mod_skill_points_per_level, но получится не так красиво. :)
Fakeman
QUOTE
Идея была впихнуть в формулу зависимость от наличия у Чузена специального трейта

ну не знаю чего там не красивого)
подставляешь под Х любую свою формулу и получаешь +/- к очкам навыков.

Отправлено: 7 сен 16 01:33
Кстати поковырявшись в Ressurection нашел там адрес по которому можно уменьшать скилы игроку, а то стандартная функция не умеет этого делать.
CODE
5358764 -здесь начинается таблица области со значениями уроней скилов в размере по 4 байт на скилл, всего 17 скилов.
использовать можно так: write_int/read_int(5358764 + ( 4 * Skill))
Nordan
QUOTE
ну не знаю чего там не красивого)

Не красиво то, что это костыль, точнее скриптовое манипулирование движковыми параметрами.

Я так понимаю, количество скиллпоинтов, получаемых при левелапе — это такой же расчетный параметр, как например "грузоподъемность", т.е. этот параметр изменяется всегда при каждом обновлении всех подобных параметров (ведь показатели характеристик (силы, ловкости и т.д.) могут меняться в течении игры). Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления.

Кстати говоря, сфалловские функции по изменению каких то параметров имеют неприятную особенность — они меняют сами значения в памяти, но не производят обновления связанных с ними параметров (т.е. например, при изменении значения "сила" через set_critter_extra_statt грузоподъемность не изменится, пока не произойдет движковый "перерасчет" этого параметра (при открытии инвентаря, к примеру)). Из этой ситуации я вышел путем прибавления "нуля" к подобному стату через стандартную функцию BIS.

QUOTE
Кстати поковырявшись в Ressurection нашел там адрес по которому можно уменьшать скилы игроку

А для ванильного двига это актуально?
Fakeman
QUOTE
Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления.

глобальные скрипты выполняются постоянно, пишешь в них код, обновление происходит реал-тиме.
в общем нет ни какой проблемы с этим.

QUOTE
Кстати говоря, сфалловские функции по изменению каких то параметров имеют неприятную особенность — они меняют сами значения в памяти, но не производят обновления связанных с ними параметров (т.е. например, при изменении значения "сила" через set_critter_extra_statt грузоподъемность не изменится, пока не произойдет движковый "перерасчет" этого параметра (при открытии инвентаря, к примеру)).

есть функция обновления статов при открытом инвентаре, я как раз для этого дела и просил у крафти ее откопать.
call_offset_v0(0x471D5C); /* display_stats_ обновляет статы игрока в интерфейсе */
call_offset_v1(0x4D6F5C, read_int(0x59E964)); /* win_draw_ Перерисовывает открытый интрефейс */
вот эти функции надо выполнить.

еще есть такая на всяк случай.
call_offset_v0(0x45EB98); /* intface_redraw_ Перерисовывает игровую панель */

QUOTE
Из этой ситуации я вышел путем прибавления "нуля" к подобному стату через стандартную функцию BIS.

о спасибо, будем иметь ввиду что 0 обновляет это дело.

QUOTE
А для ванильного двига это актуально?

А у них, что не ванильный? там же в папке лежит ванильный движок,
у них там какая-то запускалка патчеловка на лету патчит двиг.
Я пробовал работает.
Nordan
QUOTE
Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления.


Поправка. Не нужно ее постоянно обновлять, если верить сфалловской документации...

QUOTE
void mod_skill_points_per_level(int x)
- accepts a value of between -100 and 100, and modifies the number of skill points the player recieves when they level up.
- This is a modification of what would otherwise happen, rather than a replacement.
- The value is not saved into the save game, so should be reset in the game_loaded section of a script.


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

QUOTE
глобальные скрипты выполняются постоянно, пишешь в них код, обновление происходит реал-тиме.
в общем нет ни какой проблемы с этим.


Так в том то и дело, что это будет выполняться несколько раз в секунду, хотя само событие левелапа произойдет хрен знает когда, это во-первых. Во-вторых, получается полная чехарда: движок устанавливает параметр, сфалл его изменяет, движок опять его правит, потом сфалл его опять правит... и все это происходит каждую секунду.
Это еще не принимая в расчет то, что сфалл далеко не самая стабильная вещь сама по себе. При его работе всплывают абсолютно рандомные баги, которые непонятно из-за чего и почему происходят. Они бывают редко, но метко.
Ну и, ессно, все это сказано не принимая в расчет то, что я написал в самом начале, просто я хотел донести мысль насколько это грязный и опасный прием.

QUOTE
А у них, что не ванильный?

ну вот это я не знаю, просто предположил... Сам то я в Ressurection не играл.
Fakeman
QUOTE
Поправка. Не нужно ее постоянно обновлять

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

ставишь проверяемые условия, отчего у тебя зависят SP, примерно так
CODE

//skill point per level
   if dude_iq != iq_lvl then begin
     iq_lvl:=dude_iq;
     mod_skill_points_per_level(0-(floor(iq_lvl/2)));
   end
iq_lvl - запоминается при старте скрипта.

QUOTE
и все это происходит каждую секунду.

для этого существует set_global_script_repeat
ставишь 1 раз в 30 сек.

у меня и на не и сфаловских скриптах бывает крашится игра.
вот FON сделан без сфала, но все равно краши присутствуют.

QUOTE
просто я хотел донести мысль насколько это грязный и опасный прием.

А другого варианта нет как то влиять на SP, кроме как, перекомпилировать двиг F2 со своей формулой)))
Nordan
QUOTE
да нет нужно
если параметры со временем изменятся, она будет прибавлять старое значение. я ее уже тестировал как она работает.


Ты уверен? Лично у меня она работает так как написано в документации... вроде.

Т.е. она работает как "хук": когда происходит левелап, она изменяет очки скиллпоинтов на значение операнда, и усе. Исполнять ее надо только один раз — после загрузки, только потому что значение операнда не сохраняется в сейвах.

QUOTE
для этого существует set_global_script_repeat
ставишь 1 раз в 30 сек.


В эти 30 сек. двиг может обратно поменять значение и левелапнуть Чузена. Это, конечно, маловероятно, но все же. :)

QUOTE
у меня и на не и сфаловских скриптах бывает крашится игра.

Но там можно более менее найти причину, а сфалл иногда просто рандомно делает какую то хрень. Например, я сейчас делаю систему голода/жажды/сна, которая влияет на статы SPECIAL, и ОДИН единственный раз у меня один стат начал не уменьшаться (как по идее должен), а увеличиваться, хотя все остальные просчитались нормально и механика расчета полностью идентична. Час пытался повторить этот баг (не изменяя код) — НИЧЕГО.
Бывает вылетает при исполнении графических функций...
В общем, чем глобальнее задача, тем нестабильнее ведет себя сфалл (ну и игра тоже, ессно).
Fakeman
QUOTE
Ты уверен? Лично у меня она работает так как написано в документации... вроде.

Абсолютно уверен!
я тоже думал как ты
при формуле: 0-(ИНТ/2) выполнил при старте с инт=5
апнул левел получил -2 к поинтам
потом повысил инт до 10, апнул левел получил все те же -2 к поинтам, а должно было -5.
Nordan
Так в том то и дело, mod_skill_points_per_level просто изменяет значение получаемых скиллопоинтов на значение операнда, в нее нельзя записать именно "формулу".

Ее нужно использовать по ситуации, т.е. в твоем примере есть зависимость от интеллекта, значит и обновлять ее нужно тогда, когда изменяется значение интеллекта (как ты и написал ранее).

У меня зависимость от трейта, заначит достаточно выполнить ее при загрузке, да и то только потому что это значение не сохраняется в сейвах.

Так что в описании все верно сказано.
Fakeman
QUOTE
Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления.

QUOTE
У меня зависимость от трейта, заначит достаточно выполнить ее при загрузке,

Трейт можно убрать перком мутация, если конечно ты его не удалил)


Nordan
QUOTE
Трейт можно убрать перком мутация


Блин, точно. Я, почему то, думал что мутация убирает приоритетные скиллы... не брал ее короче никогда. :)
Ваш ответ: