Показать сообщение отдельно
Старый 22.04.2005, 13:57   #293
B_Wolf

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Предисловие:

Необходимые файлы:
_decompiled\_Intern\constants.d

_decompiled\AI\Prototypes\Npc_Default.d

_decompiled\AI\AI_Intern\Balancing.d

_decompiled\Story\B\b_giveskill.d


В данный момент я занимаюсь разработкой мода "StrongHand" для Gothic 1, подробности в одноименной теме.
Мне удалось сделать в модификацию боевую систему наносимых повреждений как в Gothic 2 - т.е. чем больше умение владения мечом, тем больше шанс нанести удар в полную силу, остальные удары проходят поверхностно.

Принцип действия системы:
Как известно в оригинальной Gothic 1, все повреждения наносятся в полную силу +5% - 10% шанс нанести критический удар в два раза сильнее.
Критический удар описывается в файле "constants.d", пересенной "const int DAM_CRITICAL_MULTIPLIER = 2;"

По умолчанию игрок начинает с 0 уровнем меча - т.е. шанс нанести критический удар 0%, это прописано в файле Прототипа для всех персонажей "Npc_Default.d".
"Npc_SetTalentValue(self,NPC_TALENT_1H,0);" - для одноручника.
"Npc_SetTalentValue(self,NPC_TALENT_2H,0);" - для двуручника.
Когда игрок изучает оружие, он добавляет соответсвенно 5% и 10%.

Немного поразмыслив, я установил значение "const int DAM_CRITICAL_MULTIPLIER = 0;", из чего выйдет, что урон от всех ударов будет умножаться на "0" и будет касательным, т.е. будет наносится минимальное повреждение описываемое в файле "Balancing.d", переменной "const int NPC_MINIMAL_DAMAGE = 10;", что соответствует 10 ед. урона.
Итак, что мы имеем...
С такими параметрами "Npc_Default.d"
"Npc_SetTalentValue(self,NPC_TALENT_1H,0);"
"Npc_SetTalentValue(self,NPC_TALENT_2H,0);"
Естественно ранее "критические", а теперь "касательные" удары вообще не будут происходить, так как вроятность "0".
Нужно же, чтобы эти удары на нулевом уровне меча происходили довольно часто, чтобы это изменить, я изменил значения "0" - на "90"
"Npc_SetTalentValue(self,NPC_TALENT_1H,90);"
"Npc_SetTalentValue(self,NPC_TALENT_2H,90);"
Теперь, с вероятностью 90% будут наносится касательные удары, отсюда следуют что удары в полную силу будут наносится с вероятностью 10%. Значит чем меньше будет значение переменной, тем больше будет вероятность, что удары пройдут в полную силу.
Впринципе вот эта и есть система Г2 :)

Но, раньше при обучении, к переменным:
"Npc_SetTalentValue(self,NPC_TALENT_1H,90);"
"Npc_SetTalentValue(self,NPC_TALENT_2H,90);"
Прибавлялось 5 и 10, теперь же для обучения нужно убавлять, это изменяется в файле "b_giveskill.d"

Npc_SetTalentValue(typ,NPC_TALENT_1H,Npc_GetTalent Value(typ,NPC_TALENT_1H) - 40);
Npc_SetTalentValue(typ,NPC_TALENT_2H,Npc_GetTalent Value(typ,NPC_TALENT_2H) - 40);

С каждым уровнем обучения от 90 отнимается число 40.

Одноручник\Двуручник:
0 - 90% вероятность провала - 10% успешная атака.
1 - 50% вероятность провала - 50% успешная атака.
2 - 10% вероятность провала - 90% успешная атака.

Эти переменные в файле "Story_Globals.d" отвечали за количество LP за обучение.
const int LPCOST_TALENT_1H_1 = 10;
const int LPCOST_TALENT_1H_2 = 20;
const int LPCOST_TALENT_2H_1 = 50;
const int LPCOST_TALENT_2H_2 = 70;

Но потом мне удалось сделать вот такую системы

--- Нет комбы ---
0 - не обучен    10% успешная атака.
--- Комбо 1 ---
1 - новичок      20% успешная атака.
2 - драчун       30% успешная атака.
3 - лесоруб      40% успешная атака.
4 - боец         50% успешная атака.
--- Комбо 2 ---
5 - воин         60% успешная атака.
6 - вояка        70% успешная атака.
7 - инквизитор   80% успешная атака.
8 - мастер       90% успешная атака.

Для этого пришлось добавить несколько переменный в файл "Story_Globals.d".

const int LPCOST_TALENT_1H_1 = 10;
const int LPCOST_TALENT_1H_2 = 10;
const int LPCOST_TALENT_1H_3 = 10;
const int LPCOST_TALENT_1H_4 = 10;
const int LPCOST_TALENT_1H_5 = 15;
const int LPCOST_TALENT_1H_6 = 15;
const int LPCOST_TALENT_1H_7 = 15;
const int LPCOST_TALENT_1H_8 = 15;

const int LPCOST_TALENT_2H_1 = 10;
const int LPCOST_TALENT_2H_2 = 10;
const int LPCOST_TALENT_2H_3 = 10;
const int LPCOST_TALENT_2H_4 = 10;
const int LPCOST_TALENT_2H_5 = 15;
const int LPCOST_TALENT_2H_6 = 15;
const int LPCOST_TALENT_2H_7 = 15;
const int LPCOST_TALENT_2H_8 = 15;

Итак новая система с более плавным обучением заработала, но стойки бойца остались прежними, а для новых переменных вообще сбросились.
const int LPCOST_TALENT_2H_1 = 10; - стойка обычного бойца.
const int LPCOST_TALENT_2H_2 = 10; - стойка мастера.
const int LPCOST_TALENT_2H_3 = 10; - стойка "необученного"!
const int LPCOST_TALENT_2H_4 = 10; - стойка "необученного"!
и т. д.

Так вот -где можно найти в скриптах описание бойцлвских стоек для каждого уровня TALENT_1H_x.
Ответить с цитированием