Official song and dance formulas (fixes #1808)

* Fixed musical lessons not having any effect on Song of Lutie's MaxHP bonus (lesson/2)
* Song of Lutie now heals 1 HP more every 2 vit instead of 5 HP more every 10 vit
* Perfect Tablature's flee bonus in renewal is now 3*skill_lv + agi/15 + lesson/2
* Perfect Tablature's perfect dodge bonus is now (skill_lv+1)/2 + luk/30 + lesson/5
* Focus Ballet's hit bonus in renewal is now 20 + 2*skill_lv + dex/15 + lesson
* Focus Ballet's hit bonus in pre-re is now 1 + 2*skill_lv + dex/10 + lesson
* Slow Grace's ASPD decrease in renewal is now 3*skill_lv + dex/15 + lesson
* Slow Grace's ASPD decrease in pre-re is now 5 + 3*skill_lv + dex/10 + lesson
* Slow Grace's speed decrease in renewal is now 2*skill_lv + agi/20 + lesson/2
* Slow Grace's speed decrease in pre-re is now 5 + 3*skill_lv + agi/10 + lesson
* Impressive Riff's ASPD increase in pre-re is now 5 + skill_lv + agi/20 + lesson/2
* Lady Luck's critical bonus is now 10 + skill_lv + luk/10 + 0.5*lesson (not rounded down)
This commit is contained in:
Playtester 2016-12-20 22:17:52 +01:00
parent 08812e0523
commit 182557311b
2 changed files with 54 additions and 36 deletions

View File

@ -443,12 +443,12 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
switch( skill_id ) {
case BA_APPLEIDUN:
#ifdef RENEWAL
hp = 100 + 5 * skill_lv + 5 * (status_get_vit(src) / 10); // HP recovery
hp = 100 + 5 * skill_lv + (status_get_vit(src) / 2); // HP recovery
#else
hp = 30 + 5 * skill_lv + 5 * (status_get_vit(src) / 10); // HP recovery
hp = 30 + 5 * skill_lv + (status_get_vit(src) / 2); // HP recovery
#endif
if( sd )
hp += 5 * pc_checkskill(sd,BA_MUSICALLESSON);
if (sd)
hp += 5 * pc_checkskill(sd, BA_MUSICALLESSON);
break;
case PR_SANCTUARY:
hp = (skill_lv > 6) ? 777 : skill_lv * 100;
@ -12628,61 +12628,76 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
}
case BA_WHISTLE:
val1 = skill_lv +status->agi/10; // Flee increase
val2 = ((skill_lv+1)/2)+status->luk/10; // Perfect dodge increase
if(sd){
val1 += pc_checkskill(sd,BA_MUSICALLESSON);
val2 += pc_checkskill(sd,BA_MUSICALLESSON);
#ifdef RENEWAL
val1 = 3 * skill_lv + status->agi / 15; // Flee increase
#else
val1 = skill_lv + status->agi / 10; // Flee increase
#endif
val2 = (skill_lv + 1) / 2 + status->luk / 30; // Perfect dodge increase
if (sd) {
val1 += pc_checkskill(sd, BA_MUSICALLESSON) / 2;
val2 += pc_checkskill(sd, BA_MUSICALLESSON) / 5;
}
break;
case DC_HUMMING:
val1 = 2*skill_lv+status->dex/10; // Hit increase
#ifdef RENEWAL
val1 *= 2;
val1 = 20 + 2 * skill_lv + status->dex / 15; // Hit increase
#else
val1 = 1 + 2 * skill_lv + status->dex / 10; // Hit increase
#endif
if(sd)
val1 += pc_checkskill(sd,DC_DANCINGLESSON);
if (sd)
val1 += pc_checkskill(sd, DC_DANCINGLESSON);
break;
case BA_POEMBRAGI:
val1 = 3*skill_lv+status->dex/10; // Casting time reduction
val1 = 3 * skill_lv + status->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
if(sd){
val1 += pc_checkskill(sd,BA_MUSICALLESSON);
val2 += 2*pc_checkskill(sd,BA_MUSICALLESSON);
val2 = (skill_lv < 10 ? 3 * skill_lv : 50) + status->int_ / 5; // After-cast delay reduction
if (sd) {
val1 += pc_checkskill(sd, BA_MUSICALLESSON);
val2 += 2 * pc_checkskill(sd, BA_MUSICALLESSON);
}
break;
case DC_DONTFORGETME:
val1 = 30 * skill_lv + status->dex; // ASPD decrease
val2 = 2 * skill_lv + status->agi / 10; // Movement speed adjustment.
if(sd){
val1 += 10 * pc_checkskill(sd,DC_DANCINGLESSON);
val2 += (pc_checkskill(sd,DC_DANCINGLESSON) + 1) / 2; // Movement speed -1% per 2 levels
#ifdef RENEWAL
val1 = 3 * skill_lv + status->dex / 15; // ASPD decrease
val2 = 2 * skill_lv + status->agi / 20; // Movement speed adjustment.
#else
val1 = 5 + 3 * skill_lv + status->dex / 10; // ASPD decrease
val2 = 5 + 3 * skill_lv + status->agi / 10; // Movement speed adjustment.
#endif
if (sd) {
val1 += pc_checkskill(sd, DC_DANCINGLESSON);
#ifdef RENEWAL
val2 += pc_checkskill(sd, DC_DANCINGLESSON) / 2;
#else
val2 += pc_checkskill(sd, DC_DANCINGLESSON);
#endif
}
val1 *= 10; //Because 10 is actually 1% aspd
break;
case DC_SERVICEFORYOU:
val1 = 15+skill_lv+(status->int_/10); // MaxSP percent increase
val2 = 20+3*skill_lv+(status->int_/10); // SP cost reduction
if(sd){
val1 += pc_checkskill(sd,DC_DANCINGLESSON)/2;
val2 += pc_checkskill(sd,DC_DANCINGLESSON)/2;
val1 = 15 + skill_lv + (status->int_ / 10); // MaxSP percent increase
val2 = 20 + 3 * skill_lv + (status->int_ / 10); // SP cost reduction
if (sd) {
val1 += pc_checkskill(sd, DC_DANCINGLESSON) / 2;
val2 += pc_checkskill(sd, DC_DANCINGLESSON) / 2;
}
break;
case BA_ASSASSINCROSS:
if (sd)
val1 = pc_checkskill(sd,BA_MUSICALLESSON) / 2;
val1 = pc_checkskill(sd, BA_MUSICALLESSON) / 2;
#ifdef RENEWAL // ASPD increase
val1 += skill_lv + (status->agi / 20);
#else
val1 += 10 + skill_lv + (status->agi / 10);
val1 += 5 + skill_lv + (status->agi / 20);
val1 *= 10; // ASPD works with 1000 as 100%
#endif
break;
case DC_FORTUNEKISS:
val1 = 10+skill_lv+(status->luk/10); // Critical increase
if(sd)
val1 += pc_checkskill(sd,DC_DANCINGLESSON);
val1*=10; //Because every 10 crit is an actual cri point.
val1 = 10 + skill_lv + (status->luk / 10); // Critical increase
val1 *= 10; //Because every 10 crit is an actual cri point.
if (sd)
val1 += 5 * pc_checkskill(sd, DC_DANCINGLESSON);
break;
case BD_DRUMBATTLEFIELD:
#ifdef RENEWAL

View File

@ -10637,10 +10637,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val1 = MOBID_PORING; // Default poring
break;
case SC_APPLEIDUN:
{
struct map_session_data * s_sd = BL_CAST(BL_PC, src);
val2 = (5 + 2 * val1) + (status_get_vit(src) / 10); //HP Rate: (5 + 2 * skill_lv) + (vit/10) + (BA_MUSICALLESSON level)
if (sd)
val2 += pc_checkskill(sd,BA_MUSICALLESSON);
if (s_sd)
val2 += pc_checkskill(s_sd, BA_MUSICALLESSON) / 2;
break;
}
case SC_EPICLESIS:
val2 = 5 * val1; //HP rate bonus
break;