Nordan
22 January 2016 | 03:02
Возникла проблема: нужно подкорректировать формулу расчета скилл поинтов. Раньше казалось, что через sfall это сделать не составит труда, однако, при детальном изучении возможностей сфалла, возможность реализации этого не нашлась.
Akella в мегамоде каким то образом сделал это. Возможно через редактирование самого движка, хотя не факт.
Так вот собственно, существует ли возможность правки этой формулы (путем редактирования смещений в движке или через сфалл) без глобальной переделки движка?
The Master
22 January 2016 | 16:57
Да нет ничего глобального, в 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
17 February 2016 | 02:32
Мастер а есть еще какие-нибудь полезные смещения в движке?
все же вы там двиг для невады так перелопатили остались хоть какие-то данные по раскопкам двига?
The Master
19 April 2016 | 10:00
Да я целый документ делал, с пояснениями и таблицей, потом весь жёсткий того-самого и остатки сожрало время. Наработки по Неваде у меня лежат, но там всё скопом, до систематизации я доберусь... когда-нибудь.
Кучу полезностей накопали, и сейчас вспомнить весело :)
Fakeman
19 April 2016 | 15:55
когда-нибудь, это типа никогда?)
может так выложишь как есть, а то вдруг завтра-после-завтра там где оно лежит прикажет долго жить))
Fakeman
6 September 2016 | 17:32
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
6 September 2016 | 20:35
Не совсем. Идея была впихнуть в формулу зависимость от наличия у Чузена специального трейта, который влияет на количество получаемых скиллпоинтов.
Хотя, теоретически, это можно реализовать и через mod_skill_points_per_level, но получится не так красиво. :)
Fakeman
6 September 2016 | 23:21
QUOTE |
Идея была впихнуть в формулу зависимость от наличия у Чузена специального трейта |
ну не знаю чего там не красивого)
подставляешь под Х любую свою формулу и получаешь +/- к очкам навыков.
Отправлено: 7 сен 16 01:33
Кстати поковырявшись в Ressurection нашел там адрес по которому можно уменьшать скилы игроку, а то стандартная функция не умеет этого делать.
CODE |
5358764 -здесь начинается таблица области со значениями уроней скилов в размере по 4 байт на скилл, всего 17 скилов. использовать можно так: write_int/read_int(5358764 + ( 4 * Skill)) |
Nordan
7 September 2016 | 22:17
QUOTE |
ну не знаю чего там не красивого) |
Не красиво то, что это костыль, точнее скриптовое манипулирование движковыми параметрами.
Я так понимаю, количество скиллпоинтов, получаемых при левелапе это такой же расчетный параметр, как например "грузоподъемность", т.е. этот параметр изменяется всегда при каждом обновлении всех подобных параметров (ведь показатели характеристик (силы, ловкости и т.д.) могут меняться в течении игры). Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления.
Кстати говоря, сфалловские функции по изменению каких то параметров имеют неприятную особенность они меняют сами значения в памяти, но не производят обновления связанных с ними параметров (т.е. например, при изменении значения "сила" через set_critter_extra_statt грузоподъемность не изменится, пока не произойдет движковый "перерасчет" этого параметра (при открытии инвентаря, к примеру)). Из этой ситуации я вышел путем прибавления "нуля" к подобному стату через стандартную функцию BIS.
QUOTE |
Кстати поковырявшись в Ressurection нашел там адрес по которому можно уменьшать скилы игроку |
А для ванильного двига это актуально?
Fakeman
8 September 2016 | 00:27
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
8 September 2016 | 21:53
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
9 September 2016 | 00:47
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
9 September 2016 | 21:33
QUOTE |
да нет нужно если параметры со временем изменятся, она будет прибавлять старое значение. я ее уже тестировал как она работает. |
Ты уверен? Лично у меня она работает так как написано в документации... вроде.
Т.е. она работает как "хук": когда происходит левелап, она изменяет очки скиллпоинтов на значение операнда, и усе. Исполнять ее надо только один раз после загрузки, только потому что значение операнда не сохраняется в сейвах.
QUOTE |
для этого существует set_global_script_repeat ставишь 1 раз в 30 сек. |
В эти 30 сек. двиг может обратно поменять значение и левелапнуть Чузена. Это, конечно, маловероятно, но все же. :)
QUOTE |
у меня и на не и сфаловских скриптах бывает крашится игра. |
Но там можно более менее найти причину, а сфалл иногда просто рандомно делает какую то хрень. Например, я сейчас делаю систему голода/жажды/сна, которая влияет на статы SPECIAL, и ОДИН единственный раз у меня один стат начал не уменьшаться (как по идее должен), а увеличиваться, хотя все остальные просчитались нормально и механика расчета полностью идентична. Час пытался повторить этот баг (не изменяя код) НИЧЕГО.
Бывает вылетает при исполнении графических функций...
В общем, чем глобальнее задача, тем нестабильнее ведет себя сфалл (ну и игра тоже, ессно).
Fakeman
12 September 2016 | 00:26
QUOTE |
Ты уверен? Лично у меня она работает так как написано в документации... вроде. |
Абсолютно уверен!
я тоже думал как ты
при формуле: 0-(ИНТ/2) выполнил при старте с инт=5
апнул левел получил -2 к поинтам
потом повысил инт до 10, апнул левел получил все те же -2 к поинтам, а должно было -5.
Nordan
13 September 2016 | 23:50
Так в том то и дело, mod_skill_points_per_level просто изменяет значение получаемых скиллопоинтов на значение операнда, в нее нельзя записать именно "формулу".
Ее нужно использовать по ситуации, т.е. в твоем примере есть зависимость от интеллекта, значит и обновлять ее нужно тогда, когда изменяется значение интеллекта (как ты и написал ранее).
У меня зависимость от трейта, заначит достаточно выполнить ее при загрузке, да и то только потому что это значение не сохраняется в сейвах.
Так что в описании все верно сказано.
Fakeman
14 September 2016 | 00:52
QUOTE |
Соответственно и изменять этот параметр через mod_skill_points_per_level нужно тоже после каждого такого обновления. |
QUOTE |
У меня зависимость от трейта, заначит достаточно выполнить ее при загрузке, |
Трейт можно убрать перком мутация, если конечно ты его не удалил)
Nordan
14 September 2016 | 06:32
QUOTE |
Трейт можно убрать перком мутация |
Блин, точно. Я, почему то, думал что мутация убирает приоритетные скиллы... не брал ее короче никогда. :)