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 |
Трейт можно убрать перком мутация |
Блин, точно. Я, почему то, думал что мутация убирает приоритетные скиллы... не брал ее короче никогда. :)