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


Фотография

Изменение формулы расчета скилл поинтов


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

#1 Nordan

Nordan

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

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

Отправлено 22 Январь 2016 - 03:02

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

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

Так вот собственно, существует ли возможность правки этой формулы (путем редактирования смещений в движке или через сфалл) без глобальной переделки движка?


#2 The Master

The Master

    Чистосердечный зевака

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

Отправлено 22 Январь 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


#3 Fakeman

Fakeman

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

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

Отправлено 17 Февраль 2016 - 02:32

Мастер а есть еще какие-нибудь полезные смещения в движке?
все же вы там двиг для невады так перелопатили — остались хоть какие-то данные по раскопкам двига?


#4 The Master

The Master

    Чистосердечный зевака

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

Отправлено 19 Апрель 2016 - 10:00

Да я целый документ делал, с пояснениями и таблицей, потом весь жёсткий того-самого и остатки сожрало время. Наработки по Неваде у меня лежат, но там всё скопом, до систематизации я доберусь... когда-нибудь.

Кучу полезностей накопали, и сейчас вспомнить весело :)


#5 Fakeman

Fakeman

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

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

Отправлено 19 Апрель 2016 - 15:55

когда-нибудь, это типа никогда?)
может так выложишь как есть, а то вдруг завтра-после-завтра там где оно лежит прикажет долго жить))


#6 Fakeman

Fakeman

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

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

Отправлено 06 Июнь 2016 - 22:32

проверка -раз раз!

во магия я воскресил пропавшую тему) после того как ответил в пропавшую тему.
чудо форум епт.

Это сообщение отредактировано Fakeman - 6 июня 2016 | 22:34


#7 Fakeman

Fakeman

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

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

Отправлено 06 Сентябрь 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.

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


#8 Nordan

Nordan

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

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

Отправлено 06 Сентябрь 2016 - 20:35

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

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

Хотя, теоретически, это можно реализовать и через mod_skill_points_per_level, но получится не так красиво. :)


#9 Fakeman

Fakeman

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

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

Отправлено 06 Сентябрь 2016 - 23:21

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

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

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


#10 Nordan

Nordan

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

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

Отправлено 07 Сентябрь 2016 - 22:17

QUOTE
ну не знаю чего там не красивого)

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

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

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

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

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

Это сообщение отредактировано Nordan - 7 сентября 2016 | 22:25


#11 Fakeman

Fakeman

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

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

Отправлено 08 Сентябрь 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
А для ванильного двига это актуально?

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


#12 Nordan

Nordan

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

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

Отправлено 08 Сентябрь 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 не играл.


#13 Fakeman

Fakeman

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

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

Отправлено 09 Сентябрь 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 со своей формулой)))

Это сообщение отредактировано Fakeman - 9 сентября 2016 | 01:05


#14 Nordan

Nordan

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

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

Отправлено 09 Сентябрь 2016 - 21:33

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


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

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

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


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

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

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


#15 Fakeman

Fakeman

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

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

Отправлено 12 Сентябрь 2016 - 00:26

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

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

Это сообщение отредактировано Fakeman - 12 сентября 2016 | 00:27


#16 Nordan

Nordan

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

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

Отправлено 13 Сентябрь 2016 - 23:50

Так в том то и дело, mod_skill_points_per_level просто изменяет значение получаемых скиллопоинтов на значение операнда, в нее нельзя записать именно "формулу".

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

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

Так что в описании все верно сказано.

Это сообщение отредактировано Nordan - 13 сентября 2016 | 23:51


#17 Fakeman

Fakeman

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

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

Отправлено 14 Сентябрь 2016 - 00:52

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

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

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




#18 Nordan

Nordan

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

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

Отправлено 14 Сентябрь 2016 - 06:32

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


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




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

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


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

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

Рейтинг@Mail.ru