Originally posted by [b]PanA[/b]
http://www.eathena.ws/board/index.php?autocom=bugtracker&showbug=2480
Don't Forget Me - Small Aspd decrease
http://irowiki.org/wiki/Slow_GraceStable:
http://svn.eathena.ws/bugs/changeset/13032...src/map/skill.cFrom trunk:
http://svn.eathena.ws/bugs/changeset/12923...src/map/skill.cIn skill.c
This code create song fild with parameters:
CODE
case DC_DONTFORGETME:
val1 = status->dex/10 + 3*skilllv + 5; // ASPD decrease
val2 = status->agi/10 + 3*skilllv + 5; // Movement speed adjustment.
if(sd){
val1 += pc_checkskill(sd,DC_DANCINGLESSON);
val2 += pc_checkskill(sd,DC_DANCINGLESSON);
}
break;
This code starts a status change:
CODE
case UNT_DONTFORGETME:
case UNT_FORTUNEKISS:
case UNT_SERVICEFORYOU:
if (sg->src_id==bl->id && !(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER))
return 0;
if (!sc) return 0;
if (!sce)
sc_start4(bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit);
else if (sce->val4 == 1) {
//Readjust timers since the effect will not last long.
sce->val4 = 0;
delete_timer(sce->timer, status_change_timer);
sce->timer = add_timer(tick+sg->limit, status_change_timer, bl->id, type);
}
break;
Status parameters:
val1 = sg->skill_lv = 10
val2 = sg->val1 = status->dex/10 + 3*skilllv + 5 + pc_checkskill(sd,DC_DANCINGLESSON); // ASPD decrease
val3 = sg->val2 = status->agi/10 + 3*skilllv + 5 + pc_checkskill(sd,DC_DANCINGLESSON); // Movement speed adjustment.
In status.c
CODE
if(sc->data[SC_DONTFORGETME])
aspd_rate += sc->data[SC_DONTFORGETME]->val2;
10 point is 1% aspd decrease.
So val2 is 0.1*status->dex/10 + 0.3*skilllv + 0.5 + 0.1*pc_checkskill(sd,DC_DANCINGLESSON) % aspd decrease.
What is it?
100 dex is just 1% aspd decrease.
Like in skill.c with BA_ASSASSINCROSS:
CODE
case BA_ASSASSINCROSS:
val1 = 100+10*skilllv+status->agi; // ASPD increase
if(sd)
val1 += 5*pc_checkskill(sd,BA_MUSICALLESSON);
break;
Aspd increase: 10+skilllv+0.1*status->agi + 0.5*pc_checkskill(sd,BA_MUSICALLESSON) %
To Fix it:
In skill.c should be:
CODE
case DC_DONTFORGETME:
val1 = status->dex/10 + 3*skilllv + 5; // ASPD decrease
val2 = status->agi/10 + 3*skilllv + 5; // Movement speed adjustment.
if(sd){
val1 += pc_checkskill(sd,DC_DANCINGLESSON);
val2 += pc_checkskill(sd,DC_DANCINGLESSON);
}
val1*=10; //Because every 10 point is 1% aspd decrease.
break;
case BA_ASSASSINCROSS:
val1 = 10*(10+skilllv+status->agi/10); // ASPD increase
if(sd)
val1 += 5*pc_checkskill(sd,BA_MUSICALLESSON);
break;
About assasincross:
True statement:
Every 10 agi gives 1% aspd increase.
False statement:
Every 1 agi gives 0.1% aspd increase.
Correspond to
http://irowiki.org/wiki/Impressive_Riff should be:
CODE
case BA_ASSASSINCROSS:
val1 = 10+skilllv+status->agi/10; // ASPD increase
if(sd)
val1 += (1+pc_checkskill(sd,BA_MUSICALLESSON))/2;
val1*=10 //Because every 10 point is 1% aspd increase.
break;
Excuse me for my English.