Issue information

Issue ID
#2480
Status
Fixed
Severity
None
Started
Hercules Elf Bot
Nov 24, 2008 10:19
Last Post
Hercules Elf Bot
Mar 5, 2012 16:50
Confirmation
N/A

Hercules Elf Bot - Nov 24, 2008 10:19

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_Grace

Stable:
http://svn.eathena.ws/bugs/changeset/13032...src/map/skill.c
From trunk:
http://svn.eathena.ws/bugs/changeset/12923...src/map/skill.c

In 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.