📄 battle.c
字号:
}
int battle_get_atk2(struct block_list *bl)
{
if(bl->type==BL_PC)
return ((struct map_session_data*)bl)->watk2;
else {
struct status_change *sc_data=battle_get_sc_data(bl);
int atk2=0;
if(bl->type==BL_MOB)
atk2 = mob_db[((struct mob_data*)bl)->class].atk2;
else if(bl->type==BL_PET)
atk2 = mob_db[((struct pet_data*)bl)->class].atk2;
if(sc_data) {
if( sc_data[SC_IMPOSITIO].timer!=-1)
atk2 += sc_data[SC_IMPOSITIO].val1*5;
if( sc_data[SC_PROVOKE].timer!=-1 )
atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100;
if( sc_data[SC_CURSE].timer!=-1 )
atk2 -= atk2*25/100;
if(sc_data[SC_DRUMBATTLE].timer!=-1)
atk2 += sc_data[SC_DRUMBATTLE].val2;
if(sc_data[SC_NIBELUNGEN].timer!=-1 && (battle_get_element(bl)/10) >= 8 )
atk2 += sc_data[SC_NIBELUNGEN].val2;
if(sc_data[SC_STRIPWEAPON].timer!=-1)
atk2 -= atk2*90/100;
}
if(atk2 < 0) atk2 = 0;
return atk2;
}
return 0;
}
int battle_get_atk_2(struct block_list *bl)
{
if(bl->type==BL_PC)
return ((struct map_session_data*)bl)->watk_2;
else
return 0;
}
int battle_get_matk1(struct block_list *bl)
{
if(bl->type==BL_MOB){
int matk,int_=battle_get_int(bl);
matk = int_+(int_/5)*(int_/5);
return matk;
}
else if(bl->type==BL_PC)
return ((struct map_session_data *)bl)->matk1;
else if(bl->type==BL_PET){
int matk,int_=battle_get_int(bl);
matk = int_+(int_/5)*(int_/5);
return matk;
}
else
return 0;
}
int battle_get_matk2(struct block_list *bl)
{
if(bl->type==BL_MOB){
int matk,int_=battle_get_int(bl);
matk = int_+(int_/7)*(int_/7);
return matk;
}
else if(bl->type==BL_PC)
return ((struct map_session_data *)bl)->matk2;
else if(bl->type==BL_PET){
int matk,int_=battle_get_int(bl);
matk = int_+(int_/7)*(int_/7);
return matk;
}
else
return 0;
}
int battle_get_def(struct block_list *bl)
{
struct status_change *sc_data=battle_get_sc_data(bl);
int def=0,skilltimer=-1,skillid=0;
if(bl->type==BL_PC) {
def = ((struct map_session_data *)bl)->def;
skilltimer = ((struct map_session_data *)bl)->skilltimer;
skillid = ((struct map_session_data *)bl)->skillid;
}
else if(bl->type==BL_MOB) {
def = mob_db[((struct mob_data *)bl)->class].def;
skilltimer = ((struct mob_data *)bl)->skilltimer;
skillid = ((struct mob_data *)bl)->skillid;
}
else if(bl->type==BL_PET)
def = mob_db[((struct pet_data *)bl)->class].def;
if(def < 1000000) {
if(sc_data) {
if( sc_data[SC_KEEPING].timer!=-1)
def = 100;
if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
if( sc_data[SC_DRUMBATTLE].timer!=-1 && bl->type != BL_PC)
def += sc_data[SC_DRUMBATTLE].val3;
if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
def = def*75/100;
if(sc_data[SC_STRIPSHIELD].timer!=-1 && bl->type != BL_PC)
def = def*85/100;
if(sc_data[SC_SIGNUMCRUCIS].timer!=-1 && bl->type != BL_PC)
def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100;
if(sc_data[SC_ETERNALCHAOS].timer!=-1 && bl->type != BL_PC)
def = 0;
if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
def >>= 1;
}
if(skilltimer != -1) {
int def_rate = skill_get_castdef(skillid);
if(def_rate != 0)
def = (def * (100 - def_rate))/100;
}
}
if(def < 0) def = 0;
return def;
}
int battle_get_mdef(struct block_list *bl)
{
struct status_change *sc_data=battle_get_sc_data(bl);
int mdef=0;
if(bl->type==BL_PC)
mdef = ((struct map_session_data *)bl)->mdef;
else if(bl->type==BL_MOB)
mdef = mob_db[((struct mob_data *)bl)->class].mdef;
else if(bl->type==BL_PET)
mdef = mob_db[((struct pet_data *)bl)->class].mdef;
if(mdef < 1000000) {
if(sc_data) {
if(sc_data[SC_BARRIER].timer != -1)
mdef = 100;
if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
mdef = mdef*125/100;
}
}
if(mdef < 0) mdef = 0;
return mdef;
}
int battle_get_def2(struct block_list *bl)
{
struct status_change *sc_data=battle_get_sc_data(bl);
int def2=1;
if(bl->type==BL_PC)
def2 = ((struct map_session_data *)bl)->def2;
else if(bl->type==BL_MOB)
def2 = mob_db[((struct mob_data *)bl)->class].vit;
else if(bl->type==BL_PET)
def2 = mob_db[((struct pet_data *)bl)->class].vit;
if(sc_data) {
if( sc_data[SC_ANGELUS].timer!=-1 && bl->type != BL_PC)
def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100;
if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
def2 = def2*75/100;
}
if(def2 < 1) def2 = 1;
return def2;
}
int battle_get_mdef2(struct block_list *bl)
{
if(bl->type==BL_MOB)
return mob_db[((struct mob_data *)bl)->class].int_ + (mob_db[((struct mob_data *)bl)->class].vit>>1);
else if(bl->type==BL_PC)
return ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1);
else if(bl->type==BL_PET)
return mob_db[((struct pet_data *)bl)->class].int_ + (mob_db[((struct pet_data *)bl)->class].vit>>1);
else
return 0;
}
int battle_get_speed(struct block_list *bl)
{
if(bl->type == BL_PC)
return ((struct map_session_data *)bl)->speed;
else {
struct status_change *sc_data=battle_get_sc_data(bl);
int speed = 1000;
if(bl->type == BL_MOB)
speed = mob_db[((struct mob_data *)bl)->class].speed;
else if(bl->type == BL_PET)
speed = ((struct pet_data *)bl)->msd->petDB->speed;
if(sc_data) {
if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1)
speed -= speed*25/100;
if(sc_data[SC_DECREASEAGI].timer!=-1)
speed = speed*125/100;
if(sc_data[SC_QUAGMIRE].timer!=-1)
speed = speed*3/2;
if(sc_data[SC_DONTFORGETME].timer!=-1)
speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100;
if(sc_data[SC_STEELBODY].timer!=-1)
speed = speed*125/100;
if(sc_data[SC_DEFENDER].timer!=-1)
speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;
if(sc_data[SC_DANCING].timer!=-1 )
speed*=4;
if(sc_data[SC_CURSE].timer!=-1)
speed = speed + 450;
}
if(speed < 1) speed = 1;
return speed;
}
return 1000;
}
int battle_get_adelay(struct block_list *bl)
{
if(bl->type == BL_PC)
return (((struct map_session_data *)bl)->aspd<<1);
else {
struct status_change *sc_data=battle_get_sc_data(bl);
int adelay=4000,aspd_rate = 100,i;
if(bl->type == BL_MOB)
adelay = mob_db[((struct mob_data *)bl)->class].adelay;
else if(bl->type == BL_PET)
adelay = mob_db[((struct pet_data *)bl)->class].adelay;
if(sc_data) {
if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
aspd_rate -= 30;
if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // 傾僪儗僫儕儞儔僢僔儏
if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
aspd_rate -= 30;
else
aspd_rate -= 25;
}
if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 僗僺傾僋傿僢働儞
aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
if(sc_data[SC_ASSNCROS].timer!=-1 && // 梉梲偺傾僒僔儞僋儘僗
sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
sc_data[SC_DONTFORGETME].timer == -1)
aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
if(sc_data[SC_DONTFORGETME].timer!=-1) // 巹傪朰傟側偄偱
aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
if(sc_data[SC_STEELBODY].timer!=-1) // 嬥崉
aspd_rate += 25;
if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
aspd_rate -= sc_data[i].val2;
if(sc_data[SC_DEFENDER].timer != -1)
adelay += (1100 - sc_data[SC_DEFENDER].val1*100);
}
if(aspd_rate != 100)
adelay = adelay*aspd_rate/100;
if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1;
return adelay;
}
return 4000;
}
int battle_get_amotion(struct block_list *bl)
{
if(bl->type==BL_PC)
return ((struct map_session_data *)bl)->amotion;
else {
struct status_change *sc_data=battle_get_sc_data(bl);
int amotion=2000,aspd_rate = 100,i;
if(bl->type == BL_MOB)
amotion = mob_db[((struct mob_data *)bl)->class].amotion;
else if(bl->type == BL_PET)
amotion = mob_db[((struct pet_data *)bl)->class].amotion;
if(sc_data) {
if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
aspd_rate -= 30;
if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // 傾僪儗僫儕儞儔僢僔儏
if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
aspd_rate -= 30;
else
aspd_rate -= 25;
}
if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 僗僺傾僋傿僢働儞
aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
if(sc_data[SC_ASSNCROS].timer!=-1 && // 梉梲偺傾僒僔儞僋儘僗
sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
sc_data[SC_DONTFORGETME].timer == -1)
aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
if(sc_data[SC_DONTFORGETME].timer!=-1) // 巹傪朰傟側偄偱
aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
if(sc_data[SC_STEELBODY].timer!=-1) // 嬥崉
aspd_rate += 25;
if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
aspd_rate -= sc_data[i].val2;
if(sc_data[SC_DEFENDER].timer != -1)
amotion += (550 - sc_data[SC_DEFENDER].val1*50);
}
if(aspd_rate != 100)
amotion = amotion*aspd_rate/100;
if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd;
return amotion;
}
return 2000;
}
int battle_get_dmotion(struct block_list *bl)
{
int ret;
struct status_change *sc_data=battle_get_sc_data(bl);
if(bl->type==BL_MOB) {
ret=mob_db[((struct mob_data *)bl)->class].dmotion;
if(battle_config.monster_damage_delay_rate != 100)
ret = ret*battle_config.monster_damage_delay_rate/100;
}
else if(bl->type==BL_PC) {
ret=((struct map_session_data *)bl)->dmotion;
if(battle_config.pc_damage_delay_rate != 100)
ret = ret*battle_config.pc_damage_delay_rate/100;
}
else if(bl->type==BL_PET)
ret=mob_db[((struct pet_data *)bl)->class].dmotion;
else
return 2000;
if((sc_data && sc_data[SC_ENDURE].timer!=-1) ||
(bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
ret=0;
return ret;
}
int battle_get_element(struct block_list *bl)
{
int ret = 20;
struct status_change *sc_data=battle_get_sc_data(bl);
if(bl->type==BL_MOB) // 10偺埵亖Lv*2丄侾偺埵亖懏惈
ret=((struct mob_data *)bl)->def_ele;
else if(bl->type==BL_PC)
ret=20+((struct map_session_data *)bl)->def_ele; // 杊屼懏惈Lv1
else if(bl->type==BL_PET)
ret = mob_db[((struct pet_data *)bl)->class].element;
if(sc_data) {
if( sc_data[SC_BENEDICTIO].timer!=-1 ) // 惞懱崀暉
ret=26;
if( sc_data[SC_FREEZE].timer!=-1 ) // 搥寢
ret=21;
if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
ret=22;
}
return ret;
}
int battle_get_attack_element(struct block_list *bl)
{
int ret = 0;
struct status_change *sc_data=battle_get_sc_data(bl);
if(bl->type==BL_MOB)
ret=0;
else if(bl->type==BL_PC)
ret=((struct map_session_data *)bl)->atk_ele;
else if(bl->type==BL_PET)
ret=0;
if(sc_data) {
if( sc_data[SC_FROSTWEAPON].timer!=-1) // 僼儘僗僩僂僃億儞
ret=1;
if( sc_data[SC_SEISMICWEAPON].timer!=-1) // 僒僀僘儈僢僋僂僃億儞
ret=2;
if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // 僼儗乕儉儔儞僠儍乕
ret=3;
if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // 儔僀僩僯儞僌儘乕僟乕
ret=4;
if( sc_data[SC_ENCPOISON].timer!=-1) // 僄儞僠儍儞僩億僀僘儞
ret=5;
if( sc_data[SC_ASPERSIO].timer!=-1) // 傾僗儁儖僔僆
ret=6;
}
return ret;
}
int battle_get_attack_element2(struct block_list *bl)
{
if(bl->type==BL_PC) {
int ret = ((struct map_session_data *)bl)->atk_ele_;
struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data;
if(sc_data) {
if( sc_data[SC_FROSTWEAPON].timer!=-1) // 僼儘僗僩僂僃億儞
ret=1;
if( sc_data[SC_SEISMICWEAPON].timer!=-1) // 僒僀僘儈僢僋僂僃億儞
ret=2;
if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // 僼儗乕儉儔儞僠儍乕
ret=3;
if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // 儔僀僩僯儞僌儘乕僟乕
ret=4;
if( sc_data[SC_ENCPOISON].timer!=-1) // 僄儞僠儍儞僩億僀僘儞
ret=5;
if( sc_data[SC_ASPERSIO].timer!=-1) // 傾僗儁儖僔僆
ret=6;
}
return ret;
}
return 0;
}
int battle_get_party_id(struct block_list *bl)
{
if( bl->type == BL_PC )
return ((struct map_session_data *)bl)->status.party_id;
else if( bl->type==BL_MOB ){
struct mob_data *md=(struct mob_data *)bl;
if( md->master_id>0 )
return -md->master_id;
return -md->bl.id;
}
else if( bl->type==BL_SKILL )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -