亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? battle.c

?? 最新的仙鏡傳說服務器C語言源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "battle.h"

#include "timer.h"

#include "map.h"
#include "pc.h"
#include "skill.h"
#include "mob.h"
#include "itemdb.h"
#include "clif.h"
#include "pet.h"
#include "guild.h"

int attr_fix_table[4][10][10];

struct Battle_Config battle_config;

static int distance(int x0,int y0,int x1,int y1)
{
	int dx,dy;

	dx=abs(x0-x1);
	dy=abs(y0-y1);
	return dx>dy ? dx : dy;
}

// 奺庬僷儔儊乕僞強摼

int battle_counttargeted(struct block_list *bl,struct block_list *src)
{
	if(bl->type == BL_PC)
		return pc_counttargeted((struct map_session_data *)bl,src);
	else if(bl->type == BL_MOB)
		return mob_counttargeted((struct mob_data *)bl,src);
	return 0;
}

int battle_get_class(struct block_list *bl)
{
	if(bl->type==BL_MOB)
		return ((struct mob_data *)bl)->class;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->status.class;
	else if(bl->type==BL_PET)
		return ((struct pet_data *)bl)->class;
	else
		return 0;
}
int battle_get_dir(struct block_list *bl)
{
	if(bl->type==BL_MOB)
		return ((struct mob_data *)bl)->dir;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->dir;
	else if(bl->type==BL_PET)
		return ((struct pet_data *)bl)->dir;
	else
		return 0;
}
int battle_get_lv(struct block_list *bl)
{
	if(bl->type==BL_MOB)
		return mob_db[((struct mob_data *)bl)->class].lv;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->status.base_level;
	else if(bl->type==BL_PET)
		return ((struct pet_data *)bl)->msd->pet.level;
	else
		return 0;
}
int battle_get_range(struct block_list *bl)
{
	if(bl->type==BL_MOB)
		return mob_db[((struct mob_data *)bl)->class].range;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->attackrange;
	else if(bl->type==BL_PET)
		return mob_db[((struct pet_data *)bl)->class].range;
	else
		return 0;
}
int battle_get_hp(struct block_list *bl)
{
	if(bl->type==BL_MOB)
		return ((struct mob_data *)bl)->hp;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->status.hp;
	else
		return 1;
}
int battle_get_max_hp(struct block_list *bl)
{
	if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->status.max_hp;
	else {
		struct status_change *sc_data=battle_get_sc_data(bl);
		int max_hp=1;
		if(bl->type==BL_MOB) {
			max_hp = mob_db[((struct mob_data*)bl)->class].max_hp;
			if(mob_db[((struct mob_data*)bl)->class].mexp > 0) {
				if(battle_config.mvp_hp_rate != 100)
					max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
			}
			else {
				if(battle_config.monster_hp_rate != 100)
					max_hp = (max_hp * battle_config.monster_hp_rate)/100;
			}
		}
		else if(bl->type==BL_PET) {
			max_hp = mob_db[((struct pet_data*)bl)->class].max_hp;
			if(mob_db[((struct pet_data*)bl)->class].mexp > 0) {
				if(battle_config.mvp_hp_rate != 100)
					max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
			}
			else {
				if(battle_config.monster_hp_rate != 100)
					max_hp = (max_hp * battle_config.monster_hp_rate)/100;
			}
		}
		if(sc_data) {
			if(sc_data[SC_APPLEIDUN].timer!=-1)
				max_hp += ((5+sc_data[SC_APPLEIDUN].val1*2+((sc_data[SC_APPLEIDUN].val2+1)>>1)
						+sc_data[SC_APPLEIDUN].val3/10) * max_hp)/100;
		}
		if(max_hp < 1) max_hp = 1;
		return max_hp;
	}
	return 1;
}
int battle_get_str(struct block_list *bl)
{
	int str=0;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_MOB)
		str = mob_db[((struct mob_data *)bl)->class].str;
	else if(bl->type==BL_PC)
		return ((struct map_session_data *)bl)->paramc[0];
	else if(bl->type==BL_PET)
		str = mob_db[((struct pet_data *)bl)->class].str;

	if(sc_data) {
		if(sc_data[SC_LOUD].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
			str += 4;
		if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){	// 僽儗僢僔儞僌
			int race=battle_get_race(bl);
			if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 )	str >>= 1;	// 埆 杺/晄巰
			else str += sc_data[SC_BLESSING].val1;	// 偦偺懠
		}
	}
	if(str < 0) str = 0;
	return str;
}
int battle_get_agi(struct block_list *bl)
{
	int agi=0;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_MOB)
		agi=mob_db[((struct mob_data *)bl)->class].agi;
	else if(bl->type==BL_PC)
		agi=((struct map_session_data *)bl)->paramc[1];
	else if(bl->type==BL_PET)
		agi=mob_db[((struct pet_data *)bl)->class].agi;

	if(sc_data) {
		if( sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 &&
			bl->type != BL_PC)	// 懍搙憹壛(PC偼pc.c偱)
			agi += 2+sc_data[SC_INCREASEAGI].val1;

		if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
			agi += agi*(2+sc_data[SC_CONCENTRATE].val1)/100;

		if(sc_data[SC_DECREASEAGI].timer!=-1)	// 懍搙尭彮
			agi -= 2+sc_data[SC_DECREASEAGI].val1;

		if(sc_data[SC_QUAGMIRE].timer!=-1 )	// 僋傽僌儅僀傾
			agi >>= 1;
	}
	if(agi < 0) agi = 0;
	return agi;
}
int battle_get_vit(struct block_list *bl)
{
	int vit=0;
	struct status_change *sc_data=battle_get_sc_data(bl);
	if(bl->type==BL_MOB)
		vit=mob_db[((struct mob_data *)bl)->class].vit;
	else if(bl->type==BL_PC)
		vit=((struct map_session_data *)bl)->paramc[2];
	else if(bl->type==BL_PET)
		vit=mob_db[((struct pet_data *)bl)->class].vit;
	if(bl->type!=BL_PC && sc_data && sc_data[SC_STRIPARMOR].timer != -1)
		vit = vit*60/100;
	if(vit < 0) vit = 0;
	return vit;
}
int battle_get_int(struct block_list *bl)
{
	int int_=0;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_MOB)
		int_=mob_db[((struct mob_data *)bl)->class].int_;
	else if(bl->type==BL_PC)
		int_=((struct map_session_data *)bl)->paramc[3];
	else if(bl->type==BL_PET)
		int_=mob_db[((struct pet_data *)bl)->class].int_;

	if(sc_data) {
		if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){	// 僽儗僢僔儞僌
			int race=battle_get_race(bl);
			if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 )	int_ >>= 1;	// 埆 杺/晄巰
			else int_ += sc_data[SC_BLESSING].val1;	// 偦偺懠
		}
		if( sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC)
			int_ = int_*90/100;

	}
	if(int_ < 0) int_ = 0;
	return int_;
}
int battle_get_dex(struct block_list *bl)
{
	int dex=0;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_MOB)
		dex=mob_db[((struct mob_data *)bl)->class].dex;
	else if(bl->type==BL_PC)
		dex=((struct map_session_data *)bl)->paramc[4];
	else if(bl->type==BL_PET)
		dex=mob_db[((struct pet_data *)bl)->class].dex;

	if(sc_data) {
		if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
			dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100;

		if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){	// 僽儗僢僔儞僌
			int race=battle_get_race(bl);
			if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 )	dex >>= 1;	// 埆 杺/晄巰
			else dex += sc_data[SC_BLESSING].val1;	// 偦偺懠
		}

		if(sc_data[SC_QUAGMIRE].timer!=-1 )	// 僋傽僌儅僀傾
			dex >>= 1;
	}
	if(dex < 0) dex = 0;
	return dex;
}
int battle_get_luk(struct block_list *bl)
{
	int luk=0;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_MOB)
		luk=mob_db[((struct mob_data *)bl)->class].luk;
	else if(bl->type==BL_PC)
		luk=((struct map_session_data *)bl)->paramc[5];
	else if(bl->type==BL_PET)
		luk=mob_db[((struct pet_data *)bl)->class].luk;

	if(sc_data) {
		if(sc_data[SC_GLORIA].timer!=-1 && bl->type != BL_PC)	// 僌儘儕傾(PC偼pc.c偱)
			luk += 30;
		if(sc_data[SC_CURSE].timer!=-1 )		// 庺偄
			luk=0;
	}
	if(luk < 0) luk = 0;
	return luk;
}

int battle_get_flee(struct block_list *bl)
{
	int flee=1;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_PC)
		flee=((struct map_session_data *)bl)->flee;
	else
		flee=battle_get_agi(bl) + battle_get_lv(bl);

	if(sc_data) {
		if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
			flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
					+(sc_data[SC_WHISTLE].val3>>16))/100;
		if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC)
			flee -= flee*25/100;
	}
	if(flee < 1) flee = 1;
	return flee;
}
int battle_get_hit(struct block_list *bl)
{
	int hit=1;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_PC)
		hit=((struct map_session_data *)bl)->hit;
	else
		hit=battle_get_dex(bl) + battle_get_lv(bl);

	if(sc_data) {
		if(sc_data[SC_HUMMING].timer!=-1 && bl->type != BL_PC)	// 
			hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2
					+sc_data[SC_HUMMING].val3)/100;
		if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC)		// 庺偄
			hit -= hit*25/100;
	}
	if(hit < 1) hit = 1;
	return hit;
}
int battle_get_flee2(struct block_list *bl)
{
	int flee2=1;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_PC) {
		flee2 = battle_get_luk(bl) + 10;
		flee2 += ((struct map_session_data *)bl)->flee2 - (((struct map_session_data *)bl)->paramc[5] + 10);
	}
	else
		flee2=battle_get_luk(bl)+1;

	if(sc_data) {
		if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
			flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
					+(sc_data[SC_WHISTLE].val3&0xffff))*10;
	}
	if(flee2 < 1) flee2 = 1;
	return flee2;
}
int battle_get_critical(struct block_list *bl)
{
	int critical=1;
	struct status_change *sc_data=battle_get_sc_data(bl);

	if(bl->type==BL_PC) {
		critical = battle_get_luk(bl)*3 + 10;
		critical += ((struct map_session_data *)bl)->critical - ((((struct map_session_data *)bl)->paramc[5]*3) + 10);
	}
	else
		critical=battle_get_luk(bl)*3 + 1;

	if(sc_data) {
		if(sc_data[SC_FORTUNE].timer!=-1 && bl->type != BL_PC)
			critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2
					+sc_data[SC_FORTUNE].val3)*10;
		if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1 && bl->type != BL_PC)
			critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
	}
	if(critical < 1) critical = 1;
	return critical;
}

int battle_get_baseatk(struct block_list *bl)
{
	struct status_change *sc_data=battle_get_sc_data(bl);
	int batk=1;
	if(bl->type == BL_PC)
		batk = ((struct map_session_data *)bl)->base_atk;
	else {
		int str,dstr;
		str = battle_get_str(bl);
		dstr = str/10;
		batk = dstr*dstr + str;
	}
	if(sc_data) {
		if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
			batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100;
		if(sc_data[SC_CURSE].timer!=-1 )
			batk -= batk*25/100;
	}
	if(batk < 1) batk = 1;
	return batk;
}

int battle_get_atk(struct block_list *bl)
{
	struct status_change *sc_data=battle_get_sc_data(bl);
	int atk=0;
	if(bl->type==BL_PC)
		atk = ((struct map_session_data*)bl)->watk;
	else if(bl->type==BL_MOB)
		atk = mob_db[((struct mob_data*)bl)->class].atk1;
	else if(bl->type==BL_PET)
		atk = mob_db[((struct pet_data*)bl)->class].atk1;

	if(sc_data) {
		if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
			atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100;
		if(sc_data[SC_CURSE].timer!=-1 )
			atk -= atk*25/100;
	}
	if(atk < 0) atk = 0;
	return atk;
}
int battle_get_atk_(struct block_list *bl)
{
	if(bl->type==BL_PC){
		int atk=((struct map_session_data*)bl)->watk_;

		if(((struct map_session_data *)bl)->sc_data[SC_CURSE].timer!=-1 )
			atk -= atk*25/100;
		return atk;
	}
	else
		return 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区中文字幕精品精品| 91精品一区二区三区在线观看| 成人免费视频国产在线观看| 成人黄色免费短视频| 99re成人在线| 91麻豆精品国产| 国产精品女人毛片| 国产成人一级电影| 99久久夜色精品国产网站| 91.麻豆视频| 国产视频911| 亚洲第一主播视频| 东方欧美亚洲色图在线| 在线观看精品一区| 精品黑人一区二区三区久久| 日韩欧美区一区二| 亚洲丝袜另类动漫二区| 免费在线看成人av| 91一区二区三区在线观看| 欧美一区三区二区| 国产精品成人免费在线| 麻豆91小视频| 欧美性xxxxxx少妇| 国产精品亲子伦对白| 午夜精品久久久久久久久久| 国产伦精品一区二区三区视频青涩| 91免费国产在线| 久久精品男人的天堂| 日韩二区三区四区| 色综合久久综合网97色综合| 久久亚洲一级片| 视频精品一区二区| 国产成人无遮挡在线视频| 欧美精品自拍偷拍| 一区二区国产盗摄色噜噜| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲香蕉伊在人在线观| 91久久线看在观草草青青| 一区二区三区精品在线观看| 99久久免费精品| 久久女同精品一区二区| 久久久久久久综合色一本| 日本一区二区三区视频视频| 国产日韩精品一区二区浪潮av | 在线视频一区二区三区| 亚洲免费观看视频| 欧美日本一区二区| 国产女人水真多18毛片18精品视频 | 欧美日韩一区二区在线视频| 久久精品人人做人人爽97| 欧美国产1区2区| 日韩女优视频免费观看| 精品乱码亚洲一区二区不卡| 亚洲精品福利视频网站| 亚洲动漫第一页| 视频一区二区三区在线| 亚洲国产精品一区二区久久 | 色婷婷综合久久久中文字幕| 欧美日韩日日骚| 久久精品视频一区二区三区| 三级成人在线视频| 国产精品国产馆在线真实露脸| 国产麻豆精品视频| 国产日韩v精品一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 国模套图日韩精品一区二区| 精品成人免费观看| 日韩在线播放一区二区| 色妹子一区二区| 欧美亚洲禁片免费| 亚洲精品成人在线| 欧美顶级少妇做爰| 免费一级欧美片在线观看| 成人av网在线| 日本一二三不卡| 日韩激情一二三区| 一区二区久久久久| 丝袜美腿亚洲综合| 久久狠狠亚洲综合| 成人理论电影网| 欧美精品一区二区三区高清aⅴ | 午夜不卡av免费| 在线观看日韩毛片| 亚洲成人精品影院| 91美女视频网站| 亚洲乱码中文字幕| 久久久国产一区二区三区四区小说 | 色婷婷激情综合| 精品捆绑美女sm三区| 亚洲欧洲国产日韩| 美女诱惑一区二区| 99国产精品久久| 亚洲综合激情另类小说区| 一本大道av伊人久久综合| 亚洲男人电影天堂| 国产在线视视频有精品| 一区二区三区四区不卡在线| 国产人久久人人人人爽| 欧美精品色综合| 在线观看免费亚洲| 色综合久久88色综合天天免费| 久久99久国产精品黄毛片色诱| 亚洲成a天堂v人片| 一区二区视频在线| 亚洲欧美中日韩| 国产欧美日韩视频在线观看| 欧美刺激午夜性久久久久久久| 精品视频1区2区3区| 色美美综合视频| 在线一区二区视频| 一本大道久久a久久综合婷婷| 成人在线一区二区三区| 丁香一区二区三区| 成人福利视频网站| 99精品国产91久久久久久 | 99久久精品免费观看| 国产不卡视频在线播放| 国产一区二区三区在线观看精品 | 亚洲福中文字幕伊人影院| 一区二区三区欧美视频| 亚洲一卡二卡三卡四卡无卡久久| 亚洲女同女同女同女同女同69| 综合欧美亚洲日本| 亚洲激情av在线| 亚洲va国产va欧美va观看| 亚洲第一二三四区| 日本中文在线一区| 国产专区综合网| 成人在线综合网| 欧美性受极品xxxx喷水| 欧美日韩黄色一区二区| 欧美一二三区在线| 国产性色一区二区| 综合久久一区二区三区| 亚洲大片一区二区三区| 另类中文字幕网| 欧美精品乱码久久久久久按摩| 亚洲国产wwwccc36天堂| 欧美最新大片在线看| 亚洲电影激情视频网站| 国产精品影音先锋| 91久久国产综合久久| 欧美日韩在线播| 日韩欧美区一区二| 久久亚洲一区二区三区明星换脸| 伊人色综合久久天天人手人婷| 亚洲成人tv网| 一区二区三区高清在线| 午夜电影一区二区| 久久综合久久久久88| 国产女人18水真多18精品一级做| 亚洲视频精选在线| 日韩电影在线一区二区| 成人午夜免费电影| 欧美日韩亚洲不卡| www久久久久| 亚洲香蕉伊在人在线观| 久久99在线观看| 91视频xxxx| 久久久久久99久久久精品网站| 亚洲v精品v日韩v欧美v专区 | 欧美乱熟臀69xxxxxx| 欧美大片在线观看一区| 亚洲情趣在线观看| 国产大片一区二区| 欧美福利电影网| 国产精品久久久99| 另类人妖一区二区av| 91黄色小视频| 国产精品久久久一本精品| 视频在线观看91| 91啪亚洲精品| 国产欧美日韩精品在线| 日韩av午夜在线观看| 色综合色综合色综合色综合色综合| 久久综合九色综合欧美98| 五月激情丁香一区二区三区| 色综合天天综合狠狠| 中文字幕不卡在线播放| 激情伊人五月天久久综合| 欧美喷水一区二区| 亚洲激情校园春色| 97se亚洲国产综合自在线不卡| 精品999在线播放| 久草精品在线观看| 欧美日韩精品三区| 亚洲午夜激情av| 色香色香欲天天天影视综合网| 亚洲国产精品v| 精品一区中文字幕| 日韩免费高清av| 免费不卡在线观看| 日韩一级高清毛片| 日本视频一区二区三区| 9191久久久久久久久久久| 一区二区三区在线视频免费| 99久久精品免费看国产免费软件| 国产欧美日韩麻豆91| 国产91对白在线观看九色| 日本一区二区免费在线观看视频 |