--- 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: