From ab5cb3ae9f7ab77bdcbf1b57c1da8e3d82ca53cb Mon Sep 17 00:00:00 2001 From: celest Date: Mon, 15 Nov 2004 09:54:39 +0000 Subject: Fixed max skill levels, pc_calc_base_job, baby jobs. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/athena@190 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog.txt | 3 ++ Dev/TODO.txt | 18 ++++++-- Dev/bugs.txt | 4 +- src/map/atcommand.c | 1 + src/map/clif.c | 9 ++-- src/map/pc.c | 123 ++++++++++++++++++++++++++++++++++++---------------- src/map/pc.h | 10 +++++ src/map/skill.c | 11 +++-- src/map/skill.h | 1 + 9 files changed, 131 insertions(+), 49 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 10f2a3924..a173dbfb1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,6 +12,9 @@ Date Added -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. -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 * Made the Advance jobchangers to kRO standars with the following; diff --git a/Dev/TODO.txt b/Dev/TODO.txt index f6fd346af..d7d362d3b 100644 --- a/Dev/TODO.txt +++ b/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. - 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 will have 70% of MaxHP and MaxSP of normal characters. - * The adopted child cannot marry. + * 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. - Done [Celest] + * The adopted child cannot marry. - Done [Celest] * "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 share EXP as family. * "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. \ No newline at end of file + - 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 \ No newline at end of file diff --git a/Dev/bugs.txt b/Dev/bugs.txt index 91be1a96b..97b053a98 100644 --- a/Dev/bugs.txt +++ b/Dev/bugs.txt @@ -63,8 +63,8 @@ Assigned: N/A Progess: 0% Problem: The skill tree's max skill lvl is not read/used. -Assigned: N/A -Progess: 0% +Assigned: Celest +Progess: ~100% (Notes: Maybe there's a less messy way? xP) Problem: Char server and Map server crash when you recall some one. Assigned: N/A diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 6edbeba69..1ca2b9be5 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -4738,6 +4738,7 @@ int atcommand_character_joblevel( if (pl_s_class.job == 0) max_level -= 40; 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; if (level > 0) { diff --git a/src/map/clif.c b/src/map/clif.c index ac7261b79..624e00d73 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4164,7 +4164,8 @@ int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range) WFIFOW(fd,12)= range; 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) ) - 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 WFIFOB(fd,38) = 0; WFIFOSET(fd,packet_len_table[0x147]); @@ -4198,7 +4199,8 @@ int clif_skillinfoblock(struct map_session_data *sd) WFIFOW(fd,len+10)= range; 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) ) - 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 WFIFOB(fd,len+36) = 0; len+=37; @@ -4230,7 +4232,8 @@ int clif_skillup(struct map_session_data *sd,int skill_num) if(range < 0) range = battle_get_range(&sd->bl) - (range + 1); 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]); return 0; diff --git a/src/map/pc.c b/src/map/pc.c index 2022f1e58..b7f23dbbd 100644 --- a/src/map/pc.c +++ b/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 int exp_table[14][MAX_LEVEL]; static char statp[255][7]; -static struct { + +/*static struct { int id; int max; struct { short id,lv; } 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 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); 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); if(skill_point < 9) 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) { case 7: case 14: @@ -936,7 +940,7 @@ int pc_calc_skilltree(struct map_session_data *sd) case 17: c = 6; break; - case 4008: + /*case 4008: case 4015: c = 4002; break; @@ -985,8 +989,7 @@ int pc_calc_skilltree(struct map_session_data *sd) case 4035: case 4043: c = 4029; - break; - + break;*/ } } } @@ -1052,7 +1055,7 @@ int pc_checkweighticon(struct map_session_data *sd) flag=1; if(sd->weight*10 >= sd->max_weight*9) flag=2; - + if(flag==1){ if(sd->sc_data[SC_WEIGHT50].timer==-1) skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0); @@ -1600,8 +1603,11 @@ int pc_calcstatus(struct map_session_data* sd,int first) bl=sd->status.base_level; 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] - sd->status.max_hp = sd->status.max_hp * 130/100; + if (s_class.upper==1) // [MouseJstr] + 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) sd->status.max_hp = sd->status.max_hp*sd->hprate/100; @@ -1623,8 +1629,10 @@ int pc_calcstatus(struct map_session_data* sd,int first) // 最大SP計算 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] - sd->status.max_sp = sd->status.max_sp * 130/100; + if (s_class.upper==1) // [MouseJstr] + 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) 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; //転生や養子の場合の元の職業を算出する - if(b_class < MAX_PC_CLASS){ //通常 + //if(b_class < MAX_PC_CLASS){ //通常 + if(b_class < 4001){ bj.job = b_class; bj.upper = 0; }else if(b_class >= 4001 && b_class < 4023){ //転生職 + // Athena almost never uses this... well, used this. :3 bj.job = b_class - 4001; bj.upper = 1; - }else if(b_class == 23 + 4023 -1){ //養子スパノビ - bj.job = b_class - (4023 - 1); + //}else if(b_class == 23 + 4023 -1){ //養子スパノビ + }else if(b_class == 4045){ // super baby + //bj.job = b_class - (4023 - 1); + bj.job = 23; bj.upper = 2; }else{ //養子スパノビ以外の養子 bj.job = b_class - 4023; @@ -4035,6 +4047,30 @@ struct pc_base_job pc_calc_base_job(int b_class) 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関数) *------------------------------------------ @@ -4510,9 +4546,11 @@ int pc_need_status_point(struct map_session_data *sd,int type) int pc_statusup(struct map_session_data *sd,int type) { int need,val = 0; - + 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); if(typeSP_LUK || need<0 || need>sd->status.status_point){ clif_statusupack(sd,type,0,0); @@ -4520,42 +4558,42 @@ int pc_statusup(struct map_session_data *sd,int type) } switch(type){ case SP_STR: - if(sd->status.str >= battle_config.max_parameter) { + 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 >= battle_config.max_parameter) { + 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 >= battle_config.max_parameter) { + 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_ >= battle_config.max_parameter) { + 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 >= battle_config.max_parameter) { + 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 >= battle_config.max_parameter) { + if(sd->status.luk >= max) { clif_statusupack(sd,type,0,0); return 1; } @@ -4665,7 +4703,8 @@ int pc_skillup(struct map_session_data *sd,int skill_num) if( sd->status.skill_point>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_point--; @@ -4717,7 +4756,8 @@ int pc_allskillup(struct map_session_data *sd) else { 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) ) - 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); @@ -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) { - 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; sd->status.partner_id=dstsd->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 i,j,k; + int i,j,k,u; + struct pc_base_job s_class; FILE *fp; char line[1024],*p; @@ -7300,6 +7341,7 @@ int pc_readdb(void) printf("can't read db/skill_tree.txt\n"); return 1; } + while(fgets(line, sizeof(line)-1, fp)){ char *split[50]; if(line[0]=='/' && line[1]=='/') @@ -7311,17 +7353,24 @@ int pc_readdb(void) } if(j<13) continue; - i=atoi(split[0]); - for(j=0;skill_tree[0][i][j].id;j++); - skill_tree[0][i][j].id=atoi(split[1]); - skill_tree[0][i][j].max=atoi(split[2]); - skill_tree[2][i][j].id=atoi(split[1]); //養子職は良く分からないので暫定 - skill_tree[2][i][j].max=atoi(split[2]); //養子職は良く分からないので暫定 + //i=atoi(split[0]); + s_class = pc_calc_base_job(atoi(split[0])); + i = s_class.job; + u = s_class.upper; + //printf ("i = %d, u = %d\n",i,u); + 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++){ - skill_tree[0][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[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[u][i][j].need[k].id=atoi(split[k*2+3]); + 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].lv=atoi(split[k*2+4]); //養子職は良く分からないので暫定 } } fclose(fp); diff --git a/src/map/pc.h b/src/map/pc.h index 1919007a0..2260fcdb7 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -165,6 +165,16 @@ struct pc_base_job{ }; 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_setinvincibletimer(struct map_session_data *sd,int); diff --git a/src/map/skill.c b/src/map/skill.c index 433c03a93..dfef6c036 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -736,7 +736,7 @@ int skill_get_hit( int id ){ return skill_db[id].hit; } int skill_get_inf( int id ){ return skill_db[id].inf; } int skill_get_pl( int id ){ return skill_db[id].pl; } int skill_get_nk( int id ){ return skill_db[id].nk; } -int skill_get_max( int id ){ return skill_db[id].max; } +int skill_get_max( int id ){ return skill_db[id].max; } int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0:skill_db[id].range[lv-1]; } int skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; } int skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].sp[lv-1]; } @@ -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_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); int skill_check_condition( struct map_session_data *sd,int type); @@ -2711,8 +2716,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int heal=0; /* ?金蟲カ?ド(ヒ?ル量0) */ if (sd){ s_class = pc_calc_base_job(sd->status.class); - if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ - heal += heal*(skill*2/100); + if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ + heal += heal*(skill*2/100); if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も?象もPC、?象が自分のパ?トナ?、自分がスパノビ、自分が♀なら heal = heal*2; //スパノビの嫁が旦那にヒ?ルすると2倍になる } diff --git a/src/map/skill.h b/src/map/skill.h index 6ea93f819..6b77b4fa3 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -84,6 +84,7 @@ int skill_get_unit_id(int id,int flag); int skill_get_inf2( int id ); int skill_get_maxcount( int id ); 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, -- cgit v1.2.3-70-g09d2