Отличник форума
Регистрация: 09.04.2005
Адрес: МЗ
Сообщений: 418
|
Re: Прокачка умений
Решил запостить для исчерпывающего ответа, потому как тема возникает довольно часто.
void improove_skill(CHAR_DATA * ch, int skill_no, int success, CHAR_DATA * victim)
{
int skill_is, diff = 0, how_many = 0, prob, div;
if (IS_NPC(ch)) - у мобов(и чармисов) умения не качаются
return;
if (victim && (IS_HORSE(victim) || MOB_FLAGGED(victim, MOB_NOTRAIN)))
return;
не качаются на лошадяках и мобах с флагом NOTRAIN
if (IS_IMMORTAL(ch) ||
((!victim ||
OK_GAIN_EXP(ch, victim)) && IN_ROOM(ch) != NOWHERE
&& !ROOM_FLAGGED(IN_ROOM(ch), ROOM_PEACEFUL) &&
// Стрибог
!ROOM_FLAGGED(IN_ROOM(ch), ROOM_ARENA) &&
//Свентовит
!ROOM_FLAGGED(IN_ROOM(ch), ROOM_HOUSE)
&& !ROOM_FLAGGED(IN_ROOM(ch), ROOM_ATRIUM) &&
(diff =
wis_app[GET_REAL_WIS(ch)].max_learn_l20 * GET_LEVEL(ch) / 20 -
GET_SKILL(ch, skill_no)) > 0
&& GET_SKILL(ch, skill_no) < MAX_EXP_PERCENT + GET_REMORT(ch) * 5)) {
не качается на мобах за которых не дают экспу, в комнате "нигде", в мирках,
на арене, в замках, входе в замок. Ограниченно по мудрости для каждого левела. и ограничено по ремотрам.
for (prob = how_many = 0; prob <= MAX_SKILLS; prob++)
if (GET_SKILL(ch, prob))
how_many++;
считаем количество выученных скилов
how_many += (im_get_char_rskill_count(ch) + 1) >> 1;
прибавляем к ним выученные рецепты деленые на 2
/* Success - multy by 2 */
prob = success ? 20000 : 15000;
если фейл то шанс примерно на 1/4 выше
div = int_app[GET_REAL_INT(ch)].improove /* + diff */ ;
чем выше интеллект персонажа тем выше шанс просвета
if ((int) GET_CLASS(ch) >= 0 && (int) GET_CLASS(ch) < NUM_CLASSES)
div += (skill_info[skill_no].k_improove[(int) GET_CLASS(ch)][(int) GET_KIN(ch)] / 100);
prob /= (MAX(1, div));
if ((diff = how_many - wis_app[GET_REAL_WIS(ch)].max_skills) < 0)
prob += (5 * diff);
else
prob += (10 * diff);
чем больше мудрость и чем меньше умений тем больше шанс просвета
prob += number(1, GET_SKILL(ch, skill_no) * 5);
чем больше процент скила тем меньше шанс просвета
skill_is = number(1, MAX(1, prob));
if (
(victim
&& skill_is <= GET_REAL_INT(ch) * GET_LEVEL(victim) / GET_LEVEL(ch))
|| (!victim && skill_is <= GET_REAL_INT(ch))) {
чем больше отношение левелов моба и персонажа(идеальный случай персонаж 1 уровня а моб 50) тем выше шанс просвета
if (success)
sprintf(buf, "%sВы повысили уровень умения \"%s\".%s\r\n",
CCICYN(ch, C_NRM), skill_name(skill_no), CCNRM(ch,
C_NRM));
else
sprintf(buf,
"%sПоняв свои ошибки, Вы повысили уровень умения \"%s\".%s\r\n",
CCICYN(ch, C_NRM), skill_name(skill_no), CCNRM(ch,
C_NRM));
send_to_char(buf, ch);
GET_SKILL(ch, skill_no) += number(1, 2);
просветы бывают только на 1 или 2 процента за раз
if (!IS_IMMORTAL(ch))
GET_SKILL(ch, skill_no) = MIN(MAX_EXP_PERCENT + GET_REMORT(ch) * 5,
GET_SKILL(ch, skill_no));
// скилл прокачался, помечаю моба (если он есть)
if (victim && IS_NPC(victim))
SET_BIT(MOB_FLAGS(victim, MOB_NOTRAIN), MOB_NOTRAIN);
если кто-то уже получил просвет на мобе, то моба помечают флагом NOTRAIN(больше никто на нем не получит просвет)
}
}
}
__________________
Делаю как лучше, а получется...
|