summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt1
-rw-r--r--src/map/pc.c190
-rw-r--r--src/map/status.c33
-rw-r--r--src/map/status.h17
4 files changed, 82 insertions, 159 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index a8af3df96..037d85419 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,7 @@ 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/02/10
+ * Added two missing opt2 values, for Angelus and Bleeding status
* Fixed Warp Portal code sometimes producing errors/crashes in the case
where a priest enters his/her own warp (bugreport:270)
2008/02/08
diff --git a/src/map/pc.c b/src/map/pc.c
index 082a61aa3..a5699312d 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4325,25 +4325,30 @@ unsigned int pc_thisjobexp(struct map_session_data *sd)
return exp_table[pc_class2idx(sd->status.class_)][1][sd->status.job_level-2];
}
+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;
+ case SP_VIT: return sd->status.vit;
+ case SP_INT: return sd->status.int_;
+ case SP_DEX: return sd->status.dex;
+ case SP_LUK: return sd->status.luk;
+ default:
+ return -1;
+ }
+}
+
/*==========================================
* 必要ステ?タスポイント計算
*------------------------------------------*/
int pc_need_status_point(struct map_session_data *sd,int type)
{
- int val;
-
nullpo_retr(-1, sd);
-
- if(type<SP_STR || type>SP_LUK)
+ if( type < SP_STR || type > SP_LUK )
return -1;
- val =
- type==SP_STR ? sd->status.str :
- type==SP_AGI ? sd->status.agi :
- type==SP_VIT ? sd->status.vit :
- type==SP_INT ? sd->status.int_:
- type==SP_DEX ? sd->status.dex : sd->status.luk;
-
- return (val+9)/10+1;
+ return ( 1 + (pc_getstat(sd,type) + 9) / 10 );
}
/*==========================================
@@ -4355,57 +4360,31 @@ int pc_statusup(struct map_session_data *sd,int type)
nullpo_retr(0, sd);
- max = pc_maxparameter(sd);
+ // check conditions
+ need = pc_need_status_point(sd,type);
+ if( type < SP_STR || type > SP_LUK || need < 0 || need > sd->status.status_point )
+ {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
- need=pc_need_status_point(sd,type);
- if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
+ // check limits
+ max = pc_maxparameter(sd);
+ if( pc_getstat(sd,type) >= max )
+ {
clif_statusupack(sd,type,0,0);
return 1;
}
+
switch(type){
- case SP_STR:
- if(sd->status.str >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.str;
- break;
- case SP_AGI:
- if(sd->status.agi >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.agi;
- break;
- case SP_VIT:
- if(sd->status.vit >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.vit;
- break;
- case SP_INT:
- if(sd->status.int_ >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.int_;
- break;
- case SP_DEX:
- if(sd->status.dex >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.dex;
- break;
- case SP_LUK:
- if(sd->status.luk >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.luk;
- break;
+ 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;
}
+
sd->status.status_point-=need;
if(need!=pc_need_status_point(sd,type)){
clif_updatestatus(sd,type-SP_STR+SP_USTR);
@@ -4428,66 +4407,18 @@ int pc_statusup2(struct map_session_data *sd,int type,int val)
max = pc_maxparameter(sd);
- if(type<SP_STR || type>SP_LUK){
+ 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:
clif_statusupack(sd,type,0,0);
return 1;
}
- switch(type){
- case SP_STR:
- if(sd->status.str + val >= max)
- val = max;
- else if(sd->status.str + val < 1)
- val = 1;
- else
- val += sd->status.str;
- sd->status.str = val;
- break;
- case SP_AGI:
- if(sd->status.agi + val >= max)
- val = max;
- else if(sd->status.agi + val < 1)
- val = 1;
- else
- val += sd->status.agi;
- sd->status.agi = val;
- break;
- case SP_VIT:
- if(sd->status.vit + val >= max)
- val = max;
- else if(sd->status.vit + val < 1)
- val = 1;
- else
- val += sd->status.vit;
- sd->status.vit = val;
- break;
- case SP_INT:
- if(sd->status.int_ + val >= max)
- val = max;
- else if(sd->status.int_ + val < 1)
- val = 1;
- else
- val += sd->status.int_;
- sd->status.int_ = val;
- break;
- case SP_DEX:
- if(sd->status.dex + val >= max)
- val = max;
- else if(sd->status.dex + val < 1)
- val = 1;
- else
- val += sd->status.dex;
- sd->status.dex = val;
- break;
- case SP_LUK:
- if(sd->status.luk + val >= max)
- val = max;
- else if(sd->status.luk + val < 1)
- val = 1;
- else
- val = sd->status.luk + val;
- sd->status.luk = val;
- break;
- }
+
status_calc_pc(sd,0);
clif_statusupack(sd,type,1,val);
@@ -6228,15 +6159,13 @@ static int pc_eventtimer(int tid,unsigned int tick,int id,int data)
int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name)
{
int i;
- char* evname;
nullpo_retr(0, sd);
ARR_FIND( 0, MAX_EVENTTIMER, i, sd->eventtimer[i] == -1 );
if( i == MAX_EVENTTIMER )
return 0;
- evname = aStrdup(name);
- sd->eventtimer[i] = add_timer(gettick()+tick, pc_eventtimer,sd->bl.id,(int)evname);
+ sd->eventtimer[i] = add_timer(gettick()+tick, pc_eventtimer, sd->bl.id, (int)aStrdup(name));
sd->eventcount++;
return 1;
@@ -6248,25 +6177,28 @@ int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name)
int pc_deleventtimer(struct map_session_data *sd,const char *name)
{
int i;
+ char* p;
nullpo_retr(0, sd);
if (sd->eventcount <= 0)
return 0;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 ) {
- char *p = (char *)(get_timer(sd->eventtimer[i])->data);
- if(p && strcmp(p, name)==0) {
- delete_timer(sd->eventtimer[i],pc_eventtimer);
- sd->eventtimer[i]=-1;
- sd->eventcount--;
- aFree(p);
- return 1;
- }
- }
+ // find the named event timer
+ ARR_FIND( 0, MAX_EVENTTIMER, i,
+ sd->eventtimer[i] != -1 &&
+ (p = (char *)(get_timer(sd->eventtimer[i])->data)) != NULL &&
+ strcmp(p, name) == 0
+ );
+ if( i == MAX_EVENTTIMER )
+ return 0; // not found
- return 0;
+ delete_timer(sd->eventtimer[i],pc_eventtimer);
+ sd->eventtimer[i]=-1;
+ sd->eventcount--;
+ aFree(p);
+
+ return 1;
}
/*==========================================
diff --git a/src/map/status.c b/src/map/status.c
index 4b1144d49..7e6585085 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -5959,28 +5959,19 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
switch(type)
{
//OPT1
- case SC_STONE:
- case SC_FREEZE:
- case SC_STUN:
- case SC_SLEEP:
- if(type == SC_STONE)
- sc->opt1 = OPT1_STONEWAIT;
- else
- sc->opt1 = OPT1_STONE + (type - SC_STONE);
- break;
+ case SC_STONE: sc->opt1 = OPT1_STONEWAIT; break;
+ case SC_FREEZE: sc->opt1 = OPT1_FREEZE; break;
+ case SC_STUN: sc->opt1 = OPT1_STUN; break;
+ case SC_SLEEP: sc->opt1 = OPT1_SLEEP; break;
//OPT2
- case SC_POISON:
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- sc->opt2 |= 1<<(type-SC_POISON);
- break;
- case SC_DPOISON:
- sc->opt2 |= OPT2_DPOISON;
- break;
- case SC_SIGNUMCRUCIS:
- sc->opt2 |= OPT2_SIGNUMCRUCIS;
- break;
+ case SC_POISON: sc->opt2 |= OPT2_POISON; break;
+ case SC_CURSE: sc->opt2 |= OPT2_CURSE; break;
+ case SC_SILENCE: sc->opt2 |= OPT2_SILENCE; break;
+ case SC_SIGNUMCRUCIS: sc->opt2 |= OPT2_SIGNUMCRUCIS; break;
+ case SC_BLIND: sc->opt2 |= OPT2_BLIND; break;
+ case SC_ANGELUS: sc->opt2 |= OPT2_ANGELUS; break;
+ case SC_BLEEDING: sc->opt2 |= OPT2_BLEEDING; break;
+ case SC_DPOISON: sc->opt2 |= OPT2_DPOISON; break;
//OPT3
case SC_TWOHANDQUICKEN:
case SC_SPEARQUICKEN:
diff --git a/src/map/status.h b/src/map/status.h
index b036dbd09..c34c45d10 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -496,15 +496,14 @@ enum {
};
//opt2: Stackable status changes.
-#define OPT2_POISON 0x001
-#define OPT2_CURSE 0x002
-#define OPT2_SILENCE 0x004
-#define OPT2_SIGNUMCRUCIS 0x008
-#define OPT2_BLIND 0x010
-//0x020 - nothing
-//0x040 - nothing
-#define OPT2_DPOISON 0x080
-//0x100
+#define OPT2_POISON 0x0001
+#define OPT2_CURSE 0x0002
+#define OPT2_SILENCE 0x0004
+#define OPT2_SIGNUMCRUCIS 0x0008
+#define OPT2_BLIND 0x0010
+#define OPT2_ANGELUS 0x0020
+#define OPT2_BLEEDING 0x0040
+#define OPT2_DPOISON 0x0080
#define OPTION_SIGHT 0x00000001
#define OPTION_HIDE 0x00000002