⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skill.c

📁 最新的仙镜传说服务器C语言源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 僗僉儖娭學 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "timer.h"

#include "skill.h"
#include "map.h"
#include "clif.h"
#include "pc.h"
#include "pet.h"
#include "mob.h"
#include "battle.h"
#include "party.h"
#include "itemdb.h"
#include "script.h"

#define SKILLUNITTIMER_INVERVAL	100

/* 僗僉儖斣崋亖亜僗僥乕僞僗堎忢斣崋曄姺僥乕僽儖 */
int SkillStatusChangeTable[]={	/* skill.h偺enum偺SC_***偲偁傢偣傞偙偲 */
/* 0- */
	-1,-1,-1,-1,-1,-1,
	SC_PROVOKE,			/* 僾儘儃僢僋 */
	-1, 1,-1,
/* 10- */
	SC_SIGHT,			/* 僒僀僩 */
	-1,-1,-1,-1,
	SC_FREEZE,			/* 僼儘僗僩僟僀僶乕 */
	SC_STONE,			/* 僗僩乕儞僇乕僗 */
	-1,-1,-1,
/* 20- */
	-1,-1,-1,-1,
	SC_RUWACH,			/* 儖傾僼 */
	-1,-1,-1,-1,
	SC_INCREASEAGI,		/* 懍搙憹壛 */
/* 30- */
	SC_DECREASEAGI,		/* 懍搙尭彮 */
	-1,
	SC_SIGNUMCRUCIS,	/* 僔僌僫儉僋儖僔僗 */
	SC_ANGELUS,			/* 僄儞僕僃儔僗 */
	SC_BLESSING,		/* 僽儗僢僔儞僌 */
	-1,-1,-1,-1,-1,
/* 40- */
	-1,-1,-1,-1,-1,
	SC_CONCENTRATE,		/* 廤拞椡岦忋 */
	-1,-1,-1,-1,
/* 50- */
	-1,
	SC_HIDING,			/* 僴僀僨傿儞僌 */
	-1,-1,-1,-1,-1,-1,-1,-1,
/* 60- */
	SC_TWOHANDQUICKEN,	/* 2HQ */
	SC_AUTOCOUNTER,
	-1,-1,-1,-1,
	SC_IMPOSITIO,		/* 僀儞億僔僥傿僆儅僰僗 */
	SC_SUFFRAGIUM,		/* 僒僼儔僊僂儉 */
	SC_ASPERSIO,		/* 傾僗儁儖僔僆 */
	SC_BENEDICTIO,		/* 惞懱崀暉 */
/* 70- */
	-1,
	SC_SLOWPOISON,
	-1,
	SC_KYRIE,			/* 僉儕僄僄儗僀僜儞 */
	SC_MAGNIFICAT,		/* 儅僌僯僼傿僇乕僩 */
	SC_GLORIA,			/* 僌儘儕傾 */
	SC_DIVINA,			/* 儗僢僋僗僨傿價乕僫 */
	-1,
	SC_AETERNA,			/* 儗僢僋僗僄乕僥儖僫 */
	-1,
/* 80- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
/* 90- */
	-1,-1,
	SC_QUAGMIRE,		/* 僋傽僌儅僀傾 */
	-1,-1,-1,-1,-1,-1,-1,
/* 100- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
/* 110- */
	-1,
	SC_ADRENALINE,		/* 傾僪儗僫儕儞儔僢僔儏 */
	SC_WEAPONPERFECTION,/* 僂僃億儞僷乕僼僃僋僔儑儞 */
	SC_OVERTHRUST,		/* 僆乕僶乕僩儔僗僩 */
	SC_MAXIMIZEPOWER,	/* 儅僉僔儅僀僘僷儚乕 */
	-1,-1,-1,-1,-1,
/* 120- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
/* 130- */
	-1,-1,-1,-1,-1,
	SC_CLOAKING,		/* 僋儘乕僉儞僌 */
	SC_STAN,			/* 僜僯僢僋僽儘乕 */
	-1,
	SC_ENCPOISON,		/* 僄儞僠儍儞僩億僀僘儞 */
	SC_POISONREACT,		/* 億僀僘儞儕傾僋僩 */
/* 140- */
	SC_POISON,			/* 儀僲儉僟僗僩 */
	-1,-1,
	SC_TRICKDEAD,		/* 巰傫偩傆傝 */
	-1,-1,-1,-1,-1,-1,
/* 150- */
	-1,-1,-1,-1,-1,
	SC_LOUD,			/* 儔僂僪儃僀僗 */
	-1,
	SC_ENERGYCOAT,		/* 僄僫僕乕僐乕僩 */
	-1,-1,
/* 160- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
	-1,
	SC_KEEPING,
	-1,-1,
	SC_BARRIER,
	-1,-1,
	SC_HALLUCINATION,
	-1,-1,
/* 210- */
	-1,-1,-1,-1,-1,
	SC_STRIPWEAPON,
	SC_STRIPSHIELD,
	SC_STRIPARMOR,
	SC_STRIPHELM,
	-1,
/* 220- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
/* 230- */
	-1,-1,-1,-1,
	SC_CP_WEAPON,
	SC_CP_SHIELD,
	SC_CP_ARMOR,
	SC_CP_HELM,
	-1,-1,
/* 240- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,
	SC_AUTOGUARD,
/* 250- */
	-1,-1,
	SC_REFLECTSHIELD,
	-1,-1,
	SC_DEVOTION,
	SC_PROVIDENCE,
	SC_DEFENDER,
	SC_SPEARSQUICKEN,
	-1,
/* 260- */
	-1,-1,-1,-1,-1,-1,-1,-1,
	SC_STEELBODY,
	SC_BLADESTOP_WAIT,
/* 270- */
	SC_EXPLOSIONSPIRITS,
	-1,-1,-1,-1,-1,
	SC_MAGICROD,
	-1,-1,-1,
/* 280- */
	SC_FLAMELAUNCHER,
	SC_FROSTWEAPON,
	SC_LIGHTNINGLOADER,
	SC_SEISMICWEAPON,
	-1,
	SC_VOLCANO,
	SC_DELUGE,
	SC_VIOLENTGALE,
	-1,-1,
/* 290- */
	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
/* 300- */
	-1,-1,-1,-1,-1,-1,
	SC_LULLABY,
	SC_RICHMANKIM,
	SC_ETERNALCHAOS,
	SC_DRUMBATTLE,
/* 310- */
	SC_NIBELUNGEN,
	SC_ROKISWEIL,
	SC_INTOABYSS,
	SC_SIEGFRIED,
	-1,-1,-1,
	SC_DISSONANCE,
	-1,
	SC_WHISTLE,
/* 320- */
	SC_ASSNCROS,
	SC_POEMBRAGI,
	SC_APPLEIDUN,
	-1,-1,
	SC_UGLYDANCE,
	-1,
	SC_HUMMING,
	SC_DONTFORGETME,
	SC_FORTUNE,
/* 330- */
	SC_SERVICE4U,
	-1,-1,-1,-1,-1,-1,-1,-1,-1,
};

static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
static const int diry[8]={1,1,0,-1,-1,-1,0,1};

static int rdamage;

/* 僗僉儖僨乕僞儀乕僗 */
struct skill_db skill_db[MAX_SKILL_DB];

/* 傾僀僥儉嶌惉僨乕僞儀乕僗 */
struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];

/* 栴嶌惉僗僉儖僨乕僞儀乕僗 */
struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];

/* 傾僽儔僇僟僽儔敪摦僗僉儖僨乕僞儀乕僗 */
struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];

int	skill_get_hit( int id ){ return skill_db[id].hit; }
int	skill_get_inf( int id ){ return skill_db[id].inf; }
int	skill_get_pl( int id ){ return skill_db[id].pl; }
int	skill_get_nk( int id ){ return skill_db[id].nk; }
int	skill_get_max( int id ){ return skill_db[id].max; }
int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0:skill_db[id].range[lv-1]; }
int	skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; }
int	skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].sp[lv-1]; }
int	skill_get_zeny( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; }
int	skill_get_num( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].num[lv-1]; }
int	skill_get_cast( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; }
int	skill_get_delay( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; }
int	skill_get_time( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; }
int	skill_get_time2( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; }
int	skill_get_castdef( int id ){ return skill_db[id].cast_def_rate; }
int	skill_get_weapontype( int id ){ return skill_db[id].weapon; }
int	skill_get_inf2( int id ){ return skill_db[id].inf2; }
int	skill_get_maxcount( int id ){ return skill_db[id].maxcount; }
int	skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; }


/* 僾儘僩僞僀僾 */
struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
int skill_check_condition( struct map_session_data *sd,int type);
int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
int skill_frostjoke_scream(struct block_list *bl,va_list ap);
int skill_status_change_timer_sub(struct block_list *bl, va_list ap );
int skill_attack_area(struct block_list *bl,va_list ap);
int skill_is_danceskill(int id);
int skill_abra_dataset(int skilllv);
int skill_clear_element_field(struct block_list *bl);
int skill_landprotector(struct block_list *bl, va_list ap );

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;
}

/* 僗僉儖儐僯僢僩ID傪曉偡乮偙傟傕僨乕僞儀乕僗偵擖傟偨偄側乯 */
int skill_get_unit_id(int id,int flag)
{
	switch(id){
	case MG_SAFETYWALL:		return 0x7e;				/* 僙僀僼僥傿僂僅乕儖 */
	case MG_FIREWALL:		return 0x7f;				/* 僼傽僀傾乕僂僅乕儖 */
	case AL_WARP:			return (flag==0)?0x81:0x80;	/* 儚乕僾億乕僞儖 */
	case PR_BENEDICTIO:		return 0x82;				/* 惞懱崀暉 */
	case PR_SANCTUARY:		return 0x83;				/* 僒儞僋僠儏傾儕 */
	case PR_MAGNUS:			return 0x84;				/* 儅僌僰僗僄僋僜僔僘儉 */
	case AL_PNEUMA:			return 0x85;				/* 僯儏乕儅 */
	case MG_THUNDERSTORM:	return 0x86;		/* 僒儞僟乕僗僩乕儉 */
	case WZ_HEAVENDRIVE:	return 0x86;		/* 僿償儞僘僪儔僀僽 */
	case WZ_SIGHTRASHER:	return 0x86;
	case WZ_METEOR:			return 0x86;				/* 儊僥僆僗僩乕儉 */
	case WZ_VERMILION:		return 0x86;				/* 儘乕僪僆僽償傽乕儈儕僆儞 */
	case WZ_FROSTNOVA:		return 0x86;			/* 僼儘僗僩僲償傽 */
	case WZ_STORMGUST:		return 0x86;				/* 僗僩乕儉僈僗僩(偲傝偁偊偢LoV偲摨偠偱張棟) */
	case CR_GRANDCROSS:		return 0x86;				/* 僌儔儞僪僋儘僗 */
	case WZ_FIREPILLAR:		return (flag==0)?0x87:0x88;	/* 僼傽僀傾乕僺儔乕 */
	case HT_TALKIEBOX:		return 0x99;	/* 僩乕僉乕儃僢僋僗 */
	case WZ_ICEWALL:		return 0x8d;				/* 傾僀僗僂僅乕儖 */
	case WZ_QUAGMIRE:		return 0x8e;				/* 僋傽僌儅僀傾 */
	case HT_BLASTMINE:		return 0x8f;				/* 僽儔僗僩儅僀儞 */
	case HT_SKIDTRAP:		return 0x90;				/* 僗僉僢僪僩儔僢僾 */
	case HT_ANKLESNARE:		return 0x91;				/* 傾儞僋儖僗僱傾 */
	case AS_VENOMDUST:		return 0x92;				/* 儀僲儉僟僗僩 */
	case HT_LANDMINE:		return 0x93;				/* 儔儞僪儅僀儞 */
	case HT_SHOCKWAVE:		return 0x94;				/* 僔儑僢僋僂僃乕僽僩儔僢僾 */
	case HT_SANDMAN:		return 0x95;				/* 僒儞僪儅儞 */
	case HT_FLASHER:		return 0x96;				/* 僼儔僢僔儍乕 */
	case HT_FREEZINGTRAP:	return 0x97;				/* 僼儕乕僕儞僌僩儔僢僾 */
	case HT_CLAYMORETRAP:	return 0x98;				/* 僋儗僀儌傾乕僩儔僢僾 */
	case SA_VOLCANO:	return 0x9a;					/* 儃儖働乕僲 */
	case SA_DELUGE:			return 0x9b;				/* 僨儕儏乕僕 */
	case SA_VIOLENTGALE:	return 0x9c;					/* 僶僀僆儗儞僩僎僀儖 */
	case SA_LANDPROTECTOR:	return 0x9d;					/* 儔儞僪僾儘僥僋僞乕 */
	case BD_LULLABY:		return 0x9e;				/* 巕庣壧 */
	case BD_RICHMANKIM:		return 0x9f;				/* 僯儓儖僪偺墐 */
	case BD_ETERNALCHAOS:	return 0xa0;				/* 塱墦偺崿撟 */
	case BD_DRUMBATTLEFIELD:return 0xa1;					/* 愴懢屰偺嬁偒 */
	case BD_RINGNIBELUNGEN:	return 0xa2;				/* 僯乕儀儖儞僌偺巜椫 */
	case BD_ROKISWEIL:		return 0xa3;				/* 儘僉偺嫨傃 */
	case BD_INTOABYSS:		return 0xa4;				/* 怺暎偺拞偵 */
	case BD_SIEGFRIED:		return 0xa5;				/* 晄巰恎偺僕乕僋僼儕乕僪 */
	case BA_DISSONANCE:		return 0xa6;				/* 晄嫤榓壒 */
	case BA_WHISTLE:		return 0xa7;				/* 岥揓 */
	case BA_ASSASSINCROSS:	return 0xa8;				/* 梉梲偺傾僒僔儞僋儘僗 */
	case BA_POEMBRAGI:		return 0xa9;				/* 僽儔僊偺帊 */
	case BA_APPLEIDUN:		return 0xaa;				/* 僀僪僁儞偺椦岀 */
	case DC_UGLYDANCE:		return 0xab;				/* 帺暘彑庤側僟儞僗 */
	case DC_HUMMING:		return 0xac;				/* 僴儈儞僌 */
	case DC_DONTFORGETME:	return 0xad;				/* 巹傪朰傟側偄偱乧 */
	case DC_FORTUNEKISS:	return 0xae;				/* 岾塣偺僉僗 */
	case DC_SERVICEFORYOU:	return 0xaf;				/* 僒乕價僗僼僅乕儐乕 */
	case RG_GRAFFITI:		return 0xb0;				/* 僌儔僼傿僥傿 */
	}
	return 0;
	/*
	0x89,0x8a,0x8b 昞帵柍偟
	0x9a 墛懏惈偺塺彞傒偨偄側僄僼僃僋僩
	0x9b 悈懏惈偺塺彞傒偨偄側僄僼僃僋僩
	0x9c 晽懏惈偺塺彞傒偨偄側僄僼僃僋僩
	0x9d 敀偄彫偝側僄僼僃僋僩
	*/
}

/*==========================================
 * 僗僉儖捛壛岠壥
 *------------------------------------------
 */
int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick)
{
	/* MOB捛壛岠壥僗僉儖梡 */
	const int sc[]={
		SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN,
		SC_STONE, SC_CURSE, SC_SLEEP 
	};
	const int sc2[]={
		MG_STONECURSE,MG_FROSTDIVER,NPC_STUNATTACK,
		NPC_SLEEPATTACK,TF_POISON,NPC_CURSEATTACK,
		NPC_SILENCEATTACK,0,NPC_BLINDATTACK
	};

	struct map_session_data *sd=NULL;
	struct map_session_data *dstsd=NULL;
	struct mob_data *md=NULL;
	struct mob_data *dstmd=NULL;

	int skill,skill2;
	int rate,luk;

	int sc_def_mdef,sc_def_vit,sc_def_int,sc_def_luk;

	if(skilllv < 0) return 0;

	if(src->type==BL_PC)
		sd=(struct map_session_data *)src;
	else if(src->type==BL_MOB)
		md=(struct mob_data *)src;

	luk = battle_get_luk(bl);
	sc_def_mdef=100 - (3 + battle_get_mdef(bl) + luk/3);
	sc_def_vit=100 - (3 + battle_get_vit(bl) + luk/3);
	sc_def_int=100 - (3 + battle_get_int(bl) + luk/3);
	sc_def_luk=100 - (3 + luk);
	if(bl->type==BL_PC)
		dstsd=(struct map_session_data *)bl;
	else if(bl->type==BL_MOB){
		dstmd=(struct mob_data *)bl;
		if(sc_def_mdef>50)
			sc_def_mdef=50;
		if(sc_def_vit>50)
			sc_def_vit=50;
		if(sc_def_int>50)
			sc_def_int=50;
		if(sc_def_luk>50)
			sc_def_luk=50;
	}
	if(sc_def_mdef<0)
		sc_def_mdef=0;
	if(sc_def_vit<0)
		sc_def_vit=0;
	if(sc_def_int<0)
		sc_def_int=0;

	switch(skillid){
	case 0:					/* 捠忢峌寕 */
		/* 帺摦戦 */
		if( sd && pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
			rand()%1000 <= sd->paramc[5]*10/3+1 ) {
			int lv=(sd->status.job_level+9)/10;
			skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -