diff options
Diffstat (limited to 'src/map/skill.c')
-rw-r--r-- | src/map/skill.c | 141 |
1 files changed, 67 insertions, 74 deletions
diff --git a/src/map/skill.c b/src/map/skill.c index 3669431f0..3e9817faf 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -688,7 +688,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint struct status_data *sstatus, *tstatus; struct status_change *sc, *tsc; - enum sc_type status; int temp; int rate; @@ -1074,9 +1073,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint break; case LK_JOINTBEAT: - status = iStatus->skill2sc(skill_id); if (tsc->jb_flag) { - sc_start4(bl,status,(5*skill_lv+5),skill_lv,tsc->jb_flag&BREAK_FLAGS,src->id,0,skill->get_time2(skill_id,skill_lv)); + enum sc_type type = iStatus->skill2sc(skill_id); + sc_start4(bl,type,(5*skill_lv+5),skill_lv,tsc->jb_flag&BREAK_FLAGS,src->id,0,skill->get_time2(skill_id,skill_lv)); tsc->jb_flag = 0; } break; @@ -2155,8 +2154,7 @@ int skill_magic_reflect(struct block_list* src, struct block_list* bl, int type) * flag&0x2000 is used to signal that the skill_lv should be passed as -1 to the * client (causes player characters to not scream skill name) *-------------------------------------------------------------------------*/ -int skill_attack (int attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 skill_id, uint16 skill_lv, unsigned int tick, int flag) -{ +int skill_attack (int attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 skill_id, uint16 skill_lv, unsigned int tick, int flag) { struct Damage dmg; struct status_data *sstatus, *tstatus; struct status_change *sc; @@ -2263,11 +2261,11 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds dmg.damage = battle->attr_fix(bl, bl, dmg.damage, s_ele, status_get_element(bl), status_get_element_level(bl)); if( sc && sc->data[SC_ENERGYCOAT] ) { - struct status_data *status = iStatus->get_status_data(bl); - int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval + struct status_data *st = iStatus->get_status_data(bl); + int per = 100*st->sp / st->max_sp -1; //100% should be counted as the 80~99% interval per /=20; //Uses 20% SP intervals. //SP Cost: 1% + 0.5% per every 20% SP - if (!iStatus->charge(bl, 0, (10+5*per)*status->max_sp/1000)) + if (!iStatus->charge(bl, 0, (10+5*per)*st->max_sp/1000)) status_change_end(bl, SC_ENERGYCOAT, INVALID_TIMER); //Reduction: 6% + 6% every 20% dmg.damage -= dmg.damage * (6 * (1+per)) / 100; @@ -2967,7 +2965,7 @@ int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16 skill_i * &2: picked menu entry (Warp Portal, Teleport and other menu based skills) *------------------------------------------*/ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv, int type) { - struct status_data *status; + struct status_data *st; struct map_session_data *sd = NULL; int i, hp, sp, hp_rate, sp_rate, state, mhp; uint16 idx; @@ -2983,7 +2981,7 @@ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv, case BL_MER: sd = ((TBL_MER*)bl)->master; break; } - status = iStatus->get_status_data(bl); + st = iStatus->get_status_data(bl); if( (idx = skill->get_index(skill_id)) == 0 ) return 0; @@ -2999,15 +2997,15 @@ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv, sp_rate = skill_db[idx].sp_rate[lv-1]; state = skill_db[idx].state; if( (mhp = skill_db[idx].mhp[lv-1]) > 0 ) - hp += (status->max_hp * mhp) / 100; + hp += (st->max_hp * mhp) / 100; if( hp_rate > 0 ) - hp += (status->hp * hp_rate) / 100; + hp += (st->hp * hp_rate) / 100; else - hp += (status->max_hp * (-hp_rate)) / 100; + hp += (st->max_hp * (-hp_rate)) / 100; if( sp_rate > 0 ) - sp += (status->sp * sp_rate) / 100; + sp += (st->sp * sp_rate) / 100; else - sp += (status->max_sp * (-sp_rate)) / 100; + sp += (st->max_sp * (-sp_rate)) / 100; if( bl->type == BL_HOM ) { // Intimacy Requeriments struct homun_data *hd = BL_CAST(BL_HOM, bl); @@ -3024,11 +3022,11 @@ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv, } if( !(type&2) ) { - if( hp > 0 && status->hp <= (unsigned int)hp ) { + if( hp > 0 && st->hp <= (unsigned int)hp ) { clif->skill_fail(sd, skill_id, USESKILL_FAIL_HP_INSUFFICIENT, 0); return 0; } - if( sp > 0 && status->sp <= (unsigned int)sp ) { + if( sp > 0 && st->sp <= (unsigned int)sp ) { clif->skill_fail(sd, skill_id, USESKILL_FAIL_SP_INSUFFICIENT, 0); return 0; } @@ -10497,14 +10495,13 @@ int skill_icewall_block(struct block_list *bl,va_list ap) { * Initializes and sets a ground skill. * flag&1 is used to determine when the skill 'morphs' (Warp portal becomes active, or Fire Pillar becomes active) *------------------------------------------*/ -struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill_id, uint16 skill_lv, int16 x, int16 y, int flag) -{ +struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_id, uint16 skill_lv, int16 x, int16 y, int flag) { struct skill_unit_group *group; int i,limit,val1=0,val2=0,val3=0; int target,interval,range,unit_flag,req_item=0; struct s_skill_unit_layout *layout; struct map_session_data *sd; - struct status_data *status; + struct status_data *st; struct status_change *sc; int active_flag=1; int subunt=0; @@ -10527,7 +10524,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill } sd = BL_CAST(BL_PC, src); - status = iStatus->get_status_data(src); + st = iStatus->get_status_data(src); sc = iStatus->get_sc(src); // for traps, firewall and fogwall - celest switch( skill_id ) { @@ -10652,18 +10649,18 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill case BA_DISSONANCE: case DC_UGLYDANCE: - val1 = 10; //FIXME: This value is not used anywhere, what is it for? [Skotlex] + val1 = 10; //FIXME: This value is not used anywhere, what is it for? [Skotlex] break; case BA_WHISTLE: - val1 = skill_lv +status->agi/10; // Flee increase - val2 = ((skill_lv+1)/2)+status->luk/10; // Perfect dodge increase + val1 = skill_lv +st->agi/10; // Flee increase + val2 = ((skill_lv+1)/2)+st->luk/10; // Perfect dodge increase if(sd){ val1 += pc->checkskill(sd,BA_MUSICALLESSON); val2 += pc->checkskill(sd,BA_MUSICALLESSON); } break; case DC_HUMMING: - val1 = 2*skill_lv+status->dex/10; // Hit increase + val1 = 2*skill_lv+st->dex/10; // Hit increase #ifdef RENEWAL val1 *= 2; #endif @@ -10671,9 +10668,9 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill val1 += pc->checkskill(sd,DC_DANCINGLESSON); break; case BA_POEMBRAGI: - val1 = 3*skill_lv+status->dex/10; // Casting time reduction + val1 = 3*skill_lv+st->dex/10; // Casting time reduction //For some reason at level 10 the base delay reduction is 50%. - val2 = (skill_lv<10?3*skill_lv:50)+status->int_/5; // After-cast delay reduction + val2 = (skill_lv<10?3*skill_lv:50)+st->int_/5; // After-cast delay reduction if(sd){ val1 += 2*pc->checkskill(sd,BA_MUSICALLESSON); val2 += 2*pc->checkskill(sd,BA_MUSICALLESSON); @@ -10681,11 +10678,11 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill break; case DC_DONTFORGETME: #ifdef RENEWAL - val1 = status->dex/10 + 3*skill_lv; // ASPD decrease - val2 = status->agi/10 + 2*skill_lv; // Movement speed adjustment. + val1 = st->dex/10 + 3*skill_lv; // ASPD decrease + val2 = st->agi/10 + 2*skill_lv; // Movement speed adjustment. #else - val1 = status->dex/10 + 3*skill_lv + 5; // ASPD decrease - val2 = status->agi/10 + 3*skill_lv + 5; // Movement speed adjustment. + val1 = st->dex/10 + 3*skill_lv + 5; // ASPD decrease + val2 = st->agi/10 + 3*skill_lv + 5; // Movement speed adjustment. #endif if(sd){ val1 += pc->checkskill(sd,DC_DANCINGLESSON); @@ -10693,13 +10690,13 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill } break; case BA_APPLEIDUN: - val1 = 5+2*skill_lv+status->vit/10; // MaxHP percent increase + val1 = 5+2*skill_lv+st->vit/10; // MaxHP percent increase if(sd) val1 += pc->checkskill(sd,BA_MUSICALLESSON); break; case DC_SERVICEFORYOU: - val1 = 15+skill_lv+(status->int_/10); // MaxSP percent increase TO-DO: this INT bonus value is guessed - val2 = 20+3*skill_lv+(status->int_/10); // SP cost reduction + val1 = 15+skill_lv+(st->int_/10); // MaxSP percent increase TO-DO: this INT bonus value is guessed + val2 = 20+3*skill_lv+(st->int_/10); // SP cost reduction if(sd){ val1 += pc->checkskill(sd,DC_DANCINGLESSON); //TO-DO This bonus value is guessed val2 += pc->checkskill(sd,DC_DANCINGLESSON); //TO-DO Should be half this value @@ -10707,17 +10704,17 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill break; case BA_ASSASSINCROSS: #ifdef RENEWAL - val1 = 10 + skill_lv + (status->agi/10); // ASPD increase + val1 = 10 + skill_lv + (st->agi/10); // ASPD increase if(sd) val1 += 4*pc->checkskill(sd,BA_MUSICALLESSON); #else - val1 = 100+(10*skill_lv)+(status->agi/10); // ASPD increase + val1 = 100+(10*skill_lv)+(st->agi/10); // ASPD increase if(sd) val1 += 5*pc->checkskill(sd,BA_MUSICALLESSON); #endif break; case DC_FORTUNEKISS: - val1 = 10+skill_lv+(status->luk/10); // Critical increase + val1 = 10+skill_lv+(st->luk/10); // Critical increase if(sd) val1 += pc->checkskill(sd,DC_DANCINGLESSON); val1*=10; //Because every 10 crit is an actual cri point. @@ -10765,7 +10762,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill { int element[5]={ELE_WIND,ELE_DARK,ELE_POISON,ELE_WATER,ELE_FIRE}; - val1 = status->rhw.ele; + val1 = st->rhw.ele; if (!val1) val1=element[rnd()%5]; @@ -12334,7 +12331,7 @@ int skill_isammotype (struct map_session_data *sd, int skill_id) } int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) { - struct status_data *status; + struct status_data *st; struct status_change *sc; struct skill_condition require; int i; @@ -12370,7 +12367,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id return 0; break; } - status = &sd->battle_status; + st = &sd->battle_status; sc = &sd->sc; if( !sc->count ) sc = NULL; @@ -12695,9 +12692,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id break; //Auron insists we should implement SP consumption when you are not Soul Linked. [Skotlex] //Only invoke on skill begin cast (instant cast skill). [Kevin] - if( require.sp > 0 ) - { - if (status->sp < (unsigned int)require.sp) + if( require.sp > 0 ) { + if (st->sp < (unsigned int)require.sp) clif->skill_fail(sd,skill_id,USESKILL_FAIL_SP_INSUFFICIENT,0); else status_zap(&sd->bl, 0, require.sp); @@ -12725,9 +12721,9 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id case NJ_ISSEN: #ifdef RENEWAL - if (status->hp < (status->hp/100)) { + if (st->hp < (st->hp/100)) { #else - if (status->hp < 2) { + if (st->hp < 2) { #endif clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return 0; @@ -12747,7 +12743,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id } break; case PF_HPCONVERSION: - if (status->sp == status->max_sp) + if (st->sp == st->max_sp) return 0; //Unusable when at full SP. break; case AM_CALLHOMUN: //Can't summon if a hom is already out @@ -13162,7 +13158,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id break; } - if(require.mhp > 0 && get_percentage(status->hp, status->max_hp) > require.mhp) { + if(require.mhp > 0 && get_percentage(st->hp, st->max_hp) > require.mhp) { //mhp is the max-hp-requirement, that is, //you must have this % or less of HP to cast it. clif->skill_fail(sd,skill_id,USESKILL_FAIL_HP_INSUFFICIENT,0); @@ -13174,7 +13170,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id return 0; } - if( require.sp > 0 && status->sp < (unsigned int)require.sp) { + if( require.sp > 0 && st->sp < (unsigned int)require.sp) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_SP_INSUFFICIENT,0); return 0; } @@ -13216,10 +13212,9 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id return 1; } -int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) -{ +int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) { struct skill_condition require; - struct status_data *status; + struct status_data *st; int i; int index[MAX_SKILL_ITEM_REQUIRE]; @@ -13322,11 +13317,11 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, break; } - status = &sd->battle_status; + st = &sd->battle_status; require = skill->get_requirement(sd,skill_id,skill_lv); - if( require.hp > 0 && status->hp <= (unsigned int)require.hp) { + if( require.hp > 0 && st->hp <= (unsigned int)require.hp) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_HP_INSUFFICIENT,0); return 0; } @@ -13489,10 +13484,9 @@ int skill_consume_requirement( struct map_session_data *sd, uint16 skill_id, uin return 1; } -struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) -{ +struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16 skill_id, uint16 skill_lv) { struct skill_condition req; - struct status_data *status; + struct status_data *st; struct status_change *sc; int i,hp_rate,sp_rate, sp_skill_rate_bonus = 100; uint16 idx; @@ -13528,23 +13522,23 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16 if( skill_lv < 1 || skill_lv > MAX_SKILL_LEVEL ) return req; - status = &sd->battle_status; + st = &sd->battle_status; req.hp = skill_db[idx].hp[skill_lv-1]; hp_rate = skill_db[idx].hp_rate[skill_lv-1]; if(hp_rate > 0) - req.hp += (status->hp * hp_rate)/100; + req.hp += (st->hp * hp_rate)/100; else - req.hp += (status->max_hp * (-hp_rate))/100; + req.hp += (st->max_hp * (-hp_rate))/100; req.sp = skill_db[idx].sp[skill_lv-1]; if((sd->skill_id_old == BD_ENCORE) && skill_id == sd->skill_id_dance) req.sp /= 2; sp_rate = skill_db[idx].sp_rate[skill_lv-1]; if(sp_rate > 0) - req.sp += (status->sp * sp_rate)/100; + req.sp += (st->sp * sp_rate)/100; else - req.sp += (status->max_sp * (-sp_rate))/100; + req.sp += (st->max_sp * (-sp_rate))/100; if( sd->dsprate != 100 ) req.sp = req.sp * sd->dsprate / 100; @@ -16018,16 +16012,15 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger, /*========================================== * *------------------------------------------*/ -int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, int slot1, int slot2, int slot3, int qty) -{ +int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid, int slot1, int slot2, int slot3, int qty) { int slot[3]; int i,sc,ele,idx,equip,wlv,make_per = 0,flag = 0,skill_lv = 0; int num = -1; // exclude the recipe - struct status_data *status; + struct status_data *st; struct item_data* data; nullpo_ret(sd); - status = iStatus->get_status_data(&sd->bl); + st = iStatus->get_status_data(&sd->bl); if( sd->skill_id_old == skill_id ) skill_lv = sd->skill_lv_old; @@ -16125,7 +16118,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, case BS_ENCHANTEDSTONE: // Ores & Metals Refining - skill bonuses are straight from kRO website [DracoRPG] i = pc->checkskill(sd,skill_id); - make_per = sd->status.job_level*20 + status->dex*10 + status->luk*10; //Base chance + make_per = sd->status.job_level*20 + st->dex*10 + st->luk*10; //Base chance switch(nameid){ case 998: // Iron make_per += 4000+i*500; // Temper Iron bonus: +26/+32/+38/+44/+50 @@ -16142,7 +16135,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, } break; case ASC_CDP: - make_per = (2000 + 40*status->dex + 20*status->luk); + make_per = (2000 + 40*st->dex + 20*st->luk); break; case AL_HOLYWATER: /** @@ -16157,7 +16150,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, case AM_TWILIGHT3: make_per = pc->checkskill(sd,AM_LEARNINGPOTION)*50 + pc->checkskill(sd,AM_PHARMACY)*300 + sd->status.job_level*20 - + (status->int_/2)*10 + status->dex*10+status->luk*10; + + (st->int_/2)*10 + st->dex*10+st->luk*10; if(homun_alive(sd->hd)) {//Player got a homun int skill2_lv; if((skill2_lv=homun->checkskill(sd->hd,HVAN_INSTRUCT)) > 0) //His homun is a vanil with instruction change @@ -16205,7 +16198,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, case RK_RUNEMASTERY: { int A = 5100 + 200 * pc->checkskill(sd, skill_id); - int B = 10 * status->dex / 3 + (status->luk + sd->status.job_level); + int B = 10 * st->dex / 3 + (st->luk + sd->status.job_level); int C = 100 * cap_value(sd->itemid,0,100); //itemid depend on makerune() int D = 2500; switch (nameid) { //rune rank it_diff 9 craftable rune @@ -16252,7 +16245,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, difficulty = (620 - 20 * skill_lv);// (620 - 20 * Skill Level) - make_per = status->int_ + status->dex/2 + status->luk + sd->status.job_level + (30+rnd()%120) + // (Caster?s INT) + (Caster?s DEX / 2) + (Caster?s LUK) + (Caster?s Job Level) + Random number between (30 ~ 150) + + make_per = st->int_ + st->dex/2 + st->luk + sd->status.job_level + (30+rnd()%120) + // (Caster?s INT) + (Caster?s DEX / 2) + (Caster?s LUK) + (Caster?s Job Level) + Random number between (30 ~ 150) + (sd->status.base_level-100) + pc->checkskill(sd, AM_LEARNINGPOTION) + pc->checkskill(sd, CR_FULLPROTECTION)*(4+rnd()%6); // (Caster?s Base Level - 100) + (Potion Research x 5) + (Full Chemical Protection Skill Level) x (Random number between 4 ~ 10) switch(nameid){// difficulty factor @@ -16294,7 +16287,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, { int difficulty = 30 + rnd()%120; // Random number between (30 ~ 150) - make_per = sd->status.job_level / 4 + status->luk / 2 + status->dex / 3; // (Caster?s Job Level / 4) + (Caster?s LUK / 2) + (Caster?s DEX / 3) + make_per = sd->status.job_level / 4 + st->luk / 2 + st->dex / 3; // (Caster?s Job Level / 4) + (Caster?s LUK / 2) + (Caster?s DEX / 3) qty = ~(5 + rnd()%5) + 1; switch(nameid){// difficulty factor @@ -16342,10 +16335,10 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, else make_per = 1200 * (sd->menuskill_val - 10) + 20 * (sd->status.base_level + 1) - + 20 * (status->dex + 1) + + 20 * (st->dex + 1) + 100 * (rnd()%(30+5*(sd->cook_mastery/400) - (6+sd->cook_mastery/80)) + (6+sd->cook_mastery/80)) - 400 * (skill_produce_db[idx].itemlv - 11 + 1) - - 10 * (100 - status->luk + 1) + - 10 * (100 - st->luk + 1) - 500 * (num - 1) - 100 * (rnd()%4 + 1); break; @@ -16354,7 +16347,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, break; } } else { // Weapon Forging - skill bonuses are straight from kRO website, other things from a jRO calculator [DracoRPG] - make_per = 5000 + sd->status.job_level*20 + status->dex*10 + status->luk*10; // Base + make_per = 5000 + sd->status.job_level*20 + st->dex*10 + st->luk*10; // Base make_per += pc->checkskill(sd,skill_id)*500; // Smithing skills bonus: +5/+10/+15 make_per += pc->checkskill(sd,BS_WEAPONRESEARCH)*100 +((wlv >= 3)? pc->checkskill(sd,BS_ORIDEOCON)*100:0); // Weaponry Research bonus: +1/+2/+3/+4/+5/+6/+7/+8/+9/+10, Oridecon Research bonus (custom): +1/+2/+3/+4/+5 make_per -= (ele?2000:0) + sc*1500 + (wlv>1?wlv*1000:0); // Element Stone: -20%, Star Crumb: -15% each, Weapon level malus: -0/-20/-30 |