Combat System — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
(Новая страница: «== Расчет урона оружия == {| class="wikitable mw-datatable" style="width: 85%;" ! colspan="1" style="text-align:left;" | dam = {<weapon.dam.mi…»)
 
 
(не показано 6 промежуточных версий этого же участника)
Строка 1: Строка 1:
== Расчет урона оружия ==
+
=== Расчет урона оружия ===
  
{| class="wikitable mw-datatable" style="width: 85%;"
+
<pre>
! colspan="1" style="text-align:left;" |
+
dam = {<weapon.dam.min> <weapon.dam.max>} //базовый урон оружия случайное число от мин до макс (до удара)
  
dam = {<weapon.dam.min> <weapon.dam.max>} //базовый урон оружия случайное число от мин до макс (до удара)<br>
+
dam = ((<dam> * <weapon.repair>) / <weapon.max_repair>) //понижение урона от повреждения оружия
dam = ((<dam> * <weapon.repair>) / <weapon.max_repair>) //понижение урона от повреждения оружия<br>
+
 
dam = (<dam> * (<tactics> + 500)) / 1000) //бонус от тактики (помним что все навыки считаются как 100.0 или 1000)<br>
+
dam = (<dam> * (<tactics> + 500)) / 1000) //бонус от тактики (помним что все навыки считаются как 100.0 или 1000)
dam = (<dam> + ((<dam> * <str>) / 500)) //бонус от силы<br>
+
 
dam = (<dam> + ((<dam> * <anatomy>) / 5000)) //бонус от анатомии<br>
+
dam = (<dam> + ((<dam> * <str>) / 500)) //бонус от силы
dam = ((<dam> * (100 + (<skill> / 10))) / 200) //бонус от боевого навыка<br>
+
 
//расчет бонуса от магии или цвета оружия (см.таблицу цветов)<br>
+
dam = (<dam> + ((<dam> * <anatomy>) / 5000)) //бонус от анатомии
if <weapon.damage_plus><br>
+
 
   dam = (<dam> + <weapon.damage_plus>)<br>
+
dam = ((<dam> * (100 + (<skill> / 10))) / 200) //бонус от боевого навыка
elseif (<weapon.magic>)<br>
+
 
   dam = (<dam> + ((((<weapon.magic> / 70) + 1) * 5) / 2))<br>
+
 
endif<br>
+
//расчет бонуса от магии или цвета оружия (см.таблицу цветов)
|-
+
if <weapon.damage_plus>
|}
+
   dam = (<dam> + <weapon.damage_plus>)
 +
elseif (<weapon.magic>)
 +
   dam = (<dam> + ((((<weapon.magic> / 70) + 1) * 5) / 2))
 +
endif
  
  
Строка 23: Строка 26:
 
   dam = <dam> * 2/3
 
   dam = <dam> * 2/3
 
endif
 
endif
 +
</pre>
 +
 +
- Часть формул может быть скрыта или представлена не в том виде, в котором она существует на данный момент. Это сделано ввиду существующих коллизий. Их список возможно будет представлен позже.
 +
 +
 +
 +
=== Таблица цветов ===
 +
- параметр damage_plus / armor_plus или аналогичный параметр magic для вычисления защиты и атаки доспехов/оружия/щитов из цветных металлов
 +
 +
<pre>
 +
Плюсовое магическое оружие/доспехи (параметр magic)
 +
of Ruin +5
 +
of Might +10
 +
of Force +15
 +
of Power +20
 +
of Vanquishing +25
 +
</pre>
 +
<pre>
 +
Цветное магическое оружие/доспехи (параметр 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
 +
</pre>
 +
 +
<pre>
 +
Цветные доспехи из кожи (параметр 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
 +
</pre>
 +
 +
<pre>
 +
Цветные доспехи из высших металлов (параметр 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)
 +
</pre>
 +
 +
 +
 +
=== Расчет защиты ===
 +
 +
<pre>
 +
//выбор слоя для защиты
 +
 +
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> //повышение защиты от бонуса слоев, непосредственно не участвующих в защите (квестовые предметы)
 +
</pre>
 +
 +
 +
 +
=== Расчет парирования ===
 +
 +
<pre>
 +
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> //понижение поглощения в зависимости от повреждения щита
 +
</pre>
 +
 +
 +
 +
=== Скорость ударов ===
 +
 +
<pre>
 +
CombatAttackSpeed = 150000 / ( ( DEX + 100 ) * speed )
 +
задержка между ударами
 +
speed - характеристика оружия
 +
</pre>
 +
 +
 +
 +
=== Healing skill ===
 +
 +
<pre>
 +
//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
 +
</pre>
 +
 +
 +
 +
=== Repair skill ===
 +
 +
<pre>
 +
    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
 +
</pre>
 +
 +
 +
 +
=== 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;
  
</code>
+
    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>

Текущая версия на 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>