summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-01-20 13:53:28 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-01-20 13:53:28 +0000
commit531b0e718a49f4dda99e45aa0c985bc396d88b2f (patch)
tree7896f034ec40ce1e25ebe69cac46d018885da715 /src
parent0d1b0c7063bf15d4f9da1f5d442696571d76f2ec (diff)
downloadhercules-531b0e718a49f4dda99e45aa0c985bc396d88b2f.tar.gz
hercules-531b0e718a49f4dda99e45aa0c985bc396d88b2f.tar.bz2
hercules-531b0e718a49f4dda99e45aa0c985bc396d88b2f.tar.xz
hercules-531b0e718a49f4dda99e45aa0c985bc396d88b2f.zip
Fixed pc_statusup2 to correctly update the client's stat window
- was sending the increment value instead of the new value itself (bugreport:2614) - wasn't refreshing the increase cost indicator (bugreport:2644) - wasn't handling stats above 255 correctly git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13460 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r--src/map/pc.c104
1 files changed, 66 insertions, 38 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index f9149b086..2c555a810 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4582,9 +4582,11 @@ unsigned int pc_thisjobexp(struct map_session_data *sd)
return exp_table[pc_class2idx(sd->status.class_)][1][sd->status.job_level-2];
}
+/// Returns the value of the specified stat.
static int pc_getstat(struct map_session_data* sd, int type)
{
nullpo_retr(-1, sd);
+
switch( type ) {
case SP_STR: return sd->status.str;
case SP_AGI: return sd->status.agi;
@@ -4597,23 +4599,40 @@ static int pc_getstat(struct map_session_data* sd, int type)
}
}
-/*==========================================
- * 必要ステ?タスポイント計算
- *------------------------------------------*/
-int pc_need_status_point(struct map_session_data *sd,int type)
+/// Sets the specified stat to the specified value.
+/// Returns the new value.
+static int pc_setstat(struct map_session_data* sd, int type, int val)
{
nullpo_retr(-1, sd);
- if( type < SP_STR || type > SP_LUK )
+
+ switch( type ) {
+ case SP_STR: sd->status.str = val; break;
+ case SP_AGI: sd->status.agi = val; break;
+ case SP_VIT: sd->status.vit = val; break;
+ case SP_INT: sd->status.int_ = val; break;
+ case SP_DEX: sd->status.dex = val; break;
+ case SP_LUK: sd->status.luk = val;
+ default:
return -1;
+ }
+
+ return val;
+}
+
+/// Returns the number of stat points needed to raise the specified stat by 1.
+int pc_need_status_point(struct map_session_data* sd, int type)
+{
return ( 1 + (pc_getstat(sd,type) + 9) / 10 );
}
-/*==========================================
- * 能力値成長
- *------------------------------------------*/
-int pc_statusup(struct map_session_data *sd,int type)
+/// Raises a stat by 1.
+/// Obeys max_parameter limits.
+/// Subtracts stat points.
+///
+/// @param type The stat to change (see enum _sp)
+int pc_statusup(struct map_session_data* sd, int type)
{
- int max, need,val = 0;
+ int max, need, val;
nullpo_retr(0, sd);
@@ -4633,51 +4652,60 @@ int pc_statusup(struct map_session_data *sd,int type)
return 1;
}
- switch(type){
- case SP_STR: val= ++sd->status.str; break;
- case SP_AGI: val= ++sd->status.agi; break;
- case SP_VIT: val= ++sd->status.vit; break;
- case SP_INT: val= ++sd->status.int_; break;
- case SP_DEX: val= ++sd->status.dex; break;
- case SP_LUK: val= ++sd->status.luk; break;
- }
+ // set new values
+ val = pc_setstat(sd, type, pc_getstat(sd,type) + 1);
+ sd->status.status_point -= need;
- sd->status.status_point-=need;
status_calc_pc(sd,0);
+ // update increase cost indicator
if( need != pc_need_status_point(sd,type) )
- clif_updatestatus(sd,type-SP_STR+SP_USTR);
+ clif_updatestatus(sd, SP_USTR + type-SP_STR);
+
+ // update statpoint count
clif_updatestatus(sd,SP_STATUSPOINT);
- clif_statusupack(sd,type,1,val);
- clif_updatestatus(sd,type); // send after the 'ack' to override the value
+
+ // update stat value
+ clif_statusupack(sd,type,1,val); // required
+ if( val > 255 )
+ clif_updatestatus(sd,type); // send after the 'ack' to override the truncated value
return 0;
}
-/*==========================================
- * 能力値成長
- *------------------------------------------*/
-int pc_statusup2(struct map_session_data *sd,int type,int val)
+/// Raises a stat by the specified amount.
+/// Obeys max_parameter limits.
+/// Does not subtract stat points.
+///
+/// @param type The stat to change (see enum _sp)
+/// @param val The stat increase amount.
+int pc_statusup2(struct map_session_data* sd, int type, int val)
{
- int max;
+ int max, need;
nullpo_retr(0, sd);
- max = pc_maxparameter(sd);
-
- switch(type){
- case SP_STR: sd->status.str = cap_value(sd->status.str + val, 1, max); break;
- case SP_AGI: sd->status.agi = cap_value(sd->status.agi + val, 1, max); break;
- case SP_VIT: sd->status.vit = cap_value(sd->status.vit + val, 1, max); break;
- case SP_INT: sd->status.int_= cap_value(sd->status.int_+ val, 1, max); break;
- case SP_DEX: sd->status.dex = cap_value(sd->status.dex + val, 1, max); break;
- case SP_LUK: sd->status.luk = cap_value(sd->status.luk + val, 1, max); break;
- default:
+ if( type < SP_STR || type > SP_LUK )
+ {
clif_statusupack(sd,type,0,0);
return 1;
}
+ need = pc_need_status_point(sd,type);
+
+ // set new value
+ max = pc_maxparameter(sd);
+ val = pc_setstat(sd, type, cap_value(pc_getstat(sd,type) + val, 1, max));
+
status_calc_pc(sd,0);
- clif_statusupack(sd,type,1,val);
+
+ // update increase cost indicator
+ if( need != pc_need_status_point(sd,type) )
+ clif_updatestatus(sd, SP_USTR + type-SP_STR);
+
+ // update stat value
+ clif_statusupack(sd,type,1,val); // required
+ if( val > 255 )
+ clif_updatestatus(sd,type); // send after the 'ack' to override the truncated value
return 0;
}