📄 pc.c
字号:
b_hp = sd->status.hp;
b_sp = sd->status.sp;
b_weight = sd->weight;
b_max_weight = sd->max_weight;
memcpy(b_paramb,&sd->paramb,sizeof(b_paramb));
memcpy(b_parame,&sd->paramc,sizeof(b_parame));
memcpy(b_skill,&sd->status.skill,sizeof(b_skill));
b_hit = sd->hit;
b_flee = sd->flee;
b_aspd = sd->aspd;
b_watk = sd->watk;
b_def = sd->def;
b_watk2 = sd->watk2;
b_def2 = sd->def2;
b_flee2 = sd->flee2;
b_critical = sd->critical;
b_attackrange = sd->attackrange;
b_matk1 = sd->matk1;
b_matk2 = sd->matk2;
b_mdef = sd->mdef;
b_mdef2 = sd->mdef2;
b_class = sd->view_class;
sd->view_class = sd->status.class;
b_base_atk = sd->base_atk;
pc_calc_skilltree(sd); // 僗僉儖僣儕乕偺寁嶼
sd->max_weight = max_weight_base[sd->status.class]+sd->status.str*300;
if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // 強帩検憹壛
sd->max_weight += skill*1000;
if(first&1) {
sd->weight=0;
for(i=0;i<MAX_INVENTORY;i++){
if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL)
continue;
sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount;
}
sd->cart_max_weight=battle_config.max_cart_weight;
sd->cart_weight=0;
sd->cart_max_num=MAX_CART;
sd->cart_num=0;
for(i=0;i<MAX_CART;i++){
if(sd->status.cart[i].nameid==0)
continue;
sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount;
sd->cart_num++;
}
}
memset(sd->paramb,0,sizeof(sd->paramb));
memset(sd->parame,0,sizeof(sd->parame));
sd->hit = 0;
sd->flee = 0;
sd->flee2 = 0;
sd->critical = 0;
sd->aspd = 0;
sd->watk = 0;
sd->def = 0;
sd->mdef = 0;
sd->watk2 = 0;
sd->def2 = 0;
sd->mdef2 = 0;
sd->status.max_hp = 0;
sd->status.max_sp = 0;
sd->attackrange = 0;
sd->attackrange_ = 0;
sd->atk_ele = 0;
sd->def_ele = 0;
sd->star =0;
sd->overrefine =0;
sd->matk1 =0;
sd->matk2 =0;
sd->speed = DEFAULT_WALK_SPEED ;
sd->hprate=100;
sd->sprate=100;
sd->castrate=100;
sd->dsprate=100;
sd->base_atk=0;
sd->arrow_atk=0;
sd->arrow_ele=0;
sd->arrow_hit=0;
sd->arrow_range=0;
sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0;
memset(sd->addele,0,sizeof(sd->addele));
memset(sd->addrace,0,sizeof(sd->addrace));
memset(sd->addsize,0,sizeof(sd->addsize));
memset(sd->addele_,0,sizeof(sd->addele_));
memset(sd->addrace_,0,sizeof(sd->addrace_));
memset(sd->addsize_,0,sizeof(sd->addsize_));
memset(sd->subele,0,sizeof(sd->subele));
memset(sd->subrace,0,sizeof(sd->subrace));
memset(sd->addeff,0,sizeof(sd->addeff));
memset(sd->reseff,0,sizeof(sd->reseff));
memset(&sd->special_state,0,sizeof(sd->special_state));
memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
sd->watk_ = 0; //擇搧棳梡(壖)
sd->watk_2 = 0;
sd->atk_ele_ = 0;
sd->star_ = 0;
sd->overrefine_ = 0;
sd->aspd_rate = 100;
sd->speed_rate = 100;
sd->hprecov_rate = 100;
sd->sprecov_rate = 100;
sd->critical_def = 0;
sd->double_rate = 0;
sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
sd->atk_rate = sd->matk_rate = 100;
sd->ignore_def_ele = sd->ignore_def_race = 0;
sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
sd->arrow_cri = 0;
sd->magic_def_rate = sd->misc_def_rate = 0;
memset(sd->arrow_addele,0,sizeof(sd->arrow_addele));
memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace));
memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize));
memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff));
memset(sd->magic_addele,0,sizeof(sd->magic_addele));
memset(sd->magic_addrace,0,sizeof(sd->magic_addrace));
memset(sd->magic_subrace,0,sizeof(sd->magic_subrace));
sd->perfect_hit = 0;
sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
sd->get_zeny_num = 0;
sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
sd->add_def_class_count = sd->add_mdef_class_count = 0;
sd->monster_drop_item_count = 0;
memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race));
memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate));
sd->speed_add_rate = sd->aspd_add_rate = 100;
sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
sd->splash_range = sd->splash_add_range = 0;
sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0;
sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0;
sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
for(i=0;i<10;i++) {
index = sd->equip_index[i];
if(index < 0)
continue;
if(i == 9 && sd->equip_index[8] == index)
continue;
if(i == 5 && sd->equip_index[4] == index)
continue;
if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
continue;
if(sd->inventory_data[index]) {
if(sd->inventory_data[index]->type == 4) {
if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
int j;
for(j=0;j<sd->inventory_data[index]->slot;j++){ // 僇乕僪
int c=sd->status.inventory[index].card[j];
if(c>0){
if(i == 8 && sd->status.inventory[index].equip == 0x20)
sd->state.lr_flag = 1;
run_script(itemdb_equipscript(c),0,sd->bl.id,0);
sd->state.lr_flag = 0;
}
}
}
}
else if(sd->inventory_data[index]->type==5){ // 杊嬶
if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
int j;
for(j=0;j<sd->inventory_data[index]->slot;j++){ // 僇乕僪
int c=sd->status.inventory[index].card[j];
if(c>0)
run_script(itemdb_equipscript(c),0,sd->bl.id,0);
}
}
}
}
}
wele = sd->atk_ele;
wele_ = sd->atk_ele_;
def_ele = sd->def_ele;
if(battle_config.pet_status_support) {
if(sd->status.pet_id > 0 && sd->petDB && sd->pet.intimate > 0)
run_script(sd->petDB->script,0,sd->bl.id,0);
pele = sd->atk_ele;
pdef_ele = sd->def_ele;
sd->atk_ele = sd->def_ele = 0;
}
memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard));
// 憰旛昳偵傛傞僗僥乕僞僗曄壔偼偙偙偱幚峴
for(i=0;i<10;i++) {
index = sd->equip_index[i];
if(index < 0)
continue;
if(i == 9 && sd->equip_index[8] == index)
continue;
if(i == 5 && sd->equip_index[4] == index)
continue;
if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
continue;
if(sd->inventory_data[index]) {
sd->def += sd->inventory_data[index]->def;
if(sd->inventory_data[index]->type == 4) {
int r,wlv = sd->inventory_data[index]->wlv;
if(i == 8 && sd->status.inventory[index].equip == 0x20) {
//擇搧棳梡僨乕僞擖椡
sd->watk_ += sd->inventory_data[index]->atk;
sd->watk_2 = (r=sd->status.inventory[index].refine)* // 惛楤峌寕椡
refinebonus[wlv][0];
if( (r-=refinebonus[wlv][2])>0 ) // 夁忚惛楤儃乕僫僗
sd->overrefine_ = r*refinebonus[wlv][1];
if(sd->status.inventory[index].card[0]==0x00ff){ // 惢憿晲婍
sd->star_ = (sd->status.inventory[index].card[1]>>8); // 惎偺偐偗傜
wele_= (sd->status.inventory[index].card[1]&0x0f); // 懏 惈
}
sd->attackrange_ += sd->inventory_data[index]->range;
sd->state.lr_flag = 1;
run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
sd->state.lr_flag = 0;
}
else { //擇搧棳晲婍埲奜
sd->watk += sd->inventory_data[index]->atk;
sd->watk2 += (r=sd->status.inventory[index].refine)* // 惛楤峌寕椡
refinebonus[wlv][0];
if( (r-=refinebonus[wlv][2])>0 ) // 夁忚惛楤儃乕僫僗
sd->overrefine += r*refinebonus[wlv][1];
if(sd->status.inventory[index].card[0]==0x00ff){ // 惢憿晲婍
sd->star += (sd->status.inventory[index].card[1]>>8); // 惎偺偐偗傜
wele = (sd->status.inventory[index].card[1]&0x0f); // 懏 惈
}
sd->attackrange += sd->inventory_data[index]->range;
run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
}
}
else if(sd->inventory_data[index]->type == 5) {
sd->watk += sd->inventory_data[index]->atk;
refinedef += sd->status.inventory[index].refine*refinebonus[0][0];
run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
}
}
}
if(sd->equip_index[10] >= 0){ // 栴
index = sd->equip_index[10];
if(sd->inventory_data[index]){ //傑偩懏惈偑擖偭偰偄側偄
sd->state.lr_flag = 2;
run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
sd->state.lr_flag = 0;
sd->arrow_atk += sd->inventory_data[index]->atk;
}
}
sd->def += (refinedef+50)/100;
if(sd->attackrange < 1) sd->attackrange = 1;
if(sd->attackrange_ < 1) sd->attackrange_ = 1;
if(sd->attackrange < sd->attackrange_)
sd->attackrange = sd->attackrange_;
if(sd->status.weapon == 11)
sd->attackrange += sd->arrow_range;
if(wele > 0)
sd->atk_ele = wele;
if(wele_ > 0)
sd->atk_ele_ = wele_;
if(def_ele > 0)
sd->def_ele = def_ele;
if(battle_config.pet_status_support) {
if(pele > 0 && !sd->atk_ele)
sd->atk_ele = pele;
if(pdef_ele > 0 && !sd->def_ele)
sd->def_ele = pdef_ele;
}
sd->double_rate += sd->double_add_rate;
sd->perfect_hit += sd->perfect_hit_add;
sd->get_zeny_num += sd->get_zeny_add_num;
sd->splash_range += sd->splash_add_range;
if(sd->speed_add_rate != 100)
sd->speed_rate += sd->speed_add_rate - 100;
if(sd->aspd_add_rate != 100)
sd->aspd_rate += sd->aspd_add_rate - 100;
// 晲婍ATK僒僀僘曗惓 (塃庤)
sd->atkmods[0] = atkmods[0][sd->weapontype1];
sd->atkmods[1] = atkmods[1][sd->weapontype1];
sd->atkmods[2] = atkmods[2][sd->weapontype1];
//晲婍ATK僒僀僘曗惓 (嵍庤)
sd->atkmods_[0] = atkmods[0][sd->weapontype2];
sd->atkmods_[1] = atkmods[1][sd->weapontype2];
sd->atkmods_[2] = atkmods[2][sd->weapontype2];
// job儃乕僫僗暘
for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++)
if(job_bonus[sd->status.class][i])
sd->paramb[job_bonus[sd->status.class][i]-1]++;
if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // 傆偔傠偆偺栚
sd->paramb[4] += skill;
// 僗僥乕僞僗曄壔偵傛傞婎杮僷儔儊乕僞曗惓
if(sd->sc_count){
if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // 廤拞椡岦忋
sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
}
if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // 懍搙憹壛
sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
sd->speed -= sd->speed *25/100;
}
if(sd->sc_data[SC_DECREASEAGI].timer!=-1) // 懍搙尭彮(agi偼battle.c偱)
sd->speed = sd->speed *125/100;
if(sd->sc_data[SC_BLESSING].timer!=-1){ // 僽儗僢僔儞僌
sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1;
}
if(sd->sc_data[SC_GLORIA].timer!=-1) // 僌儘儕傾
sd->paramb[5]+= 30;
if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // 儔僂僪儃僀僗
sd->paramb[0]+= 4;
if(sd->sc_data[SC_QUAGMIRE].timer!=-1) // 僋傽僌儅僀傾(AGI/DEX偼battle.c偱)
sd->speed = sd->speed*3/2;
}
sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0];
sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1];
sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2];
sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3];
sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4];
sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5];
for(i=0;i<6;i++)
if(sd->paramc[i] < 0) sd->paramc[i] = 0;
if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) {
str = sd->paramc[4];
dex = sd->paramc[0];
}
else {
str = sd->paramc[0];
dex = sd->paramc[4];
}
dstr = str/10;
sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5;
sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5);
sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7);
if(sd->matk1 < sd->matk2) {
int temp = sd->matk2;
sd->matk2 = sd->matk1;
sd->matk1 = temp;
}
sd->hit += sd->paramc[4] + sd->status.base_level;
sd->flee += sd->paramc[1] + sd->status.base_level;
sd->def2 += sd->paramc[2];
sd->mdef2 += sd->paramc[3];
sd->flee2 += sd->paramc[5]+10;
sd->critical += (sd->paramc[5]*3)+10;
if(sd->base_atk < 1)
sd->base_atk = 1;
if(sd->critical_rate != 100)
sd->critical = (sd->critical*sd->critical_rate)/100;
if(sd->critical < 10) sd->critical = 10;
if(sd->hit_rate != 100)
sd->hit = (sd->hit*sd->hit_rate)/100;
if(sd->hit < 1) sd->hit = 1;
if(sd->flee_rate != 100)
sd->flee = (sd->flee*sd->flee_rate)/100;
if(sd->flee < 1) sd->flee = 1;
if(sd->flee2_rate != 100)
sd->flee2 = (sd->flee2*sd->flee2_rate)/100;
if(sd->flee2 < 10) sd->flee2 = 10;
if(sd->def_rate != 100)
sd->def = (sd->def*sd->def_rate)/100;
if(sd->def < 0) sd->def = 0;
if(sd->def2_rate != 100)
sd->def2 = (sd->def2*sd->def2_rate)/100;
if(sd->def2 < 1) sd->def2 = 1;
if(sd->mdef_rate != 100)
sd->mdef = (sd->mdef*sd->mdef_rate)/100;
if(sd->mdef < 0) sd->mdef = 0;
if(sd->mdef2_rate != 100)
sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100;
if(sd->mdef2 < 1) sd->mdef2 = 1;
// 擇搧棳 ASPD 廋惓
if (sd->status.weapon <= 16)
sd->aspd += aspd_base[sd->status.class][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[sd->status.class][sd->status.weapon]/1000;
else
sd->aspd += (
(aspd_base[sd->status.class][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[sd->status.class][sd->weapontype1]/1000) +
(aspd_base[sd->status.class][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[sd->status.class][sd->weapontype2]/1000)
) * 140 / 200;
aspd_rate = sd->aspd_rate;
//峌寕懍搙憹壛
if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // 儚僔偺栚
sd->hit += skill;
if(sd->status.weapon == 11)
sd->attackrange += skill;
}
if( (skill=pc_checkskill(sd,TF_MISS))>0 ) // 夞旔棪憹壛
sd->flee += skill*3;
if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // 尒愗傝
sd->flee += (skill*3)>>1;
if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // 晲婍尋媶偺柦拞棪憹壛
sd->hit += skill*2;
if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // 僩儞僱儖僪儔僀僽 // 僩儞僱儖僪儔僀僽
sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // 僇乕僩偵傛傞懍搙掅壓
sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1);
else if (pc_isriding(sd)) // 儁僐儁僐忔傝偵傛傞懍搙憹壛
sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -