diff options
Diffstat (limited to 'src/map/pc.c')
-rw-r--r-- | src/map/pc.c | 102 |
1 files changed, 44 insertions, 58 deletions
diff --git a/src/map/pc.c b/src/map/pc.c index acec322..e2f8eec 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -38,8 +38,6 @@ #define STATE_BLIND 0x10 -#define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args) - #define MAP_LOG_STATS(sd, suffix) \ MAP_LOG_PC(sd, "STAT %d %d %d %d %d %d " suffix, \ sd->status.str, sd->status.agi, sd->status.vit, sd->status.int_, sd->status.dex, sd->status.luk) @@ -853,6 +851,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, short tmw_versio strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), gmtime(&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); } + pc_calcstatus(sd,1); return 0; } @@ -875,23 +874,17 @@ int pc_authfail(int id) { static int pc_calc_skillpoint(struct map_session_data* sd) { - int i,skill,skill_point=0; + int i, skill_points = 0; nullpo_retr(0, sd); - for(i=1;i<MAX_SKILL;i++){ - if( (skill = pc_checkskill(sd,i)) > 0) { - if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) { - if(!sd->status.skill[i].flag) - skill_point += skill; - else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) { - skill_point += (sd->status.skill[i].flag - 2); - } - } - } - } + for (i = 0; i < skill_pool_skills_size; i++) { + int lv = sd->status.skill[skill_pool_skills[i]].lv; + if (lv) + skill_points += ((lv * (lv + 1)) >> 1) - 1; + } - return skill_point; + return skill_points; } /*========================================== @@ -997,6 +990,7 @@ int pc_calc_skilltree(struct map_session_data *sd) } } + /*Comment this out for now, as we manage skills differently for(i=0;i<MAX_SKILL;i++) if (i < TMW_MAGIC || i > TMW_MAGIC_END){ // [Fate] This hack gets TMW magic working and persisted without bothering about the skill tree. if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0; @@ -1005,6 +999,7 @@ int pc_calc_skilltree(struct map_session_data *sd) sd->status.skill[i].flag=0; // flag��0�ɂ��Ă��� } } + */ if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){ // �S�ẴX�L�� @@ -1379,6 +1374,13 @@ int pc_calcstatus(struct map_session_data* sd,int first) } } + if (battle_is_unarmed(&sd->bl)) { + sd->watk += skill_power(sd, TMW_BRAWLING) / 3; // +66 for 200 + sd->watk2 += skill_power(sd, TMW_BRAWLING) >> 3; // +25 for 200 + sd->watk_ += skill_power(sd, TMW_BRAWLING) / 3; // +66 for 200 + sd->watk_2 += skill_power(sd, TMW_BRAWLING) >> 3; // +25 for 200 + } + if(sd->equip_index[10] >= 0){ // �� index = sd->equip_index[10]; if(sd->inventory_data[index]){ //�܂�����������Ă��Ȃ� @@ -1429,9 +1431,6 @@ int pc_calcstatus(struct map_session_data* sd,int first) if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris] sd->max_weight += skill*1000; - if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // �ӂ��낤�̖� - sd->paramb[4] += skill; - // �X�e�[�^�X�ω��ɂ������{�p�����[�^� if(sd->sc_count){ if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // �W���͌��� @@ -1469,6 +1468,10 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->paramb[5]+= 5; } } + sd->speed -= skill_power(sd, TMW_SPEED) >> 3; + sd->aspd_rate -= skill_power(sd, TMW_SPEED) / 10; + if (sd->aspd_rate < 20) + sd->aspd_rate = 20; //1�x�����łȂ�Job70�X�p�m�r��+10 if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){ @@ -1562,10 +1565,15 @@ int pc_calcstatus(struct map_session_data* sd,int first) if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // ���V�̖� sd->hit += skill; - if(sd->status.weapon == 11) + if (sd->status.weapon == 11) sd->attackrange += skill; } + if (sd->attackrange > 2) { // [fate] ranged weapon? + sd->attackrange += MIN(skill_power(sd, AC_OWL) / 60, 3); + sd->hit += skill_power(sd, AC_OWL) / 10; // 20 for 200 + } + if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // ���팤���̖��������� sd->hit += skill*2; if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // �g���l���h���C�u // �g���l���h���C�u @@ -2652,12 +2660,7 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag) clif_skillinfoblock(sd); } else if(sd->status.skill[id].lv < level){ // �o�������邪lv���������Ȃ� - if(sd->status.skill[id].id==id) - sd->status.skill[id].flag=sd->status.skill[id].lv+2; // lv���L�� - else { - sd->status.skill[id].id=id; - sd->status.skill[id].flag=1; // card�X�L���Ƃ��� - } + sd->status.skill[id].id=id; sd->status.skill[id].lv=level; } @@ -4356,6 +4359,7 @@ int pc_checkbaselevelup(struct map_session_data *sd) //���x���A�b�v�����̂Ńp�[�e�B�[�������X�V���� //(��͈̓`�F�b�N) party_send_movemap(sd); + MAP_LOG_XP(sd, "LEVELUP") return 1; } @@ -4754,22 +4758,18 @@ int pc_skillup(struct map_session_data *sd,int skill_num) { nullpo_retr(0, sd); - if( skill_num>=10000 ){ - guild_skillup(sd,skill_num); - return 0; - } - - if( sd->status.skill_point>0 && - sd->status.skill[skill_num].id!=0 && - sd->status.skill[skill_num].lv < skill_get_max(skill_num) - && (skill_num < TMW_MAGIC || skill_num > TMW_MAGIC_END)) // [Fate] Hack: Prevent exploit for raising magic levels - { + if (sd->status.skill[skill_num].id !=0 + && sd->status.skill_point > sd->status.skill[skill_num].lv + && sd->status.skill[skill_num].lv < skill_db[skill_num].max_raise) { sd->status.skill[skill_num].lv++; - sd->status.skill_point--; + sd->status.skill_point -= sd->status.skill[skill_num].lv; + pc_calcstatus(sd,0); clif_skillup(sd,skill_num); clif_updatestatus(sd,SP_SKILLPOINT); clif_skillinfoblock(sd); + MAP_LOG_PC(sd, "SKILLUP %d %d %d", + skill_num, sd->status.skill[skill_num].lv, skill_power(sd, skill_num)); } return 0; @@ -4792,13 +4792,8 @@ int pc_allskillup(struct map_session_data *sd) c = s_class.job; s = (s_class.upper==1) ? 1 : 0 ; //�]���ȊO�͒ʏ��̃X�L���H - for(i=0;i<MAX_SKILL;i++){ + for(i=0;i<MAX_SKILL;i++) sd->status.skill[i].id=0; - if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // card�X�L���Ȃ��A - sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // �{����lv�� - sd->status.skill[i].flag=0; // flag��0�ɂ��Ă��� - } - } if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){ // �S�ẴX�L�� @@ -4811,7 +4806,7 @@ 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) ) + if(sd->status.skill[id].id==0 && skill_get_inf2(id)&0x01 ) sd->status.skill[id].lv=skill_get_max(id); } } @@ -4967,23 +4962,14 @@ int pc_resetskill(struct map_session_data* sd) nullpo_retr(0, sd); - for(i=1;i<MAX_SKILL;i++){ + sd->status.skill_point += pc_calc_skillpoint(sd); + + for(i=1;i<MAX_SKILL;i++) if( (skill = pc_checkskill(sd,i)) > 0) { - if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) { - if(!sd->status.skill[i].flag && !QUEST_SKILL(i)) - sd->status.skill_point += skill; - else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) { - sd->status.skill_point += (sd->status.skill[i].flag - 2); - } - sd->status.skill[i].lv = 0; - } - else if(battle_config.quest_skill_reset) - sd->status.skill[i].lv = 0; - sd->status.skill[i].flag = 0; - } - else sd->status.skill[i].lv = 0; - } + sd->status.skill[i].flags = 0; + } + clif_updatestatus(sd,SP_SKILLPOINT); clif_skillinfoblock(sd); pc_calcstatus(sd,0); |