📄 skill.c
字号:
/* 僗僉儖娭學 */
#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 + -