📄 pc.c
字号:
if((skill=pc_checkskill(sd,CR_TRUST))>0) { // 僼僃僀僗
sd->status.max_hp += skill*200;
sd->subele[6] += skill*5;
}
if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0)
sd->subele[3] += skill*5;
bl=sd->status.base_level;
sd->status.max_hp += (3500 + bl*hp_coefficient2[sd->status.class] + hp_sigma_val[sd->status.class][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
if(sd->hprate!=100)
sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
sd->status.max_hp = battle_config.max_hp;
// 嵟戝SP寁嶼
sd->status.max_sp += ((sp_coefficient[sd->status.class] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
if(sd->sprate!=100)
sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
sd->status.max_sp = battle_config.max_sp;
sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200);
if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) {
sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500);
if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff;
}
sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100);
if(sd->paramc[3] >= 120)
sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4;
if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) {
sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500);
if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff;
}
if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) {
sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500);
sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500);
if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff;
if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff;
}
if(sd->hprecov_rate != 100) {
sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100;
if(sd->nhealhp < 1) sd->nhealhp = 1;
}
if(sd->sprecov_rate != 100) {
sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
if(sd->nhealsp < 1) sd->nhealsp = 1;
}
// 庬懓懴惈乮偙傟偱偄偄偺丠 僨傿僶僀儞僾儘僥僋僔儑儞偲摨偠張棟偑偄傞偐傕乯
if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // 僪儔僑僲儘僕乕
skill = skill*4;
sd->addrace[9]+=skill;
sd->addrace_[9]+=skill;
sd->subrace[9]+=skill;
}
// 僗僉儖傗僗僥乕僞僗堎忢偵傛傞巆傝偺僷儔儊乕僞曗惓
if(sd->sc_count){
// ATK/DEF曄壔宍
if(sd->sc_data[SC_ANGELUS].timer!=-1) // 僄儞僕僃儔僗
sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100;
if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// 僀儞億僔僥傿僆儅僰僗
sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5;
index = sd->equip_index[8];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5;
}
if(sd->sc_data[SC_PROVOKE].timer!=-1){ // 僾儘儃僢僋
sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100;
sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
index = sd->equip_index[8];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
}
if(sd->sc_data[SC_POISON].timer!=-1) // 僾儘儃僢僋
sd->def2 = sd->def2*75/100;
if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // 愴懢屰偺嬁偒
sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
index = sd->equip_index[8];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
}
if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // 僯乕儀儖儞僌偺巜椫
index = sd->equip_index[9];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv >= 4)
sd->watk += sd->sc_data[SC_NIBELUNGEN].val2;
index = sd->equip_index[8];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv >= 4)
sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2;
}
if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // 儃儖働乕僲
sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
}
if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100;
if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // 僄僞乕僫儖僇僆僗
sd->def=0;
// ASPD/堏摦懍搙曄壔宯
if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
aspd_rate -= 30;
if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // 傾僪儗僫儕儞儔僢僔儏
if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
aspd_rate -= 30;
else
aspd_rate -= 25;
}
if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 &&
sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 僗僺傾僋傿僢働儞
aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // 梉梲偺傾僒僔儞僋儘僗
sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 &&
sd->sc_data[SC_DONTFORGETME].timer == -1)
aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3;
if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // 巹傪朰傟側偄偱
aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16);
sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
}
if( sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 ||
sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 ||
sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // 憹 懍億乕僔儑儞
aspd_rate -= sd->sc_data[i].val2;
// HIT/FLEE曄壔宯
if(sd->sc_data[SC_WHISTLE].timer!=-1){ // 岥揓
sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100;
sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10;
}
if(sd->sc_data[SC_HUMMING].timer!=-1) // 僴儈儞僌
sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2
+sd->sc_data[SC_HUMMING].val3) * sd->hit/100;
if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // 僶僀僆儗儞僩僎僀儖
sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100;
}
if(sd->sc_data[SC_BLIND].timer!=-1){ // 埫崟
sd->hit -= sd->hit*25/100;
sd->flee -= sd->flee*25/100;
}
// 懴惈
if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // 晄巰恎偺僕乕僋僼儕乕僪
sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // 悈
sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // 壩
}
if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // 僾儘償傿僨儞僗
sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // 懳 惞懏惈
sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // 懳 埆杺
}
// 偦偺懠
if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // 僀僪僁儞偺椦岀
sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1)
+sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100;
if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
sd->status.max_hp = battle_config.max_hp;
}
if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // 僨儕儏乕僕
sd->status.max_hp += sd->status.max_hp*sd->sc_data[SC_DELUGE].val3/100;
if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
sd->status.max_hp = battle_config.max_hp;
}
if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // 僒乕價僗僼僅乕儐乕
sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2
+sd->sc_data[SC_SERVICE4U].val3)/100;
if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
sd->status.max_sp = battle_config.max_sp;
sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2
+sd->sc_data[SC_SERVICE4U].val3);
if(sd->dsprate<0)sd->dsprate=0;
}
if(sd->sc_data[SC_FORTUNE].timer!=-1) // 岾塣偺僉僗
sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2
+sd->sc_data[SC_FORTUNE].val3)*10;
if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1) // 敋楐攇摦
sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
if(sd->sc_data[SC_STEELBODY].timer!=-1){ // 嬥崉
sd->def = 90;
sd->mdef = 90;
aspd_rate += 25;
sd->speed = (sd->speed * 125) / 100;
}
if(sd->sc_data[SC_DEFENDER].timer != -1) {
sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50);
sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
}
if(sd->sc_data[SC_ENCPOISON].timer != -1)
sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
if( sd->sc_data[SC_DANCING].timer!=-1 ) // 墘憈/僟儞僗巊梡拞
sd->speed*=4;
if(sd->sc_data[SC_CURSE].timer!=-1)
sd->speed += 450;
/* if(sd->sc_data[SC_VOLCANO].timer!=-1) // 僄儞僠儍儞僩億僀僘儞(懏惈偼battle.c偱)
sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
if(sd->sc_data[SC_DELUGE].timer!=-1) // 僄儞僠儍儞僩億僀僘儞(懏惈偼battle.c偱)
sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
*/
}
if(sd->speed_rate != 100)
sd->speed = sd->speed*sd->speed_rate/100;
if(sd->speed < 1) sd->speed = 1;
if(aspd_rate != 100)
sd->aspd = sd->aspd*aspd_rate/100;
if(pc_isriding(sd)) // 婻暫廋楙
sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100;
if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd;
sd->amotion = sd->aspd;
sd->dmotion = 800-sd->paramc[1]*4;
if(sd->dmotion<400)
sd->dmotion = 400;
if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
sd->prev_speed = sd->speed;
sd->speed = sd->speed*(175 - skill*5)/100;
}
if(sd->status.hp>sd->status.max_hp)
sd->status.hp=sd->status.max_hp;
if(sd->status.sp>sd->status.max_sp)
sd->status.sp=sd->status.max_sp;
if(first&4)
return 0;
if(first&3) {
clif_updatestatus(sd,SP_SPEED);
clif_updatestatus(sd,SP_MAXHP);
clif_updatestatus(sd,SP_MAXSP);
if(first&1) {
clif_updatestatus(sd,SP_HP);
clif_updatestatus(sd,SP_SP);
}
return 0;
}
if(b_class != sd->view_class) {
clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
#if PACKETVER < 4
clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
#else
clif_changelook(&sd->bl,LOOK_WEAPON,0);
#endif
}
if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange)
clif_skillinfoblock(sd); // 僗僉儖憲怣
if(b_speed != sd->speed)
clif_updatestatus(sd,SP_SPEED);
if(b_weight != sd->weight)
clif_updatestatus(sd,SP_WEIGHT);
if(b_max_weight != sd->max_weight) {
clif_updatestatus(sd,SP_MAXWEIGHT);
pc_checkweighticon(sd);
}
for(i=0;i<6;i++)
if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
clif_updatestatus(sd,SP_STR+i);
if(b_hit != sd->hit)
clif_updatestatus(sd,SP_HIT);
if(b_flee != sd->flee)
clif_updatestatus(sd,SP_FLEE1);
if(b_aspd != sd->aspd)
clif_updatestatus(sd,SP_ASPD);
if(b_watk != sd->watk || b_base_atk != sd->base_atk)
clif_updatestatus(sd,SP_ATK1);
if(b_def != sd->def)
clif_updatestatus(sd,SP_DEF1);
if(b_watk2 != sd->watk2)
clif_updatestatus(sd,SP_ATK2);
if(b_def2 != sd->def2)
clif_updatestatus(sd,SP_DEF2);
if(b_flee2 != sd->flee2)
clif_updatestatus(sd,SP_FLEE2);
if(b_critical != sd->critical)
clif_updatestatus(sd,SP_CRITICAL);
if(b_matk1 != sd->matk1)
clif_updatestatus(sd,SP_MATK1);
if(b_matk2 != sd->matk2)
clif_updatestatus(sd,SP_MATK2);
if(b_mdef != sd->mdef)
clif_updatestatus(sd,SP_MDEF1);
if(b_mdef2 != sd->mdef2)
clif_updatestatus(sd,SP_MDEF2);
if(b_attackrange != sd->attackrange)
clif_updatestatus(sd,SP_ATTACKRANGE);
if(b_max_hp != sd->status.max_hp)
clif_updatestatus(sd,SP_MAXHP);
if(b_max_sp != sd->status.max_sp)
clif_updatestatus(sd,SP_MAXSP);
if(b_hp != sd->status.hp)
clif_updatestatus(sd,SP_HP);
if(b_sp != sd->status.sp)
clif_updatestatus(sd,SP_SP);
/* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
clif_updatestatus(sd,SP_CARTINFO);*/
if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
(sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd))
// 僆乕僩僶乕僒乕僋敪摦
skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
return 0;
}
/*==========================================
* 憰 旛昳偵傛傞擻椡摍偺儃乕僫僗愝掕
*------------------------------------------
*/
int pc_bonus(struct map_session_data *sd,int type,int val)
{
switch(type){
case SP_STR:
case SP_AGI:
case SP_VIT:
case SP_INT:
case SP_DEX:
case SP_LUK:
if(sd->state.lr_flag != 2)
sd->parame[type-SP_STR]+=val;
break;
case SP_ATK1:
if(!sd->state.lr_flag)
sd->watk+=val;
else if(sd->state.lr_flag == 1)
sd->watk_+=val;
break;
case SP_ATK2:
if(!sd->state.lr_flag)
sd->watk2+=val;
else if(sd->state.lr_flag == 1)
sd->watk_2+=val;
break;
case SP_BASE_ATK:
if(sd->state.lr_flag != 2)
sd->base_atk+=val;
break;
case SP_MATK1:
if(sd->state.lr_flag != 2)
sd->matk1 += val;
break;
case SP_MATK2:
if(sd->state.lr_flag != 2)
sd->matk2 += val;
break;
case SP_MATK:
if(sd->state.lr_flag != 2) {
sd->matk1 += val;
sd->matk2 += val;
}
break;
case SP_DEF1:
if(sd->state.lr_flag != 2)
sd->def+=val;
break;
case SP_MDEF1:
if(sd->state.lr_flag != 2)
sd->mdef+=val;
break;
case SP_MDEF2:
if(sd->state.lr_flag != 2)
sd->mdef+=val;
break;
case SP_HIT:
if(sd->state.lr_flag != 2)
sd->hit+=val;
else
sd->arrow_hit+=val;
break;
case SP_FLEE1:
if(sd->state.lr_flag != 2)
sd->flee+=val;
break;
case SP_FLEE2:
if(sd->state.lr_flag != 2)
sd->flee2+=val*10;
break;
case SP_CRITICAL:
if(sd->state.lr_flag != 2)
sd->critical+=val*10;
else
sd->arrow_cri += val*10;
break;
case SP_ATKELE:
if(!sd->state.lr_flag)
sd->atk_ele=val;
else if(sd->state.lr_flag == 1)
sd->atk_ele_=val;
else if(sd->state.lr_flag == 2)
sd->arrow_ele=val;
break;
case SP_DEFELE:
if(sd->state.lr_flag != 2)
sd->def_ele=val;
break;
case SP_MAXHP:
if(sd->state.lr_flag != 2)
sd->status.max_hp+=val;
break;
case SP_MAXSP:
if(sd->state.lr_flag != 2)
sd->status.max_sp+=val;
break;
case SP_CASTRATE:
if(sd->state.lr_flag != 2)
sd->castrate+=val;
break;
case SP_MAXHPRATE:
if(sd->state.lr_flag != 2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -