--- src/map/battle.h
int scritical_set;
int scritical_ratio_skill;
int scritical_ratio_magic;
int scritical_dmg_skill;
int scritical_dmg_magic;
--- src/map/battle.c
{ "scritical_set", &battle_config.scritical_set, 1, 0, 3, },
{ "scritical_ratio_skill", &battle_config.scritical_ratio_skill, 0, 0, 100, },
{ "scritical_ratio_magic", &battle_config.scritical_ratio_magic, 0, 0, 100, },
{ "scritical_dmg_skill", &battle_config.scritical_dmg_skill, 5000, 1, INT_MAX, },
{ "scritical_dmg_magic", &battle_config.scritical_dmg_magic, 5000, 1, INT_MAX, },
--- src/map/skill.c
//Checks if 'bl' should reflect back a spell cast by 'src'.
//type is the type of magic attack: 0: indirect (aoe), 1: direct (targetted)
int skill_magic_reflect(struct block_list* src, struct block_list* bl, int type) {
struct status_change *sc = status->get_sc(bl);
struct map_session_data* sd = BL_CAST(BL_PC, bl);
if( sc && sc->data[SC_KYOMU] ) // Nullify reflecting ability
return 0;
// item-based reflection
if( sd && sd->bonus.magic_damage_return && type && rnd()%100 < sd->bonus.magic_damage_return )
return 1;
if( is_boss(src) )
return 0;
// status-based reflection
if( !sc || sc->count == 0 )
return 0;
if( sc->data[SC_MAGICMIRROR] && rnd()%100 < sc->data[SC_MAGICMIRROR]->val2 )
return 1;
if( sc->data[SC_KAITE] && (src->type == BL_PC || status->get_lv(src) <= 80) )
{// Kaite only works against non-players if they are low-level.
clif->specialeffect(bl, 438, AREA);
if( --sc->data[SC_KAITE]->val2 <= 0 )
status_change_end(bl, SC_KAITE, INVALID_TIMER);
return 2;
}
return 0;
}
--- src/map/skill.c
case SR_FALLENEMPIRE:
if( pc->checkskill(sd, SR_TIGERCANNON) > 0 || pc->checkskill(sd, SR_GATEOFHELL) > 0 )
combo = 1;
break;
}
//scritical_set
if (battle_config.scritical_set > 0 && damage > 0 && (src->type == BL_PC || battle->get_master(src)->type == BL_PC))
{
switch (battle_config.scritical_set){
case 1:
if (skill_get_type(skill_id) == BF_WEAPON)
scri_flag = true;
break;
case 2:
if (skill_get_type(skill_id) == BF_MAGIC)
scri_flag = true;
break;
case 3:
if (skill_get_type(skill_id) == BF_MISC)
scri_flag = false;
else
scri_flag = true;
break;
default:
scri_flag = false;
break;
}
if (scri_flag = true)
{
int m_cri = 0;
if (skill_get_type(skill_id) == BF_WEAPON)
{
if (battle_config.scritical_ratio_skill > 0)
m_cri = battle_config.scritical_ratio_skill;
else
{
if (sd == NULL)
m_cri = cap_value(map->id2sd(battle->get_master(src)->id)->battle_status.cri / 10, 1, 100);
else
m_cri = cap_value(sd->battle_status.cri / 10, 1, 100);
}
if ((rnd() % 100 < m_cri) && (battle_config.scritical_dmg_skill > 0))
{
scri_flag = true;
damage += (damage * battle_config.scritical_dmg_skill) / 10000;
}
else
scri_flag = false;
}
else if (skill_get_type(skill_id) == BF_MAGIC)
{
if (battle_config.scritical_ratio_magic > 0)
m_cri = battle_config.scritical_ratio_magic;
else
{
if (sd == NULL)
m_cri = cap_value(map->id2sd(battle->get_master(src)->id)->battle_status.cri / 10, 1, 100);
else
m_cri = cap_value(sd->battle_status.cri / 10, 1, 100);
}
if ((rnd() % 100 < m_cri) && (battle_config.scritical_dmg_magic > 0))
{
scri_flag = true;
damage += (damage * battle_config.scritical_dmg_magic) / 10000;
}
else
scri_flag = false;
}
}
}
--- src/map/skill.h
/**
* Enumerations
**/
//critical_magic
int skill_mcri_hit(int tid, unsigned int tick, int _damage, intptr_t data);
int skill_mcri_kill_delay(int tid, unsigned int tick, int id, intptr_t data);
//critical_magic
//Constants to identify the skill's inf value: