Skip to content

Commit

Permalink
Partial revert of ce7aacb
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
aleos89 committed Oct 23, 2015
1 parent 581c236 commit ea497b2
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 71 deletions.
6 changes: 2 additions & 4 deletions src/map/battle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
9 changes: 3 additions & 6 deletions src/map/skill.c
Original file line number Diff line number Diff line change
Expand Up @@ -9898,22 +9898,19 @@ 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
}
break;

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);
Expand Down
99 changes: 38 additions & 61 deletions src/map/status.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 && i<MAX_LEVEL;i++) {
if(!job_info[index].job_bonus[i])
continue;
switch(job_info[index].job_bonus[i]) {
case 1: bStr++; break;
case 2: bAgi++; break;
case 3: bVit++; break;
case 4: bInt_++; break;
case 5: bDex++; break;
case 6: bLuk++; break;
case 1: base_status->str++; 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;

// 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);
base_status->int_ += skill;

// 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 ------

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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_;
Expand All @@ -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.
Expand Down

1 comment on commit ea497b2

@tmav94
Copy link

@tmav94 tmav94 commented on ea497b2 Oct 25, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ty

Please sign in to comment.