Combat System — различия между версиями
Материал из Wiki
Wikibot (обсуждение | вклад) |
Wikibot (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | == Расчет урона оружия == | + | === Расчет урона оружия === |
<pre> | <pre> | ||
Строка 33: | Строка 33: | ||
=== Таблица цветов === | === Таблица цветов === | ||
+ | - параметр damage_plus / armor_plus или аналогичный параметр magic для вычисления защиты и атаки доспехов/оружия/щитов из цветных металлов | ||
<pre> | <pre> | ||
− | + | Плюсовое магическое оружие/доспехи (параметр magic) | |
of Ruin +5 | of Ruin +5 | ||
of Might +10 | of Might +10 | ||
Строка 43: | Строка 44: | ||
</pre> | </pre> | ||
<pre> | <pre> | ||
− | + | Цветное магическое оружие/доспехи (параметр damage_plus / armor_plus) | |
Hot/Rose +0 | Hot/Rose +0 | ||
Agapite +5 | Agapite +5 | ||
Строка 60: | Строка 61: | ||
<pre> | <pre> | ||
+ | Цветные доспехи из кожи (параметр armor_plus) | ||
Titan Leather +5 | Titan Leather +5 | ||
Daemon Leather +10 | Daemon Leather +10 | ||
Строка 74: | Строка 76: | ||
<pre> | <pre> | ||
− | dragon_increase: armor.magic = ((<str> + | + | Цветные доспехи из высших металлов (параметр magic зависит от силы) |
− | titan_increase: armor.magic = ((<str> + | + | dragon_increase: armor.magic = ((<str> + 12) * 8) //сила не больше чем на 20 выше расового максимума |
− | chrome_increase: armor.magic = | + | titan_increase: armor.magic = ((<str> + 12) * 8) //сила не больше чем на 20 выше расового максимума |
− | platinum_increase: armor.magic = | + | chrome_increase: armor.magic = 2100 |
− | + | platinum_increase: armor.magic = 2100 | |
+ | Цветное оружие из высших металлов (параметр magic зависит от навыка) | ||
i_dragon_claw: weapon.magic = ((<swordsmanship> * 2) / 3) | i_dragon_claw: weapon.magic = ((<swordsmanship> * 2) / 3) | ||
i_titan_fist: weapon.magic = ((<macefighting> * 2) / 3) | i_titan_fist: weapon.magic = ((<macefighting> * 2) / 3) |
Текущая версия на 21:39, 29 января 2024
Содержание
Расчет урона оружия
dam = {<weapon.dam.min> <weapon.dam.max>} //базовый урон оружия случайное число от мин до макс (до удара) dam = ((<dam> * <weapon.repair>) / <weapon.max_repair>) //понижение урона от повреждения оружия dam = (<dam> * (<tactics> + 500)) / 1000) //бонус от тактики (помним что все навыки считаются как 100.0 или 1000) dam = (<dam> + ((<dam> * <str>) / 500)) //бонус от силы dam = (<dam> + ((<dam> * <anatomy>) / 5000)) //бонус от анатомии dam = ((<dam> * (100 + (<skill> / 10))) / 200) //бонус от боевого навыка //расчет бонуса от магии или цвета оружия (см.таблицу цветов) if <weapon.damage_plus> dam = (<dam> + <weapon.damage_plus>) elseif (<weapon.magic>) dam = (<dam> + ((((<weapon.magic> / 70) + 1) * 5) / 2)) endif if (<weapon.дистанционное>) && (<distance> <= 1) && НЕТ great_elven_archer //бонус от кольца при стрельбе вплотную dam = <dam> * 2/3 endif
- Часть формул может быть скрыта или представлена не в том виде, в котором она существует на данный момент. Это сделано ввиду существующих коллизий. Их список возможно будет представлен позже.
Таблица цветов
- параметр damage_plus / armor_plus или аналогичный параметр magic для вычисления защиты и атаки доспехов/оружия/щитов из цветных металлов
Плюсовое магическое оружие/доспехи (параметр magic) of Ruin +5 of Might +10 of Force +15 of Power +20 of Vanquishing +25
Цветное магическое оружие/доспехи (параметр damage_plus / armor_plus) Hot/Rose +0 Agapite +5 Flame/Gold +5 Orion +5 Verite +5 Dwarf + 10 Shadow +10 Valorite +15 Holy/Silver +15 Crystal +15 Infernal/Magma +20 Obsidian +25 Mythic +25
Цветные доспехи из кожи (параметр armor_plus) Titan Leather +5 Daemon Leather +10 Red Leather +5 Blue Leather +20 Green Leather +20 Yellow Leather +20 Gray Leather +15 Gold Leather +20 Silver Leather +20 Crystal Leather +20 Black Leather +20
Цветные доспехи из высших металлов (параметр magic зависит от силы) dragon_increase: armor.magic = ((<str> + 12) * 8) //сила не больше чем на 20 выше расового максимума titan_increase: armor.magic = ((<str> + 12) * 8) //сила не больше чем на 20 выше расового максимума chrome_increase: armor.magic = 2100 platinum_increase: armor.magic = 2100 Цветное оружие из высших металлов (параметр magic зависит от навыка) i_dragon_claw: weapon.magic = ((<swordsmanship> * 2) / 3) i_titan_fist: weapon.magic = ((<macefighting> * 2) / 3) i_chrome_lance: weapon.magic = ((<fencing> * 2) / 3) i_platinum_broadsword: weapon.magic = ((<swordsmanship> * 2) / 3)
Расчет защиты
//выбор слоя для защиты armor_base = //базовая защита в зависимости от типа доспехов dfns = (<armor_base> * LAYER_[]_AC_K) / 1000 //коэффициент защиты конкретного слоя dfns = (<dfns> * <armor.more1l>) / <armor.more1h> //понижение защиты от повреждения доспеха //расчет бонуса от магии или цвета доспеха (см.таблицу цветов) if <armor.armor_plus> dfns = <dfns> + <armor.armor_plus> elseif (<armor.attr> & attr_magic) dfns = <dfns> + (<armor.magic> / 70) endif //Бонус защиты от магических и алхимических эффектов spell_effect = 1 potion_effect = 1 dfns = <dfns> + <p_layer_i.armor_bonus> //повышение защиты от бонуса слоев, непосредственно не участвующих в защите (квестовые предметы)
Расчет парирования
shield_size = //коэффициент размера щита if (rand(75) < <shield_size>) //удача на абсорбацию урона щитом, если успех, то рассчитывает далее. //расчет бонуса от магии или цвета щита (см.таблицу цветов) if <shield.shield_plus> absorbed = <absorbed> + <shield.shield_plus> + 9 elseif (<shield.attr> & attr_magic) absorbed = <absorbed > + (<shield.magic> / 70) + 9> endif absorbed = (<shield_size> * <absorbed>) / 100 absorbed = (<absorbed > * (100 + (<parrying> / 10))) / 200 absorbed = <absorbed> * <shield.repair> / <shield.max_repair> //понижение поглощения в зависимости от повреждения щита
Скорость ударов
CombatAttackSpeed = 150000 / ( ( DEX + 100 ) * speed ) задержка между ударами speed - характеристика оружия
Healing skill
//staminadrain if <paladin> staminadrain = {2 3} elseif <elf> staminadrain = {2 3} else staminadrain = 3 endif if <food> > 14 stamina = <stamina> - <staminadrain> else if <stamina> < <staminadrain> + ((15 - food) / 2)) stamina = 0 else stamina = <stamina> - (<staminadrain> + ((15 - food) / 2))) endif endif //delay firstspeed = 9 if <stamina> >= <dex> speed = <firstspeed> else if dex < 70 speed = ((1 + ((70 - <stamina>) / 15))*<firstspeed>) else speed = ((1 + ((<dex> - <stamina>) / 15))*<firstspeed>) endif endif if <dwarf> speed = ((<speed> * 12) / 14) elseif <orc> && (i_giggling_orc_shaman) speed = ((<speed> * 12) / 14) elseif !<orc> speed = ((<speed> * 12) / 15) endif //heal min = ( (<healing> / 55) + (<anatomy> / 500) + (<dex> / 50) ) max = ( (<healing> / 35) + (<anatomy> / 233) + (<dex> / 23) ) if (<elf>) || (<paladin>) min = (<min> + 20%) max = (<max> + 15%) elseif <human> min = (<min> + 15%) max = (<max> + 10%) endif
Repair skill
res_type = <resources.type> if (<res_type> == ingot) || (<res_type> == log) || (<res_type> == board) || (<res_type> == leather) local.res_amount = <eval ((<maxrepair> - <repair>) * <resources.value>) / <maxrepair>> if <res_amount> <= 0 res_amount = 1 endif
CombatChanceToHit
</pre> int CResource::Calc_CombatChanceToHit( CChar * pChar, SKILL_TYPE skill, CChar * pCharTarg, CItem * pWeapon )
{ // If no target, must be a training dummy if ( pCharTarg == NULL ) { return( Calc_GetRandVal(31)); }
// Frozen targets should be easy. if ( pCharTarg->IsStatFlag( STATF_Sleeping | STATF_Freeze | STATF_Stone )) { return( Calc_GetRandVal(10)); }
int iSkillVal = pChar->Skill_GetAdjusted( skill );
int iSkillAttack = ( iSkillVal + pChar->Skill_GetAdjusted( SKILL_TACTICS )) / 2; int iSkillDefend = pCharTarg->Skill_GetAdjusted( SKILL_TACTICS );
int iStam = pCharTarg->m_StatStam; if ( pCharTarg->Skill_GetActive() == SKILL_ARCHERY && skill != SKILL_ARCHERY ) // The defender uses ranged weapon and the attacker is not. iSkillDefend = ( iSkillDefend + iStam*9 ) / 2; else // The defender is using a nonranged, or they both use bows. iSkillDefend = ( iSkillDefend + iStam*10 ) / 2;
int iDiff = ( iSkillAttack - iSkillDefend ) / 5;
iDiff = ( iSkillVal - iDiff ) / 10; if ( iDiff < 0 ) iDiff = 0; // just means it's very easy. else if ( iDiff > 100 ) iDiff = 100; // just means it's very hard.
return( Calc_GetRandVal(iDiff)); // always need to have some chance. );
} </pre>