Adjusted Free Cast code so that its walk penalty gets calculated in status_calc_speed and nowhere else.
Removed aspd penalty from Free Cast since tests show it's not there, even though RO sites claim it is. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12904 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
901d311735
commit
8d6505fdee
@ -4,8 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
|
||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||
|
||||
2008/07/03
|
||||
* Removed aspd penalty from Free Cast since tests show it's not there,
|
||||
even though RO sites claim it is
|
||||
* Adjusted Free Cast code so that its walk penalty gets calculated in
|
||||
status_calc_speed and nowhere else [ultramage]
|
||||
* Fixes regarding bugreport:1727 (undead element/race skill behaviors) follow up on revisions r12820 r12821 and r12822 [Brainstorm]
|
||||
|
||||
2008/06/24
|
||||
* Rev. 12891 Increased Item group limit for new item groups. [L0ne_W0lf]
|
||||
2008/06/23
|
||||
|
@ -141,7 +141,6 @@ struct map_session_data {
|
||||
int cart_weight,cart_num;
|
||||
int fd;
|
||||
unsigned short mapindex;
|
||||
unsigned short prev_speed,prev_adelay;
|
||||
unsigned char head_dir; //0: Look forward. 1: Look right, 2: Look left.
|
||||
unsigned int client_tick;
|
||||
int npc_id,areanpc_id,npc_shopid;
|
||||
|
@ -5241,15 +5241,21 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(ud->skillid != SA_CASTCANCEL ) {
|
||||
if(ud->skillid != SA_CASTCANCEL )
|
||||
{// otherwise handled in unit_skillcastcancel()
|
||||
if( ud->skilltimer != tid ) {
|
||||
ShowError("skill_castend_id: Timer mismatch %d!=%d!\n", ud->skilltimer, tid);
|
||||
ud->skilltimer = -1;
|
||||
return 0;
|
||||
}
|
||||
if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST))
|
||||
status_freecast_switch(sd);
|
||||
ud->skilltimer=-1;
|
||||
|
||||
if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
{// restore original walk speed
|
||||
ud->skilltimer = -1;
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
}
|
||||
|
||||
ud->skilltimer = -1;
|
||||
}
|
||||
|
||||
if (ud->skilltarget == id)
|
||||
@ -5473,10 +5479,13 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST))
|
||||
status_freecast_switch(sd);
|
||||
|
||||
if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
{// restore original walk speed
|
||||
ud->skilltimer=-1;
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
}
|
||||
ud->skilltimer=-1;
|
||||
|
||||
do {
|
||||
if(status_isdead(src))
|
||||
break;
|
||||
|
@ -1193,8 +1193,6 @@ int status_check_visibility(struct block_list *src, struct block_list *target)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void status_calc_bl(struct block_list *bl, unsigned long flag);
|
||||
|
||||
// Basic ASPD value
|
||||
int status_base_amotion_pc(struct map_session_data* sd, struct status_data* status)
|
||||
{
|
||||
@ -2741,17 +2739,8 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
|
||||
if(flag&SCB_SPEED) {
|
||||
if(status->speed < battle_config.max_walk_speed)
|
||||
status->speed = battle_config.max_walk_speed;
|
||||
|
||||
if ((skill=pc_checkskill(sd,SA_FREECAST))>0) {
|
||||
//Store casting walk speed for quick restoration. [Skotlex]
|
||||
sd->prev_speed = status->speed * (175-5*skill)/100;
|
||||
if(sd->ud.skilltimer != -1) { //Swap speed.
|
||||
skill = status->speed;
|
||||
status->speed = sd->prev_speed;
|
||||
sd->prev_speed = skill;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(flag&(SCB_ASPD|SCB_AGI|SCB_DEX)) {
|
||||
flag|=SCB_ASPD;
|
||||
|
||||
@ -2763,18 +2752,7 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
|
||||
skill = skill *status->aspd_rate/1000;
|
||||
|
||||
status->amotion = cap_value(skill,battle_config.max_aspd,2000);
|
||||
|
||||
status->adelay = 2*status->amotion;
|
||||
if ((skill=pc_checkskill(sd,SA_FREECAST))>0) {
|
||||
//Store casting adelay for quick restoration. [Skotlex]
|
||||
sd->prev_adelay = status->adelay*(150-5*skill)/100;
|
||||
if(sd->ud.skilltimer != -1) { //Swap adelay.
|
||||
skill = status->adelay;
|
||||
status->adelay = sd->prev_adelay;
|
||||
sd->prev_adelay = skill;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(flag&(SCB_AGI|SCB_DSPD)) {
|
||||
@ -3699,10 +3677,15 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang
|
||||
|
||||
static unsigned short status_calc_speed(struct block_list *bl, struct status_change *sc, int speed)
|
||||
{
|
||||
TBL_PC* sd = BL_CAST(BL_PC, bl);
|
||||
|
||||
//Default speed coming in means there's no speed_rate adjustments.
|
||||
int new_speed = speed;
|
||||
bool default_speed = (speed == DEFAULT_WALK_SPEED);
|
||||
|
||||
if( sd && sd->ud.skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
speed = speed * (175 - 5 * pc_checkskill(sd,SA_FREECAST))/100;
|
||||
|
||||
if(!sc || !sc->count)
|
||||
return cap_value(speed,10,USHRT_MAX);
|
||||
|
||||
@ -4015,30 +3998,6 @@ static unsigned short status_calc_mode(struct block_list *bl, struct status_chan
|
||||
return cap_value(mode,0,USHRT_MAX);
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Quick swap of adelay/speed when starting ending SA_FREECAST
|
||||
*------------------------------------------*/
|
||||
void status_freecast_switch(struct map_session_data *sd)
|
||||
{
|
||||
struct status_data *status;
|
||||
unsigned short b_speed,tmp;
|
||||
|
||||
status = &sd->battle_status;
|
||||
|
||||
b_speed = status->speed;
|
||||
|
||||
tmp = status->speed;
|
||||
status->speed = sd->prev_speed;
|
||||
sd->prev_speed = tmp;
|
||||
|
||||
tmp = status->adelay;
|
||||
status->adelay = sd->prev_adelay;
|
||||
sd->prev_adelay = tmp;
|
||||
|
||||
if(b_speed != status->speed)
|
||||
clif_updatestatus(sd,SP_SPEED);
|
||||
}
|
||||
|
||||
const char* status_get_name(struct block_list *bl)
|
||||
{
|
||||
nullpo_retr(0, bl);
|
||||
|
@ -806,7 +806,6 @@ void status_calc_misc(struct block_list *bl, struct status_data *status, int lev
|
||||
void status_calc_regen(struct block_list *bl, struct status_data *status, struct regen_data *regen);
|
||||
void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, struct status_change *sc);
|
||||
|
||||
void status_freecast_switch(struct map_session_data *sd);
|
||||
int status_getrefinebonus(int lv,int type);
|
||||
int status_check_skilluse(struct block_list *src, struct block_list *target, int skill_num, int flag); // [Skotlex]
|
||||
int status_check_visibility(struct block_list *src, struct block_list *target); //[Skotlex]
|
||||
|
@ -1086,8 +1086,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, short skill_num, sh
|
||||
|
||||
if(casttime > 0) {
|
||||
ud->skilltimer = add_timer( tick+casttime, skill_castend_id, src->id, 0 );
|
||||
if(sd && pc_checkskill(sd,SA_FREECAST))
|
||||
status_freecast_switch(sd);
|
||||
if( sd && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
else
|
||||
unit_stop_walking(src,1);
|
||||
}
|
||||
@ -1187,8 +1187,8 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, sh
|
||||
|
||||
if(casttime > 0) {
|
||||
ud->skilltimer = add_timer( tick+casttime, skill_castend_pos, src->id, 0 );
|
||||
if(sd && pc_checkskill(sd,SA_FREECAST))
|
||||
status_freecast_switch(sd);
|
||||
if( sd && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
else
|
||||
unit_stop_walking(src,1);
|
||||
}
|
||||
@ -1520,9 +1520,11 @@ int unit_skillcastcancel(struct block_list *bl,int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ud->canact_tick=tick;
|
||||
if(sd && pc_checkskill(sd,SA_FREECAST))
|
||||
status_freecast_switch(sd);
|
||||
ud->canact_tick = tick;
|
||||
ud->skilltimer = -1;
|
||||
|
||||
if( sd && pc_checkskill(sd,SA_FREECAST) > 0 )
|
||||
status_calc_bl(&sd->bl, SCB_SPEED);
|
||||
|
||||
if(type&1 && sd)
|
||||
skill = sd->skillid_old;
|
||||
@ -1538,7 +1540,6 @@ int unit_skillcastcancel(struct block_list *bl,int type)
|
||||
|
||||
if(bl->type==BL_MOB) ((TBL_MOB*)bl)->skillidx = -1;
|
||||
|
||||
ud->skilltimer = -1;
|
||||
clif_skillcastcancel(bl);
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user