Fixed max skill levels, pc_calc_base_job, baby jobs.
git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@190 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
523d946355
commit
c6f120df14
@ -12,6 +12,9 @@ Date Added
|
|||||||
-Skill estimation will show monsters current level (instead of reading from db).
|
-Skill estimation will show monsters current level (instead of reading from db).
|
||||||
-Will display level 99 aura if and when a monster hits level 99.
|
-Will display level 99 aura if and when a monster hits level 99.
|
||||||
-They will not go higher than level 99.
|
-They will not go higher than level 99.
|
||||||
|
* Fixed maximum skill levels not following skill tree [celest]
|
||||||
|
* Updated HP/SP for baby classes [celest]
|
||||||
|
* Corrected pc_calc_base_job [celest]
|
||||||
|
|
||||||
11/14
|
11/14
|
||||||
* Made the Advance jobchangers to kRO standars with the following;
|
* Made the Advance jobchangers to kRO standars with the following;
|
||||||
|
16
Dev/TODO.txt
16
Dev/TODO.txt
@ -674,11 +674,21 @@ Notes: 1. Skills
|
|||||||
* This means, when you adopt a child character, DO IT CAREFULLY. For the entire history of your character, you can only, and I mean ONLY get one child character.
|
* This means, when you adopt a child character, DO IT CAREFULLY. For the entire history of your character, you can only, and I mean ONLY get one child character.
|
||||||
|
|
||||||
- The Child Adoption system now changes as following, so please make note of this:
|
- The Child Adoption system now changes as following, so please make note of this:
|
||||||
* The adopted child cannot raise any stat to beyond 80.
|
* The adopted child cannot raise any stat to beyond 80. - Done [Celest]
|
||||||
* The adopted child will have 70% of MaxHP and MaxSP of normal characters.
|
* The adopted child will have 70% of MaxHP and MaxSP of normal characters. - Done [Celest]
|
||||||
* The adopted child cannot marry.
|
* The adopted child cannot marry. - Done [Celest]
|
||||||
* "Mom, Dad, I love you" skill will only last 2 minutes instead of 5.
|
* "Mom, Dad, I love you" skill will only last 2 minutes instead of 5.
|
||||||
* The parents must be both LV 70 or above in order to adopt.
|
* The parents must be both LV 70 or above in order to adopt.
|
||||||
* The parents must be both LV 70 or above in order to share EXP as family.
|
* The parents must be both LV 70 or above in order to share EXP as family.
|
||||||
* "Mom, Dad, I love you" skill will now take 10% of MaxSP instead of taking 1 SP.
|
* "Mom, Dad, I love you" skill will now take 10% of MaxSP instead of taking 1 SP.
|
||||||
- The wedding skills will now depend on percentage of MaxHP/MaxSP.
|
- The wedding skills will now depend on percentage of MaxHP/MaxSP.
|
||||||
|
|
||||||
|
********
|
||||||
|
58.
|
||||||
|
Description: Super novices max job level is now 99
|
||||||
|
|
||||||
|
Status: Pending
|
||||||
|
|
||||||
|
Assignee: NONE
|
||||||
|
|
||||||
|
Notes: http://forums.emperium.org/viewtopic.php?t=44856
|
@ -63,8 +63,8 @@ Assigned: N/A
|
|||||||
Progess: 0%
|
Progess: 0%
|
||||||
|
|
||||||
Problem: The skill tree's max skill lvl is not read/used.
|
Problem: The skill tree's max skill lvl is not read/used.
|
||||||
Assigned: N/A
|
Assigned: Celest
|
||||||
Progess: 0%
|
Progess: ~100% (Notes: Maybe there's a less messy way? xP)
|
||||||
|
|
||||||
Problem: Char server and Map server crash when you recall some one.
|
Problem: Char server and Map server crash when you recall some one.
|
||||||
Assigned: N/A
|
Assigned: N/A
|
||||||
|
@ -4738,6 +4738,7 @@ int atcommand_character_joblevel(
|
|||||||
if (pl_s_class.job == 0)
|
if (pl_s_class.job == 0)
|
||||||
max_level -= 40;
|
max_level -= 40;
|
||||||
if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //スパノビと転生職はJobレベルの最高が70
|
if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //スパノビと転生職はJobレベルの最高が70
|
||||||
|
// To-do: super novices has max level 99 - celest
|
||||||
max_level += 20;
|
max_level += 20;
|
||||||
|
|
||||||
if (level > 0) {
|
if (level > 0) {
|
||||||
|
@ -4164,7 +4164,8 @@ int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
|
|||||||
WFIFOW(fd,12)= range;
|
WFIFOW(fd,12)= range;
|
||||||
memset(WFIFOP(fd,14),0,24);
|
memset(WFIFOP(fd,14),0,24);
|
||||||
if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
|
if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
|
||||||
WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
|
//WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
|
||||||
|
WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_tree_get_max(id, sd->status.class) && sd->status.skill[skillid].flag ==0 )? 1:0;
|
||||||
else
|
else
|
||||||
WFIFOB(fd,38) = 0;
|
WFIFOB(fd,38) = 0;
|
||||||
WFIFOSET(fd,packet_len_table[0x147]);
|
WFIFOSET(fd,packet_len_table[0x147]);
|
||||||
@ -4198,7 +4199,8 @@ int clif_skillinfoblock(struct map_session_data *sd)
|
|||||||
WFIFOW(fd,len+10)= range;
|
WFIFOW(fd,len+10)= range;
|
||||||
memset(WFIFOP(fd,len+12),0,24);
|
memset(WFIFOP(fd,len+12),0,24);
|
||||||
if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
|
if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
|
||||||
WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max(id) && sd->status.skill[i].flag ==0 )? 1:0;
|
//WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max(id) && sd->status.skill[i].flag ==0 )? 1:0;
|
||||||
|
WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class) && sd->status.skill[i].flag ==0 )? 1:0;
|
||||||
else
|
else
|
||||||
WFIFOB(fd,len+36) = 0;
|
WFIFOB(fd,len+36) = 0;
|
||||||
len+=37;
|
len+=37;
|
||||||
@ -4230,7 +4232,8 @@ int clif_skillup(struct map_session_data *sd,int skill_num)
|
|||||||
if(range < 0)
|
if(range < 0)
|
||||||
range = battle_get_range(&sd->bl) - (range + 1);
|
range = battle_get_range(&sd->bl) - (range + 1);
|
||||||
WFIFOW(fd,8) = range;
|
WFIFOW(fd,8) = range;
|
||||||
WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
|
//WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
|
||||||
|
WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_tree_get_max(sd->status.skill[skill_num].id, sd->status.class)) ? 1 : 0;
|
||||||
WFIFOSET(fd,packet_len_table[0x10e]);
|
WFIFOSET(fd,packet_len_table[0x10e]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
111
src/map/pc.c
111
src/map/pc.c
@ -53,13 +53,14 @@ static int aspd_base[MAX_PC_CLASS][20];
|
|||||||
static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
|
static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
|
||||||
static int exp_table[14][MAX_LEVEL];
|
static int exp_table[14][MAX_LEVEL];
|
||||||
static char statp[255][7];
|
static char statp[255][7];
|
||||||
static struct {
|
|
||||||
|
/*static struct {
|
||||||
int id;
|
int id;
|
||||||
int max;
|
int max;
|
||||||
struct {
|
struct {
|
||||||
short id,lv;
|
short id,lv;
|
||||||
} need[6];
|
} need[6];
|
||||||
} skill_tree[3][MAX_PC_CLASS][100];
|
} skill_tree[3][MAX_PC_CLASS][100];*/ // moved to pc.h
|
||||||
|
|
||||||
static int atkmods[3][20]; // 武器ATKサイズ修正(size_fix.txt)
|
static int atkmods[3][20]; // 武器ATKサイズ修正(size_fix.txt)
|
||||||
static int refinebonus[5][3]; // 精錬ボーナステーブル(refine_db.txt)
|
static int refinebonus[5][3]; // 精錬ボーナステーブル(refine_db.txt)
|
||||||
@ -903,13 +904,16 @@ int pc_calc_skilltree(struct map_session_data *sd)
|
|||||||
|
|
||||||
s_class = pc_calc_base_job(sd->status.class);
|
s_class = pc_calc_base_job(sd->status.class);
|
||||||
c = s_class.job;
|
c = s_class.job;
|
||||||
s = (s_class.upper==1) ? 1 : 0 ; //転生以外は通常のスキル?
|
//s = (s_class.upper==1) ? 1 : 0 ; //転生以外は通常のスキル?
|
||||||
|
s = s_class.upper;
|
||||||
|
|
||||||
if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
|
//if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
|
||||||
|
if (battle_config.skillup_limit && c >= 0 && c < 23) {
|
||||||
int skill_point = pc_calc_skillpoint(sd);
|
int skill_point = pc_calc_skillpoint(sd);
|
||||||
if(skill_point < 9)
|
if(skill_point < 9)
|
||||||
c = 0;
|
c = 0;
|
||||||
else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) {
|
//else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) {
|
||||||
|
else if ((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && (c > 6 && c < 23)) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 7:
|
case 7:
|
||||||
case 14:
|
case 14:
|
||||||
@ -936,7 +940,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
|
|||||||
case 17:
|
case 17:
|
||||||
c = 6;
|
c = 6;
|
||||||
break;
|
break;
|
||||||
case 4008:
|
/*case 4008:
|
||||||
case 4015:
|
case 4015:
|
||||||
c = 4002;
|
c = 4002;
|
||||||
break;
|
break;
|
||||||
@ -985,8 +989,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
|
|||||||
case 4035:
|
case 4035:
|
||||||
case 4043:
|
case 4043:
|
||||||
c = 4029;
|
c = 4029;
|
||||||
break;
|
break;*/
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1602,6 +1605,9 @@ int pc_calcstatus(struct map_session_data* sd,int first)
|
|||||||
sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
|
sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
|
||||||
if (s_class.upper==1) // [MouseJstr]
|
if (s_class.upper==1) // [MouseJstr]
|
||||||
sd->status.max_hp = sd->status.max_hp * 130/100;
|
sd->status.max_hp = sd->status.max_hp * 130/100;
|
||||||
|
else if (s_class.upper==2)
|
||||||
|
sd->status.max_hp = sd->status.max_hp * 70/100;
|
||||||
|
|
||||||
if(sd->hprate!=100)
|
if(sd->hprate!=100)
|
||||||
sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
|
sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
|
||||||
|
|
||||||
@ -1625,6 +1631,8 @@ int pc_calcstatus(struct map_session_data* sd,int first)
|
|||||||
sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
|
sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
|
||||||
if (s_class.upper==1) // [MouseJstr]
|
if (s_class.upper==1) // [MouseJstr]
|
||||||
sd->status.max_sp = sd->status.max_sp * 130/100;
|
sd->status.max_sp = sd->status.max_sp * 130/100;
|
||||||
|
else if (s_class.upper==2)
|
||||||
|
sd->status.max_sp = sd->status.max_sp * 70/100;
|
||||||
if(sd->sprate!=100)
|
if(sd->sprate!=100)
|
||||||
sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
|
sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
|
||||||
|
|
||||||
@ -4006,14 +4014,18 @@ struct pc_base_job pc_calc_base_job(int b_class)
|
|||||||
{
|
{
|
||||||
struct pc_base_job bj;
|
struct pc_base_job bj;
|
||||||
//転生や養子の場合の元の職業を算出する
|
//転生や養子の場合の元の職業を算出する
|
||||||
if(b_class < MAX_PC_CLASS){ //通常
|
//if(b_class < MAX_PC_CLASS){ //通常
|
||||||
|
if(b_class < 4001){
|
||||||
bj.job = b_class;
|
bj.job = b_class;
|
||||||
bj.upper = 0;
|
bj.upper = 0;
|
||||||
}else if(b_class >= 4001 && b_class < 4023){ //転生職
|
}else if(b_class >= 4001 && b_class < 4023){ //転生職
|
||||||
|
// Athena almost never uses this... well, used this. :3
|
||||||
bj.job = b_class - 4001;
|
bj.job = b_class - 4001;
|
||||||
bj.upper = 1;
|
bj.upper = 1;
|
||||||
}else if(b_class == 23 + 4023 -1){ //養子スパノビ
|
//}else if(b_class == 23 + 4023 -1){ //養子スパノビ
|
||||||
bj.job = b_class - (4023 - 1);
|
}else if(b_class == 4045){ // super baby
|
||||||
|
//bj.job = b_class - (4023 - 1);
|
||||||
|
bj.job = 23;
|
||||||
bj.upper = 2;
|
bj.upper = 2;
|
||||||
}else{ //養子スパノビ以外の養子
|
}else{ //養子スパノビ以外の養子
|
||||||
bj.job = b_class - 4023;
|
bj.job = b_class - 4023;
|
||||||
@ -4035,6 +4047,30 @@ struct pc_base_job pc_calc_base_job(int b_class)
|
|||||||
return bj;
|
return bj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
* For quick calculating [Celest]
|
||||||
|
*------------------------------------------
|
||||||
|
*/
|
||||||
|
int pc_calc_base_job2 (int b_class)
|
||||||
|
{
|
||||||
|
if(b_class < 4001)
|
||||||
|
return b_class;
|
||||||
|
else if(b_class >= 4001 && b_class < 4023)
|
||||||
|
return b_class - 4001;
|
||||||
|
else if(b_class == 4045)
|
||||||
|
return 23;
|
||||||
|
return b_class - 4023;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pc_calc_upper(int b_class)
|
||||||
|
{
|
||||||
|
if(b_class < 4001)
|
||||||
|
return 0;
|
||||||
|
else if(b_class >= 4001 && b_class < 4023)
|
||||||
|
return 1;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* PCの攻撃 (timer関数)
|
* PCの攻撃 (timer関数)
|
||||||
*------------------------------------------
|
*------------------------------------------
|
||||||
@ -4513,6 +4549,8 @@ int pc_statusup(struct map_session_data *sd,int type)
|
|||||||
|
|
||||||
nullpo_retr(0, sd);
|
nullpo_retr(0, sd);
|
||||||
|
|
||||||
|
int max = (pc_calc_upper(sd->status.class)==2) ? 80 : battle_config.max_parameter;
|
||||||
|
|
||||||
need=pc_need_status_point(sd,type);
|
need=pc_need_status_point(sd,type);
|
||||||
if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
|
if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
@ -4520,42 +4558,42 @@ int pc_statusup(struct map_session_data *sd,int type)
|
|||||||
}
|
}
|
||||||
switch(type){
|
switch(type){
|
||||||
case SP_STR:
|
case SP_STR:
|
||||||
if(sd->status.str >= battle_config.max_parameter) {
|
if(sd->status.str >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
val= ++sd->status.str;
|
val= ++sd->status.str;
|
||||||
break;
|
break;
|
||||||
case SP_AGI:
|
case SP_AGI:
|
||||||
if(sd->status.agi >= battle_config.max_parameter) {
|
if(sd->status.agi >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
val= ++sd->status.agi;
|
val= ++sd->status.agi;
|
||||||
break;
|
break;
|
||||||
case SP_VIT:
|
case SP_VIT:
|
||||||
if(sd->status.vit >= battle_config.max_parameter) {
|
if(sd->status.vit >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
val= ++sd->status.vit;
|
val= ++sd->status.vit;
|
||||||
break;
|
break;
|
||||||
case SP_INT:
|
case SP_INT:
|
||||||
if(sd->status.int_ >= battle_config.max_parameter) {
|
if(sd->status.int_ >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
val= ++sd->status.int_;
|
val= ++sd->status.int_;
|
||||||
break;
|
break;
|
||||||
case SP_DEX:
|
case SP_DEX:
|
||||||
if(sd->status.dex >= battle_config.max_parameter) {
|
if(sd->status.dex >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
val= ++sd->status.dex;
|
val= ++sd->status.dex;
|
||||||
break;
|
break;
|
||||||
case SP_LUK:
|
case SP_LUK:
|
||||||
if(sd->status.luk >= battle_config.max_parameter) {
|
if(sd->status.luk >= max) {
|
||||||
clif_statusupack(sd,type,0,0);
|
clif_statusupack(sd,type,0,0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -4665,7 +4703,8 @@ int pc_skillup(struct map_session_data *sd,int skill_num)
|
|||||||
|
|
||||||
if( sd->status.skill_point>0 &&
|
if( sd->status.skill_point>0 &&
|
||||||
sd->status.skill[skill_num].id!=0 &&
|
sd->status.skill[skill_num].id!=0 &&
|
||||||
sd->status.skill[skill_num].lv < skill_get_max(skill_num) )
|
//sd->status.skill[skill_num].lv < skill_get_max(skill_num) ) - celest
|
||||||
|
sd->status.skill[skill_num].lv < skill_tree_get_max(skill_num, sd->status.class) )
|
||||||
{
|
{
|
||||||
sd->status.skill[skill_num].lv++;
|
sd->status.skill[skill_num].lv++;
|
||||||
sd->status.skill_point--;
|
sd->status.skill_point--;
|
||||||
@ -4717,7 +4756,8 @@ int pc_allskillup(struct map_session_data *sd)
|
|||||||
else {
|
else {
|
||||||
for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
|
for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
|
||||||
if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) )
|
if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) )
|
||||||
sd->status.skill[id].lv=skill_get_max(id);
|
// sd->status.skill[id].lv=skill_get_max(id);
|
||||||
|
sd->status.skill[id].lv=skill_tree_get_max(id, sd->status.class); // celest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pc_calcstatus(sd,0);
|
pc_calcstatus(sd,0);
|
||||||
@ -6562,7 +6602,7 @@ int pc_ismarried(struct map_session_data *sd)
|
|||||||
*/
|
*/
|
||||||
int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd)
|
int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd)
|
||||||
{
|
{
|
||||||
if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0)
|
if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0 || pc_calc_upper(sd->status.class)==2)
|
||||||
return -1;
|
return -1;
|
||||||
sd->status.partner_id=dstsd->status.char_id;
|
sd->status.partner_id=dstsd->status.char_id;
|
||||||
dstsd->status.partner_id=sd->status.char_id;
|
dstsd->status.partner_id=sd->status.char_id;
|
||||||
@ -7168,7 +7208,8 @@ void pc_setstand(struct map_session_data *sd){
|
|||||||
*/
|
*/
|
||||||
int pc_readdb(void)
|
int pc_readdb(void)
|
||||||
{
|
{
|
||||||
int i,j,k;
|
int i,j,k,u;
|
||||||
|
struct pc_base_job s_class;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char line[1024],*p;
|
char line[1024],*p;
|
||||||
|
|
||||||
@ -7300,6 +7341,7 @@ int pc_readdb(void)
|
|||||||
printf("can't read db/skill_tree.txt\n");
|
printf("can't read db/skill_tree.txt\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(fgets(line, sizeof(line)-1, fp)){
|
while(fgets(line, sizeof(line)-1, fp)){
|
||||||
char *split[50];
|
char *split[50];
|
||||||
if(line[0]=='/' && line[1]=='/')
|
if(line[0]=='/' && line[1]=='/')
|
||||||
@ -7311,17 +7353,24 @@ int pc_readdb(void)
|
|||||||
}
|
}
|
||||||
if(j<13)
|
if(j<13)
|
||||||
continue;
|
continue;
|
||||||
i=atoi(split[0]);
|
//i=atoi(split[0]);
|
||||||
for(j=0;skill_tree[0][i][j].id;j++);
|
s_class = pc_calc_base_job(atoi(split[0]));
|
||||||
skill_tree[0][i][j].id=atoi(split[1]);
|
i = s_class.job;
|
||||||
skill_tree[0][i][j].max=atoi(split[2]);
|
u = s_class.upper;
|
||||||
skill_tree[2][i][j].id=atoi(split[1]); //養子職は良く分からないので暫定
|
//printf ("i = %d, u = %d\n",i,u);
|
||||||
skill_tree[2][i][j].max=atoi(split[2]); //養子職は良く分からないので暫定
|
for(j=0;skill_tree[u][i][j].id;j++);
|
||||||
|
skill_tree[u][i][j].id=atoi(split[1]);
|
||||||
|
skill_tree[u][i][j].max=atoi(split[2]);
|
||||||
|
|
||||||
|
//not required - Celest
|
||||||
|
//skill_tree[2][i][j].id=atoi(split[1]); //養子職は良く分からないので暫定
|
||||||
|
//skill_tree[2][i][j].max=atoi(split[2]); //養子職は良く分からないので暫定
|
||||||
|
|
||||||
for(k=0;k<5;k++){
|
for(k=0;k<5;k++){
|
||||||
skill_tree[0][i][j].need[k].id=atoi(split[k*2+3]);
|
skill_tree[u][i][j].need[k].id=atoi(split[k*2+3]);
|
||||||
skill_tree[0][i][j].need[k].lv=atoi(split[k*2+4]);
|
skill_tree[u][i][j].need[k].lv=atoi(split[k*2+4]);
|
||||||
skill_tree[2][i][j].need[k].id=atoi(split[k*2+3]); //養子職は良く分からないので暫定
|
//skill_tree[2][i][j].need[k].id=atoi(split[k*2+3]); //養子職は良く分からないので暫定
|
||||||
skill_tree[2][i][j].need[k].lv=atoi(split[k*2+4]); //養子職は良く分からないので暫定
|
//skill_tree[2][i][j].need[k].lv=atoi(split[k*2+4]); //養子職は良く分からないので暫定
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
10
src/map/pc.h
10
src/map/pc.h
@ -165,6 +165,16 @@ struct pc_base_job{
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct pc_base_job pc_calc_base_job(int b_class);//転生や養子職の元の職業を返す
|
struct pc_base_job pc_calc_base_job(int b_class);//転生や養子職の元の職業を返す
|
||||||
|
int pc_calc_base_job2(int b_class); // Celest
|
||||||
|
int pc_calc_upper(int b_class);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int id;
|
||||||
|
int max;
|
||||||
|
struct {
|
||||||
|
short id,lv;
|
||||||
|
} need[6];
|
||||||
|
} skill_tree[3][MAX_PC_CLASS][100]; // Celest
|
||||||
|
|
||||||
int pc_read_gm_account(int fd);
|
int pc_read_gm_account(int fd);
|
||||||
int pc_setinvincibletimer(struct map_session_data *sd,int);
|
int pc_setinvincibletimer(struct map_session_data *sd,int);
|
||||||
|
@ -754,6 +754,11 @@ int skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].ble
|
|||||||
int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; }
|
int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; }
|
||||||
int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; }
|
int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; }
|
||||||
|
|
||||||
|
int skill_tree_get_max(int id, int b_class){
|
||||||
|
struct pc_base_job s_class = pc_calc_base_job(b_class);
|
||||||
|
return skill_tree[s_class.upper][s_class.job][id].max;
|
||||||
|
}
|
||||||
|
|
||||||
/* プロトタイプ */
|
/* プロトタイプ */
|
||||||
struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
|
struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
|
||||||
int skill_check_condition( struct map_session_data *sd,int type);
|
int skill_check_condition( struct map_session_data *sd,int type);
|
||||||
|
@ -84,6 +84,7 @@ int skill_get_unit_id(int id,int flag);
|
|||||||
int skill_get_inf2( int id );
|
int skill_get_inf2( int id );
|
||||||
int skill_get_maxcount( int id );
|
int skill_get_maxcount( int id );
|
||||||
int skill_get_blewcount( int id ,int lv );
|
int skill_get_blewcount( int id ,int lv );
|
||||||
|
int skill_tree_get_max( int id, int b_class ); // Celest
|
||||||
|
|
||||||
// スキルの使用
|
// スキルの使用
|
||||||
int skill_use_id( struct map_session_data *sd, int target_id,
|
int skill_use_id( struct map_session_data *sd, int target_id,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user