From ea497b2938e51a526438f78aa6fc4de43af5cc23 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 23 Oct 2015 13:03:23 -0400 Subject: [PATCH] Partial revert of ce7aacb * Added job, skill, and item stat bonuses back into base status. * Adjusted specific skills that used base stats to use info stored in mmo_charstatus. * Fixes #713 - Resolved issue with atcommand 'speed' not adjusting player's movement speed. --- src/map/battle.c | 6 +-- src/map/skill.c | 9 ++--- src/map/status.c | 97 ++++++++++++++++++------------------------------ 3 files changed, 42 insertions(+), 70 deletions(-) diff --git a/src/map/battle.c b/src/map/battle.c index 1ca53161fb..e3edc19239 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4014,10 +4014,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s break; case GN_CART_TORNADO: { // ATK [( Skill Level x 50 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] % skillratio += -100 + 50 * skill_lv; - if(sd && sd->cart_weight) { - int strbonus = status_get_base_status(src)->str; // Only use base STR - skillratio += sd->cart_weight / 10 / (150 - min(strbonus,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; - } + if(sd && sd->cart_weight) + skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; } break; case GN_CARTCANNON: diff --git a/src/map/skill.c b/src/map/skill.c index 29da398230..f945b0570b 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -9898,9 +9898,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { // Success chance: [(15 + 5 * Skill Level) + ( Caster's INT / 5 ) + ( Caster's Job Level / 5 ) - ( Target's INT / 6 ) - ( Target's LUK / 10 )] % int rate = (15 + 5 * skill_lv) * 1000 + status_get_int(src) * 200 + (sd ? sd->status.job_level * 200 : 0) - status_get_int(bl) * 1000 / 6 - status_get_luk(bl) * 100; - struct status_data *bstatus = status_get_base_status(bl); // Resistance: {(Target's Base Level / 20) + (Target's Base INT / 40)} seconds - int duration = skill_get_time(skill_id, skill_lv) - (status_get_lv(bl) * 50 + bstatus->int_ * 25); + int duration = skill_get_time(skill_id, skill_lv) - (status_get_lv(bl) * 50 + (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 25); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); status_change_start(src,bl,type,rate,skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance } @@ -9908,12 +9907,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case WM_LULLABY_DEEPSLEEP: if (flag&1) { - struct status_data *bstatus = status_get_base_status(bl); // Resistance: {(Target's Base Level / 20) + (Target's Base INT / 20)} seconds - int duration = skill_area_temp[6] - (status_get_lv(bl) * 50 + bstatus->int_ * 50); + int duration = skill_area_temp[6] - (status_get_lv(bl) * 50 + (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 50); status_change_start(src,bl,type,skill_area_temp[5],skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance - } - else { + } else { // Success chance: [(Skill Level x 4) + (Voice Lessons Skill Level x 2) + (Caster's Base Level / 15) + (Caster's Job Level / 5)] % skill_area_temp[5] = (4 * skill_lv * 1000) + ((sd) ? pc_checkskill(sd,WM_LESSON) : skill_get_max(WM_LESSON)) * 2000 + (status_get_lv(src) * 1000 / 15) + (sd ? sd->status.job_level * 200 : 0); skill_area_temp[6] = skill_get_time(skill_id,skill_lv); diff --git a/src/map/status.c b/src/map/status.c index 81225b0c67..df2c0272e1 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2955,7 +2955,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) { static int calculating = 0; ///< Check for recursive call preemption. [Skotlex] struct status_data *base_status; ///< Pointer to the player's base status - short bStr = 0, bAgi = 0, bVit = 0, bInt_ = 0, bDex = 0, bLuk = 0; ///< Stat addition to the player's battle status const struct status_change *sc = &sd->sc; struct s_skill b_skill[MAX_SKILL]; ///< Previous skill tree int b_weight, b_max_weight, b_cart_weight_max, ///< Previous weight @@ -3363,62 +3362,54 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) // ----- STATS CALCULATION ----- - // Untouched Base Stats - base_status->str = sd->status.str; - base_status->agi = sd->status.agi; - base_status->vit = sd->status.vit; - base_status->int_ = sd->status.int_; - base_status->dex = sd->status.dex; - base_status->luk = sd->status.luk; - // Job bonuses index = pc_class2idx(sd->status.class_); for(i=0;i<(int)sd->status.job_level && istr++; break; + case 2: base_status->agi++; break; + case 3: base_status->vit++; break; + case 4: base_status->int_++; break; + case 5: base_status->dex++; break; + case 6: base_status->luk++; break; } } // If a Super Novice has never died and is at least joblv 70, he gets all stats +10 if(((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && (sd->status.job_level >= 70 || sd->class_&JOBL_THIRD)) && sd->die_counter == 0) { - bStr += 10; - bAgi += 10; - bVit += 10; - bInt_+= 10; - bDex += 10; - bLuk += 10; + base_status->str += 10; + base_status->agi += 10; + base_status->vit += 10; + base_status->int_+= 10; + base_status->dex += 10; + base_status->luk += 10; } // Absolute modifiers from passive skills if(pc_checkskill(sd,BS_HILTBINDING)>0) - bStr++; + base_status->str++; if((skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0) - bInt_ += (skill+1)/2; // +1 INT / 2 lv + base_status->int_ += (skill+1)/2; // +1 INT / 2 lv if((skill=pc_checkskill(sd,AC_OWL))>0) - bDex += skill; + base_status->dex += skill; if((skill = pc_checkskill(sd,RA_RESEARCHTRAP))>0) - bInt_ += skill; + base_status->int_ += skill; - // Bonuses from cards and equipment, remember to avoid overflows. - i = bStr + sd->param_bonus[0] + sd->param_equip[0]; - bStr = cap_value(i,0,USHRT_MAX); - i = bAgi + sd->param_bonus[1] + sd->param_equip[1]; - bAgi = cap_value(i,0,USHRT_MAX); - i = bVit + sd->param_bonus[2] + sd->param_equip[2]; - bVit = cap_value(i,0,USHRT_MAX); - i = bInt_+ sd->param_bonus[3] + sd->param_equip[3]; - bInt_ = cap_value(i,0,USHRT_MAX); - i = bDex + sd->param_bonus[4] + sd->param_equip[4]; - bDex = cap_value(i,0,USHRT_MAX); - i = bLuk + sd->param_bonus[5] + sd->param_equip[5]; - bLuk = cap_value(i,0,USHRT_MAX); + // Bonuses from cards and equipment as well as base stat, remember to avoid overflows. + i = base_status->str + sd->status.str + sd->param_bonus[0] + sd->param_equip[0]; + base_status->str = cap_value(i,0,USHRT_MAX); + i = base_status->agi + sd->status.agi + sd->param_bonus[1] + sd->param_equip[1]; + base_status->agi = cap_value(i,0,USHRT_MAX); + i = base_status->vit + sd->status.vit + sd->param_bonus[2] + sd->param_equip[2]; + base_status->vit = cap_value(i,0,USHRT_MAX); + i = base_status->int_+ sd->status.int_+ sd->param_bonus[3] + sd->param_equip[3]; + base_status->int_ = cap_value(i,0,USHRT_MAX); + i = base_status->dex + sd->status.dex + sd->param_bonus[4] + sd->param_equip[4]; + base_status->dex = cap_value(i,0,USHRT_MAX); + i = base_status->luk + sd->status.luk + sd->param_bonus[5] + sd->param_equip[5]; + base_status->luk = cap_value(i,0,USHRT_MAX); // ------ ATTACK CALCULATION ------ @@ -3772,14 +3763,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) } status_cpy(&sd->battle_status, base_status); - // Add to Battle Stats after copy - sd->battle_status.str += bStr; - sd->battle_status.agi += bAgi; - sd->battle_status.vit += bVit; - sd->battle_status.int_ += bInt_; - sd->battle_status.dex += bDex; - sd->battle_status.luk += bLuk; - // ----- CLIENT-SIDE REFRESH ----- if(!sd->bl.prev) { // Will update on LoadEndAck @@ -4296,17 +4279,12 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc */ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) { - const struct status_data *b_status; - struct status_data *status = status_get_status_data(bl); + const struct status_data *b_status = status_get_base_status(bl); // Base Status + struct status_data *status = status_get_status_data(bl); // Battle Status struct status_change *sc = status_get_sc(bl); TBL_PC *sd = BL_CAST(BL_PC,bl); int temp; - if (bl->type == BL_PC) - b_status = &sd->battle_status; - else - b_status = status_get_base_status(bl); - if (!b_status || !status) return; @@ -7321,7 +7299,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ /// 2500ms -> tick_def2=2000 -> 500ms int sc_def2 = 0, tick_def2 = 0; - struct status_data *status, *status_src, *b_status; + struct status_data *status, *status_src; struct status_change *sc; struct map_session_data *sd; @@ -7368,7 +7346,6 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ sd = BL_CAST(BL_PC,bl); status = status_get_status_data(bl); status_src = status_get_status_data(src); - b_status = status_get_base_status(bl); sc = status_get_sc(bl); if( sc && !sc->count ) sc = NULL; @@ -7465,9 +7442,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ sc_def = status->agi*50; break; case SC_DEEPSLEEP: - sc_def = b_status->int_*50; + sc_def = (sd ? sd->status.int_ : status_get_base_status(bl)->int_) * 50; tick_def = 0; // Linear reduction instead - tick_def2 = (b_status->int_ + status_get_lv(bl))*50; // kRO balance update lists this formula + tick_def2 = ((sd ? sd->status.int_ : status_get_base_status(bl)->int_) + status_get_lv(bl)) * 50; // kRO balance update lists this formula break; case SC_NETHERWORLD: // Resistance: {(Target's Base Level / 50) + (Target's Job Level / 10)} seconds @@ -7506,10 +7483,10 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ tick_def2 = (status->vit + status->agi) * 70; break; case SC_CRYSTALIZE: - tick_def2 = b_status->vit*100; + tick_def2 = (sd ? sd->status.vit : status_get_base_status(bl)->vit) * 100; break; case SC_VACUUM_EXTREME: - tick_def2 = b_status->str*50; + tick_def2 = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50; break; case SC_KYOUGAKU: tick_def2 = 30*status->int_; @@ -7522,7 +7499,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ tick_def2 = status_get_lv(bl) * 100 + (sd ? sd->status.job_level : 1) * 200; break; case SC_B_TRAP: - tick_def = b_status->str * 50; // (custom) + tick_def = (sd ? sd->status.str : status_get_base_status(bl)->str) * 50; // (custom) break; default: // Effect that cannot be reduced? Likely a buff.