/**
* This file is part of Hercules.
* http://herc.ws - http://github.com/HerculesWS/Hercules
*
* Copyright (C) 2012-2020 Hercules Dev Team
* Copyright (C) Athena Dev Teams
*
* Hercules is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MAP_SKILL_H
#define MAP_SKILL_H
#include "map/map.h" // struct block_list
#include "map/status.h" // enum sc_type
#include "map/unitdefines.h" // enum unit_dir
#include "common/hercules.h"
#include "common/db.h"
#include "common/mmo.h" // MAX_SKILL_DB, struct square
/**
* Declarations
**/
struct Damage;
struct homun_data;
struct itemlist; // map/itemdb.h
struct map_session_data;
struct mercenary_data;
struct unit_data;
struct skill_unit;
struct square;
struct status_change_entry;
/**
* Defines
**/
#define MAX_SKILL_PRODUCE_DB 270
#define MAX_PRODUCE_RESOURCE 10
#define MAX_SKILL_ARROW_DB 140
#define MAX_ARROW_RESOURCE 5
#define MAX_SKILL_ABRA_DB 210
#define MAX_SKILL_IMPROVISE_DB 30
#define MAX_SKILL_LEVEL 20
#define MAX_SKILL_UNIT_LAYOUT 45
#define MAX_SQUARE_LAYOUT 5 // 11*11 Placement of a maximum unit
#define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
#define MAX_SKILLTIMERSKILL 15
#define MAX_SKILLUNITGROUP 25
#define MAX_SKILL_ITEM_REQUIRE 10
#define MAX_SKILLUNITGROUPTICKSET 25
#define MAX_SKILL_NAME_LENGTH 32
#ifndef MAX_SKILL_DESC_LENGTH
#define MAX_SKILL_DESC_LENGTH 50
#endif
// Custom Skill Ranges is used in skill_get_index, to allocate indexes based on ID and gaps between 2 SkillID
#ifndef CUSTOM_SKILL_RANGES
#define CUSTOM_SKILL_RANGES
#endif // CUSTOM_SKILL_RANGES
// (Epoque:) To-do: replace this macro with some sort of skill tree check (rather than hard-coded skill names)
#define skill_ischangesex(id) ( \
((id) >= BD_ADAPTATION && (id) <= DC_SERVICEFORYOU) || ((id) >= CG_ARROWVULCAN && (id) <= CG_MARIONETTE) || \
((id) >= CG_LONGINGFREEDOM && (id) <= CG_TAROTCARD) || ((id) >= WA_SWING_DANCE && (id) <= WM_UNLIMITED_HUMMING_VOICE))
#define MAX_SKILL_SPELLBOOK_DB 17
#define MAX_SKILL_MAGICMUSHROOM_DB 23
//Walk intervals at which chase-skills are attempted to be triggered.
#define WALK_SKILL_INTERVAL 5
/**
* Enumerations
**/
//Constants to identify the skill's inf value:
enum e_skill_inf {
INF_NONE = 0x00,
INF_ATTACK_SKILL = 0x01,
INF_GROUND_SKILL = 0x02,
INF_SELF_SKILL = 0x04, // Skills casted on self where target is automatically chosen
// 0x08 not assigned
INF_SUPPORT_SKILL = 0x10,
INF_TARGET_TRAP = 0x20,
};
//Constants to identify a skill's nk value (damage properties)
//The NK value applies only to non INF_GROUND_SKILL skills
//when determining skill castend function to invoke.
enum e_skill_nk {
NK_NONE = 0x00,
NK_NO_DAMAGE = 0x01,
NK_SPLASH = 0x02|0x04, // 0x4 = splash & split
NK_SPLASH_ONLY = 0x02,
NK_SPLASHSPLIT = 0x04,
NK_NO_CARDFIX_ATK = 0x08,
NK_NO_ELEFIX = 0x10,
NK_IGNORE_DEF = 0x20,
NK_IGNORE_FLEE = 0x40,
NK_NO_CARDFIX_DEF = 0x80,
};
//A skill with 3 would be no damage + splash: area of effect.
//Constants to identify a skill's inf2 value.
enum e_skill_inf2 {
INF2_NONE = 0x00000,
INF2_QUEST_SKILL = 0x00001,
INF2_NPC_SKILL = 0x00002, // NPC skills are those that players can't have in their skill tree.
INF2_WEDDING_SKILL = 0x00004,
INF2_SPIRIT_SKILL = 0x00008,
INF2_GUILD_SKILL = 0x00010,
INF2_SONG_DANCE = 0x00020,
INF2_ENSEMBLE_SKILL = 0x00040,
INF2_TRAP = 0x00080,
INF2_TARGET_SELF = 0x00100, // Refers to ground placed skills that will target the caster as well (like Grandcross)
INF2_NO_TARGET_SELF = 0x00200,
INF2_PARTY_ONLY = 0x00400,
INF2_GUILD_ONLY = 0x00800,
INF2_NO_ENEMY = 0x01000,
INF2_NOLP = 0x02000, // Spells that can ignore Land Protector
INF2_CHORUS_SKILL = 0x04000, // Chorus skill
INF2_FREE_CAST_NORMAL = 0x08000,
INF2_FREE_CAST_REDUCED = 0x10000,
INF2_SHOW_SKILL_SCALE = 0x20000,
INF2_ALLOW_REPRODUCE = 0x40000,
INF2_HIDDEN_TRAP = 0x80000, // Traps that are hidden (based on trap_visiblity battle conf)
INF2_IS_COMBO_SKILL = 0x100000, // Sets whether a skill can be used in combos or not
};
// Flags passed to skill_attack/skill_area_sub
enum e_skill_display {
SD_LEVEL = 0x1000, // skill_attack will send -1 instead of skill level (affects display of some skills)
SD_ANIMATION = 0x2000, // skill_attack will use '5' instead of the skill's 'type' (this makes skills show an animation)
SD_SPLASH = 0x4000, // skill_area_sub will count targets in skill_area_temp[2]
SD_PREAMBLE = 0x8000, // skill_area_sub will transmit a 'magic' damage packet (-30000 dmg) for the first target selected
};
enum {
UF_NONE = 0x0000,
UF_DEFNOTENEMY = 0x0001, // If 'defunit_not_enemy' is set, the target is changed to 'friend'
UF_NOREITERATION = 0x0002, // Spell cannot be stacked
UF_NOFOOTSET = 0x0004, // Spell cannot be cast near/on targets
UF_NOOVERLAP = 0x0008, // Spell effects do not overlap
UF_PATHCHECK = 0x0010, // Only cells with a shootable path will be placed
UF_NOPC = 0x0020, // May not target players
UF_NOMOB = 0x0040, // May not target mobs
UF_SKILL = 0x0080, // May target skills
UF_DANCE = 0x0100, // Dance
UF_ENSEMBLE = 0x0200, // Duet
UF_SONG = 0x0400, // Song
UF_DUALMODE = 0x0800, // Spells should trigger both ontimer and onplace/onout/onleft effects.
UF_RANGEDSINGLEUNIT = 0x2000, // Hack for ranged layout, only display center
};
//Returns the cast type of the skill: ground cast, castend damage, castend no damage
enum { CAST_GROUND, CAST_DAMAGE, CAST_NODAMAGE };
enum wl_spheres {
WLS_FIRE = 0x44,
WLS_WIND,
WLS_WATER,
WLS_STONE,
};
enum {
ST_NONE = 0,
ST_HIDING,
ST_CLOAKING,
ST_HIDDEN,
ST_RIDING,
ST_FALCON,
ST_CART,
ST_SHIELD,
ST_SIGHT,
ST_EXPLOSIONSPIRITS,
ST_CARTBOOST,
ST_RECOV_WEIGHT_RATE,
ST_MOVE_ENABLE,
ST_WATER,
ST_RIDINGDRAGON,
ST_WUG,
ST_RIDINGWUG,
ST_MADO,
ST_ELEMENTALSPIRIT,
ST_POISONINGWEAPON,
ST_ROLLINGCUTTER,
ST_MH_FIGHTING,
ST_MH_GRAPPLING,
ST_PECO,
};
enum e_skill {
NV_BASIC = 1,
SM_SWORD,
SM_TWOHAND,
SM_RECOVERY,
SM_BASH,
SM_PROVOKE,
SM_MAGNUM,
SM_ENDURE,
MG_SRECOVERY,
MG_SIGHT,
MG_NAPALMBEAT,
MG_SAFETYWALL,
MG_SOULSTRIKE,
MG_COLDBOLT,
MG_FROSTDIVER,
MG_STONECURSE,
MG_FIREBALL,
MG_FIREWALL,
MG_FIREBOLT,
MG_LIGHTNINGBOLT,
MG_THUNDERSTORM,
AL_DP,
AL_DEMONBANE,
AL_RUWACH,
AL_PNEUMA,
AL_TELEPORT,
AL_WARP,
AL_HEAL,
AL_INCAGI,
AL_DECAGI,
AL_HOLYWATER,
AL_CRUCIS,
AL_ANGELUS,
AL_BLESSING,
AL_CURE,
MC_INCCARRY,
MC_DISCOUNT,
MC_OVERCHARGE,
MC_PUSHCART,
MC_IDENTIFY,
MC_VENDING,
MC_MAMMONITE,
AC_OWL,
AC_VULTURE,
AC_CONCENTRATION,
AC_DOUBLE,
AC_SHOWER,
TF_DOUBLE,
TF_MISS,
TF_STEAL,
TF_HIDING,
TF_POISON,
TF_DETOXIFY,
ALL_RESURRECTION,
KN_SPEARMASTERY,
KN_PIERCE,
KN_BRANDISHSPEAR,
KN_SPEARSTAB,
KN_SPEARBOOMERANG,
KN_TWOHANDQUICKEN,
KN_AUTOCOUNTER,
KN_BOWLINGBASH,
KN_RIDING,
KN_CAVALIERMASTERY,
PR_MACEMASTERY,
PR_IMPOSITIO,
PR_SUFFRAGIUM,
PR_ASPERSIO,
PR_BENEDICTIO,
PR_SANCTUARY,
PR_SLOWPOISON,
PR_STRECOVERY,
PR_KYRIE,
PR_MAGNIFICAT,
PR_GLORIA,
PR_LEXDIVINA,
PR_TURNUNDEAD,
PR_LEXAETERNA,
PR_MAGNUS,
WZ_FIREPILLAR,
WZ_SIGHTRASHER,
WZ_FIREIVY,
WZ_METEOR,
WZ_JUPITEL,
WZ_VERMILION,
WZ_WATERBALL,
WZ_ICEWALL,
WZ_FROSTNOVA,
WZ_STORMGUST,
WZ_EARTHSPIKE,
WZ_HEAVENDRIVE,
WZ_QUAGMIRE,
WZ_ESTIMATION,
BS_IRON,
BS_STEEL,
BS_ENCHANTEDSTONE,
BS_ORIDEOCON,
BS_DAGGER,
BS_SWORD,
BS_TWOHANDSWORD,
BS_AXE,
BS_MACE,
BS_KNUCKLE,
BS_SPEAR,
BS_HILTBINDING,
BS_FINDINGORE,
BS_WEAPONRESEARCH,
BS_REPAIRWEAPON,
BS_SKINTEMPER,
BS_HAMMERFALL,
BS_ADRENALINE,
BS_WEAPONPERFECT,
BS_OVERTHRUST,
BS_MAXIMIZE,
HT_SKIDTRAP,
HT_LANDMINE,
HT_ANKLESNARE,
HT_SHOCKWAVE,
HT_SANDMAN,
HT_FLASHER,
HT_FREEZINGTRAP,
HT_BLASTMINE,
HT_CLAYMORETRAP,
HT_REMOVETRAP,
HT_TALKIEBOX,
HT_BEASTBANE,
HT_FALCON,
HT_STEELCROW,
HT_BLITZBEAT,
HT_DETECTING,
HT_SPRINGTRAP,
AS_RIGHT,
AS_LEFT,
AS_KATAR,
AS_CLOAKING,
AS_SONICBLOW,
AS_GRIMTOOTH,
AS_ENCHANTPOISON,
AS_POISONREACT,
AS_VENOMDUST,
AS_SPLASHER,
NV_FIRSTAID,
NV_TRICKDEAD,
SM_MOVINGRECOVERY,
SM_FATALBLOW,
SM_AUTOBERSERK,
AC_MAKINGARROW,
AC_CHARGEARROW,
TF_SPRINKLESAND,
TF_BACKSLIDING,
TF_PICKSTONE,
TF_THROWSTONE,
MC_CARTREVOLUTION,
MC_CHANGECART,
MC_LOUD,
AL_HOLYLIGHT,
MG_ENERGYCOAT,
NPC_PIERCINGATT,
NPC_MENTALBREAKER,
NPC_RANGEATTACK,
NPC_ATTRICHANGE,
NPC_CHANGEWATER,
NPC_CHANGEGROUND,
NPC_CHANGEFIRE,
NPC_CHANGEWIND,
NPC_CHANGEPOISON,
NPC_CHANGEHOLY,
NPC_CHANGEDARKNESS,
NPC_CHANGETELEKINESIS,
NPC_CRITICALSLASH,
NPC_COMBOATTACK,
NPC_GUIDEDATTACK,
NPC_SELFDESTRUCTION,
NPC_SPLASHATTACK,
NPC_SUICIDE,
NPC_POISON,
NPC_BLINDATTACK,
NPC_SILENCEATTACK,
NPC_STUNATTACK,
NPC_PETRIFYATTACK,
NPC_CURSEATTACK,
NPC_SLEEPATTACK,
NPC_RANDOMATTACK,
NPC_WATERATTACK,
NPC_GROUNDATTACK,
NPC_FIREATTACK,
NPC_WINDATTACK,
NPC_POISONATTACK,
NPC_HOLYATTACK,
NPC_DARKNESSATTACK,
NPC_TELEKINESISATTACK,
NPC_MAGICALATTACK,
NPC_METAMORPHOSIS,
NPC_PROVOCATION,
NPC_SMOKING,
NPC_SUMMONSLAVE,
NPC_EMOTION,
NPC_TRANSFORMATION,
NPC_BLOODDRAIN,
NPC_ENERGYDRAIN,
NPC_KEEPING,
NPC_DARKBREATH,
NPC_DARKBLESSING,
NPC_BARRIER,
NPC_DEFENDER,
NPC_LICK,
NPC_HALLUCINATION,
NPC_REBIRTH,
NPC_SUMMONMONSTER,
RG_SNATCHER,
RG_STEALCOIN,
RG_BACKSTAP,
RG_TUNNELDRIVE,
RG_RAID,
RG_STRIPWEAPON,
RG_STRIPSHIELD,
RG_STRIPARMOR,
RG_STRIPHELM,
RG_INTIMIDATE,
RG_GRAFFITI,
RG_FLAGGRAFFITI,
RG_CLEANER,
RG_GANGSTER,
RG_COMPULSION,
RG_PLAGIARISM,
AM_AXEMASTERY,
AM_LEARNINGPOTION,
AM_PHARMACY,
AM_DEMONSTRATION,
AM_ACIDTERROR,
AM_POTIONPITCHER,
AM_CANNIBALIZE,
AM_SPHEREMINE,
AM_CP_WEAPON,
AM_CP_SHIELD,
AM_CP_ARMOR,
AM_CP_HELM,
AM_BIOETHICS,
AM_BIOTECHNOLOGY,
AM_CREATECREATURE,
AM_CULTIVATION,
AM_FLAMECONTROL,
AM_CALLHOMUN,
AM_REST,
AM_DRILLMASTER,
AM_HEALHOMUN,
AM_RESURRECTHOMUN,
CR_TRUST,
CR_AUTOGUARD,
CR_SHIELDCHARGE,
CR_SHIELDBOOMERANG,
CR_REFLECTSHIELD,
CR_HOLYCROSS,
CR_GRANDCROSS,
CR_DEVOTION,
CR_PROVIDENCE,
CR_DEFENDER,
CR_SPEARQUICKEN,
MO_IRONHAND,
MO_SPIRITSRECOVERY,
MO_CALLSPIRITS,
MO_ABSORBSPIRITS,
MO_TRIPLEATTACK,
MO_BODYRELOCATION,
MO_DODGE,
MO_INVESTIGATE,
MO_FINGEROFFENSIVE,
MO_STEELBODY,
MO_BLADESTOP,
MO_EXPLOSIONSPIRITS,
MO_EXTREMITYFIST,
MO_CHAINCOMBO,
MO_COMBOFINISH,
SA_ADVANCEDBOOK,
SA_CASTCANCEL,
SA_MAGICROD,
SA_SPELLBREAKER,
SA_FREECAST,
SA_AUTOSPELL,
SA_FLAMELAUNCHER,
SA_FROSTWEAPON,
SA_LIGHTNINGLOADER,
SA_SEISMICWEAPON,
SA_DRAGONOLOGY,
SA_VOLCANO,
SA_DELUGE,
SA_VIOLENTGALE,
SA_LANDPROTECTOR,
SA_DISPELL,
SA_ABRACADABRA,
SA_MONOCELL,
SA_CLASSCHANGE,
SA_SUMMONMONSTER,
SA_REVERSEORCISH,
SA_DEATH,
SA_FORTUNE,
SA_TAMINGMONSTER,
SA_QUESTION,
SA_GRAVITY,
SA_LEVELUP,
SA_INSTANTDEATH,
SA_FULLRECOVERY,
SA_COMA,
BD_ADAPTATION,
BD_ENCORE,
BD_LULLABY,
BD_RICHMANKIM,
BD_ETERNALCHAOS,
BD_DRUMBATTLEFIELD,
BD_RINGNIBELUNGEN,
BD_ROKISWEIL,
BD_INTOABYSS,
BD_SIEGFRIED,
BD_RAGNAROK,
BA_MUSICALLESSON,
BA_MUSICALSTRIKE,
BA_DISSONANCE,
BA_FROSTJOKER,
BA_WHISTLE,
BA_ASSASSINCROSS,
BA_POEMBRAGI,
BA_APPLEIDUN,
DC_DANCINGLESSON,
DC_THROWARROW,
DC_UGLYDANCE,
DC_SCREAM,
DC_HUMMING,
DC_DONTFORGETME,
DC_FORTUNEKISS,
DC_SERVICEFORYOU,
NPC_RANDOMMOVE,
NPC_SPEEDUP,
NPC_REVENGE,
WE_MALE,
WE_FEMALE,
WE_CALLPARTNER,
ITM_TOMAHAWK,
NPC_DARKCROSS,
NPC_GRANDDARKNESS,
NPC_DARKSTRIKE,
NPC_DARKTHUNDER,
NPC_STOP,
NPC_WEAPONBRAKER,
NPC_ARMORBRAKE,
NPC_HELMBRAKE,
NPC_SHIELDBRAKE,
NPC_UNDEADATTACK,
NPC_CHANGEUNDEAD,
NPC_POWERUP,
NPC_AGIUP,
NPC_SIEGEMODE,
NPC_CALLSLAVE,
NPC_INVISIBLE,
NPC_RUN,
LK_AURABLADE,
LK_PARRYING,
LK_CONCENTRATION,
LK_TENSIONRELAX,
LK_BERSERK,
LK_FURY,
HP_ASSUMPTIO,
HP_BASILICA,
HP_MEDITATIO,
HW_SOULDRAIN,
HW_MAGICCRASHER,
HW_MAGICPOWER,
PA_PRESSURE,
PA_SACRIFICE,
PA_GOSPEL,
CH_PALMSTRIKE,
CH_TIGERFIST,
CH_CHAINCRUSH,
PF_HPCONVERSION,
PF_SOULCHANGE,
PF_SOULBURN,
ASC_KATAR,
ASC_HALLUCINATION,
ASC_EDP,
ASC_BREAKER,
SN_SIGHT,
SN_FALCONASSAULT,
SN_SHARPSHOOTING,
SN_WINDWALK,
WS_MELTDOWN,
WS_CREATECOIN,
WS_CREATENUGGET,
WS_CARTBOOST,
WS_SYSTEMCREATE,
ST_CHASEWALK,
ST_REJECTSWORD,
ST_STEALBACKPACK,
CR_ALCHEMY,
CR_SYNTHESISPOTION,
CG_ARROWVULCAN,
CG_MOONLIT,
CG_MARIONETTE,
LK_SPIRALPIERCE,
LK_HEADCRUSH,
LK_JOINTBEAT,
HW_NAPALMVULCAN,
CH_SOULCOLLECT,
PF_MINDBREAKER,
PF_MEMORIZE,
PF_FOGWALL,
PF_SPIDERWEB,
ASC_METEORASSAULT,
ASC_CDP,
WE_BABY,
WE_CALLPARENT,
WE_CALLBABY,
TK_RUN,
TK_READYSTORM,
TK_STORMKICK,
TK_READYDOWN,
TK_DOWNKICK,
TK_READYTURN,
TK_TURNKICK,
TK_READYCOUNTER,
TK_COUNTER,
TK_DODGE,
TK_JUMPKICK,
TK_HPTIME,
TK_SPTIME,
TK_POWER,
TK_SEVENWIND,
TK_HIGHJUMP,
SG_FEEL,
SG_SUN_WARM,
SG_MOON_WARM,
SG_STAR_WARM,
SG_SUN_COMFORT,
SG_MOON_COMFORT,
SG_STAR_COMFORT,
SG_HATE,
SG_SUN_ANGER,
SG_MOON_ANGER,
SG_STAR_ANGER,
SG_SUN_BLESS,
SG_MOON_BLESS,
SG_STAR_BLESS,
SG_DEVIL,
SG_FRIEND,
SG_KNOWLEDGE,
SG_FUSION,
SL_ALCHEMIST,
AM_BERSERKPITCHER,
SL_MONK,
SL_STAR,
SL_SAGE,
SL_CRUSADER,
SL_SUPERNOVICE,
SL_KNIGHT,
SL_WIZARD,
SL_PRIEST,
SL_BARDDANCER,
SL_ROGUE,
SL_ASSASIN,
SL_BLACKSMITH,
BS_ADRENALINE2,
SL_HUNTER,
SL_SOULLINKER,
SL_KAIZEL,
SL_KAAHI,
SL_KAUPE,
SL_KAITE,
SL_KAINA,
SL_STIN,
SL_STUN,
SL_SMA,
SL_SWOO,
SL_SKE,
SL_SKA,
SM_SELFPROVOKE,
NPC_EMOTION_ON,
ST_PRESERVE,
ST_FULLSTRIP,
WS_WEAPONREFINE,
CR_SLIMPITCHER,
CR_FULLPROTECTION,
PA_SHIELDCHAIN,
HP_MANARECHARGE,
PF_DOUBLECASTING,
HW_GANBANTEIN,
HW_GRAVITATION,
WS_CARTTERMINATION,
WS_OVERTHRUSTMAX,
CG_LONGINGFREEDOM,
CG_HERMODE,
CG_TAROTCARD,
CR_ACIDDEMONSTRATION,
CR_CULTIVATION,
ITEM_ENCHANTARMS,
TK_MISSION,
SL_HIGH,
KN_ONEHAND,
AM_TWILIGHT1,
AM_TWILIGHT2,
AM_TWILIGHT3,
HT_POWER,
GS_GLITTERING,
GS_FLING,
GS_TRIPLEACTION,
GS_BULLSEYE,
GS_MADNESSCANCEL,
GS_ADJUSTMENT,
GS_INCREASING,
GS_MAGICALBULLET,
GS_CRACKER,
GS_SINGLEACTION,
GS_SNAKEEYE,
GS_CHAINACTION,
GS_TRACKING,
GS_DISARM,
GS_PIERCINGSHOT,
GS_RAPIDSHOWER,
GS_DESPERADO,
GS_GATLINGFEVER,
GS_DUST,
GS_FULLBUSTER,
GS_SPREADATTACK,
GS_GROUNDDRIFT,
NJ_TOBIDOUGU,
NJ_SYURIKEN,
NJ_KUNAI,
NJ_HUUMA,
NJ_ZENYNAGE,
NJ_TATAMIGAESHI,
NJ_KASUMIKIRI,
NJ_SHADOWJUMP,
NJ_KIRIKAGE,
NJ_UTSUSEMI,
NJ_BUNSINJYUTSU,
NJ_NINPOU,
NJ_KOUENKA,
NJ_KAENSIN,
NJ_BAKUENRYU,
NJ_HYOUSENSOU,
NJ_SUITON,
NJ_HYOUSYOURAKU,
NJ_HUUJIN,
NJ_RAIGEKISAI,
NJ_KAMAITACHI,
NJ_NEN,
NJ_ISSEN,
MB_FIGHTING,
MB_NEUTRAL,
MB_TAIMING_PUTI,
MB_WHITEPOTION,
MB_MENTAL,
MB_CARDPITCHER,
MB_PETPITCHER,
MB_BODYSTUDY,
MB_BODYALTER,
MB_PETMEMORY,
MB_M_TELEPORT,
MB_B_GAIN,
MB_M_GAIN,
MB_MISSION,
MB_MUNAKKNOWLEDGE,
MB_MUNAKBALL,
MB_SCROLL,
MB_B_GATHERING,
MB_M_GATHERING,
MB_B_EXCLUDE,
MB_B_DRIFT,
MB_B_WALLRUSH,
MB_M_WALLRUSH,
MB_B_WALLSHIFT,
MB_M_WALLCRASH,
MB_M_REINCARNATION,
MB_B_EQUIP,
SL_DEATHKNIGHT,
SL_COLLECTOR,
SL_NINJA,
SL_GUNNER,
AM_TWILIGHT4,
DA_RESET,
DE_BERSERKAIZER,
DA_DARKPOWER,
DE_PASSIVE,
DE_PATTACK,
DE_PSPEED,
DE_PDEFENSE,
DE_PCRITICAL,
DE_PHP,
DE_PSP,
DE_RESET,
DE_RANKING,
DE_PTRIPLE,
DE_ENERGY,
DE_NIGHTMARE,
DE_SLASH,
DE_COIL,
DE_WAVE,
DE_REBIRTH,
DE_AURA,
DE_FREEZER,
DE_CHANGEATTACK,
DE_PUNISH,
DE_POISON,
DE_INSTANT,
DE_WARNING,
DE_RANKEDKNIFE,
DE_RANKEDGRADIUS,
DE_GAUGE,
DE_GTIME,
DE_GPAIN,
DE_GSKILL,
DE_GKILL,
DE_ACCEL,
DE_BLOCKDOUBLE,
DE_BLOCKMELEE,
DE_BLOCKFAR,
DE_FRONTATTACK,
DE_DANGERATTACK,
DE_TWINATTACK,
DE_WINDATTACK,
DE_WATERATTACK,
DA_ENERGY,
DA_CLOUD,
DA_FIRSTSLOT,
DA_HEADDEF,
DA_SPACE,
DA_TRANSFORM,
DA_EXPLOSION,
DA_REWARD,
DA_CRUSH,
DA_ITEMREBUILD,
DA_ILLUSION,
DA_NUETRALIZE,
DA_RUNNER,
DA_TRANSFER,
DA_WALL,
DA_ZENY,
DA_REVENGE,
DA_EARPLUG,
DA_CONTRACT,
DA_BLACK,
DA_DREAM,
DA_MAGICCART,
DA_COPY,
DA_CRYSTAL,
DA_EXP,
DA_CARTSWING,
DA_REBUILD,
DA_JOBCHANGE,
DA_EDARKNESS,
DA_EGUARDIAN,
DA_TIMEOUT,
ALL_TIMEIN,
DA_ZENYRANK,
DA_ACCESSORYMIX,
NPC_EARTHQUAKE,
NPC_FIREBREATH,
NPC_ICEBREATH,
NPC_THUNDERBREATH,
NPC_ACIDBREATH,
NPC_DARKNESSBREATH,
NPC_DRAGONFEAR,
NPC_BLEEDING,
NPC_PULSESTRIKE,
NPC_HELLJUDGEMENT,
NPC_WIDESILENCE,
NPC_WIDEFREEZE,
NPC_WIDEBLEEDING,
NPC_WIDESTONE,
NPC_WIDECONFUSE,
NPC_WIDESLEEP,
NPC_WIDESIGHT,
NPC_EVILLAND,
NPC_MAGICMIRROR,
NPC_SLOWCAST,
NPC_CRITICALWOUND,
NPC_EXPULSION,
NPC_STONESKIN,
NPC_ANTIMAGIC,
NPC_WIDECURSE,
NPC_WIDESTUN,
NPC_VAMPIRE_GIFT,
NPC_WIDESOULDRAIN,
ALL_INCCARRY,
NPC_TALK,
NPC_HELLPOWER,
NPC_WIDEHELLDIGNITY,
NPC_INVINCIBLE,
NPC_INVINCIBLEOFF,
NPC_ALLHEAL,
GM_SANDMAN,
CASH_BLESSING,
CASH_INCAGI,
CASH_ASSUMPTIO,
ALL_CATCRY,
ALL_PARTYFLEE,
ALL_ANGEL_PROTECT,
ALL_DREAM_SUMMERNIGHT,
NPC_CHANGEUNDEAD2,
ALL_REVERSEORCISH,
ALL_WEWISH,
ALL_SONKRAN,
NPC_WIDEHEALTHFEAR,
NPC_WIDEBODYBURNNING,
NPC_WIDEFROSTMISTY,
NPC_WIDECOLD,
NPC_WIDE_DEEP_SLEEP,
NPC_WIDESIREN,
NPC_VENOMFOG,
NPC_MILLENNIUMSHIELD,
NPC_COMET,
// TODO: What PACKETVER are these skills added? [Panikon]
// After this addition all skills from NPC_WIDEWEB to NPC_LEX_AETERNA
// will have their IDs changed
#if PACKETVER >= 20140205
NPC_ICEMINE,
NPC_ICEEXPLO,
NPC_FLAMECROSS,
NPC_PULSESTRIKE2,
NPC_DANCINGBLADE,
NPC_DANCINGBLADE_ATK,
NPC_DARKPIERCING,
NPC_MAXPAIN,
NPC_MAXPAIN_ATK,
NPC_DEATHSUMMON,
NPC_HELLBURNING,
NPC_JACKFROST,
#endif
NPC_WIDEWEB,
NPC_WIDESUCK,
NPC_STORMGUST2,
NPC_FIRESTORM,
NPC_REVERBERATION,
NPC_REVERBERATION_ATK,
NPC_LEX_AETERNA,
KN_CHARGEATK = 1001,
CR_SHRINK,
AS_SONICACCEL,
AS_VENOMKNIFE,
RG_CLOSECONFINE,
WZ_SIGHTBLASTER,
SA_CREATECON,
SA_ELEMENTWATER,
HT_PHANTASMIC,
BA_PANGVOICE,
DC_WINKCHARM,
BS_UNFAIRLYTRICK,
BS_GREED,
PR_REDEMPTIO,
MO_KITRANSLATION,
MO_BALKYOUNG,
SA_ELEMENTGROUND,
SA_ELEMENTFIRE,
SA_ELEMENTWIND,
RK_ENCHANTBLADE = 2001,
RK_SONICWAVE,
RK_DEATHBOUND,
RK_HUNDREDSPEAR,
RK_WINDCUTTER,
RK_IGNITIONBREAK,
RK_DRAGONTRAINING,
RK_DRAGONBREATH,
RK_DRAGONHOWLING,
RK_RUNEMASTERY,
RK_MILLENNIUMSHIELD,
RK_CRUSHSTRIKE,
RK_REFRESH,
RK_GIANTGROWTH,
RK_STONEHARDSKIN,
RK_VITALITYACTIVATION,
RK_STORMBLAST,
RK_FIGHTINGSPIRIT,
RK_ABUNDANCE,
RK_PHANTOMTHRUST,
GC_VENOMIMPRESS,
GC_CROSSIMPACT,
GC_DARKILLUSION,
GC_RESEARCHNEWPOISON,
GC_CREATENEWPOISON,
GC_ANTIDOTE,
GC_POISONINGWEAPON,
GC_WEAPONBLOCKING,
GC_COUNTERSLASH,
GC_WEAPONCRUSH,
GC_VENOMPRESSURE,
GC_POISONSMOKE,
GC_CLOAKINGEXCEED,
GC_PHANTOMMENACE,
GC_HALLUCINATIONWALK,
GC_ROLLINGCUTTER,
GC_CROSSRIPPERSLASHER,
AB_JUDEX,
AB_ANCILLA,
AB_ADORAMUS,
AB_CLEMENTIA,
AB_CANTO,
AB_CHEAL,
AB_EPICLESIS,
AB_PRAEFATIO,
AB_ORATIO,
AB_LAUDAAGNUS,
AB_LAUDARAMUS,
AB_EUCHARISTICA,
AB_RENOVATIO,
AB_HIGHNESSHEAL,
AB_CLEARANCE,
AB_EXPIATIO,
AB_DUPLELIGHT,
AB_DUPLELIGHT_MELEE,
AB_DUPLELIGHT_MAGIC,
AB_SILENTIUM,
WL_WHITEIMPRISON = 2201,
WL_SOULEXPANSION,
WL_FROSTMISTY,
WL_JACKFROST,
WL_MARSHOFABYSS,
WL_RECOGNIZEDSPELL,
WL_SIENNAEXECRATE,
WL_RADIUS,
WL_STASIS,
WL_DRAINLIFE,
WL_CRIMSONROCK,
WL_HELLINFERNO,
WL_COMET,
WL_CHAINLIGHTNING,
WL_CHAINLIGHTNING_ATK,
WL_EARTHSTRAIN,
WL_TETRAVORTEX,
WL_TETRAVORTEX_FIRE,
WL_TETRAVORTEX_WATER,
WL_TETRAVORTEX_WIND,
WL_TETRAVORTEX_GROUND,
WL_SUMMONFB,
WL_SUMMONBL,
WL_SUMMONWB,
WL_SUMMON_ATK_FIRE,
WL_SUMMON_ATK_WIND,
WL_SUMMON_ATK_WATER,
WL_SUMMON_ATK_GROUND,
WL_SUMMONSTONE,
WL_RELEASE,
WL_READING_SB,
WL_FREEZE_SP,
RA_ARROWSTORM,
RA_FEARBREEZE,
RA_RANGERMAIN,
RA_AIMEDBOLT,
RA_DETONATOR,
RA_ELECTRICSHOCKER,
RA_CLUSTERBOMB,
RA_WUGMASTERY,
RA_WUGRIDER,
RA_WUGDASH,
RA_WUGSTRIKE,
RA_WUGBITE,
RA_TOOTHOFWUG,
RA_SENSITIVEKEEN,
RA_CAMOUFLAGE,
RA_RESEARCHTRAP,
RA_MAGENTATRAP,
RA_COBALTTRAP,
RA_MAIZETRAP,
RA_VERDURETRAP,
RA_FIRINGTRAP,
RA_ICEBOUNDTRAP,
NC_MADOLICENCE,
NC_BOOSTKNUCKLE,
NC_PILEBUNKER,
NC_VULCANARM,
NC_FLAMELAUNCHER,
NC_COLDSLOWER,
NC_ARMSCANNON,
NC_ACCELERATION,
NC_HOVERING,
NC_F_SIDESLIDE,
NC_B_SIDESLIDE,
NC_MAINFRAME,
NC_SELFDESTRUCTION,
NC_SHAPESHIFT,
NC_EMERGENCYCOOL,
NC_INFRAREDSCAN,
NC_ANALYZE,
NC_MAGNETICFIELD,
NC_NEUTRALBARRIER,
NC_STEALTHFIELD,
NC_REPAIR,
NC_TRAININGAXE,
NC_RESEARCHFE,
NC_AXEBOOMERANG,
NC_POWERSWING,
NC_AXETORNADO,
NC_SILVERSNIPER,
NC_MAGICDECOY,
NC_DISJOINT,
SC_FATALMENACE,
SC_REPRODUCE,
SC_AUTOSHADOWSPELL,
SC_SHADOWFORM,
SC_TRIANGLESHOT,
SC_BODYPAINT,
SC_INVISIBILITY,
SC_DEADLYINFECT,
SC_ENERVATION,
SC_GROOMY,
SC_IGNORANCE,
SC_LAZINESS,
SC_UNLUCKY,
SC_WEAKNESS,
SC_STRIPACCESSARY,
SC_MANHOLE,
SC_DIMENSIONDOOR,
SC_CHAOSPANIC,
SC_MAELSTROM,
SC_BLOODYLUST,
SC_FEINTBOMB,
LG_CANNONSPEAR = 2307,
LG_BANISHINGPOINT,
LG_TRAMPLE,
LG_SHIELDPRESS,
LG_REFLECTDAMAGE,
LG_PINPOINTATTACK,
LG_FORCEOFVANGUARD,
LG_RAGEBURST,
LG_SHIELDSPELL,
LG_EXEEDBREAK,
LG_OVERBRAND,
LG_PRESTIGE,
LG_BANDING,
LG_MOONSLASHER,
LG_RAYOFGENESIS,
LG_PIETY,
LG_EARTHDRIVE,
LG_HESPERUSLIT,
LG_INSPIRATION,
SR_DRAGONCOMBO,
SR_SKYNETBLOW,
SR_EARTHSHAKER,
SR_FALLENEMPIRE,
SR_TIGERCANNON,
SR_HELLGATE,
SR_RAMPAGEBLASTER,
SR_CRESCENTELBOW,
SR_CURSEDCIRCLE,
SR_LIGHTNINGWALK,
SR_KNUCKLEARROW,
SR_WINDMILL,
SR_RAISINGDRAGON,
SR_GENTLETOUCH,
SR_ASSIMILATEPOWER,
SR_POWERVELOCITY,
SR_CRESCENTELBOW_AUTOSPELL,
SR_GATEOFHELL,
SR_GENTLETOUCH_QUIET,
SR_GENTLETOUCH_CURE,
SR_GENTLETOUCH_ENERGYGAIN,
SR_GENTLETOUCH_CHANGE,
SR_GENTLETOUCH_REVITALIZE,
WA_SWING_DANCE = 2350,
WA_SYMPHONY_OF_LOVER,
WA_MOONLIT_SERENADE,
MI_RUSH_WINDMILL = 2381,
MI_ECHOSONG,
MI_HARMONIZE,
WM_LESSON = 2412,
WM_METALICSOUND,
WM_REVERBERATION,
WM_REVERBERATION_MELEE,
WM_REVERBERATION_MAGIC,
WM_DOMINION_IMPULSE,
WM_SEVERE_RAINSTORM,
WM_POEMOFNETHERWORLD,
WM_VOICEOFSIREN,
WM_DEADHILLHERE,
WM_LULLABY_DEEPSLEEP,
WM_SIRCLEOFNATURE,
WM_RANDOMIZESPELL,
WM_GLOOMYDAY,
WM_GREAT_ECHO,
WM_SONG_OF_MANA,
WM_DANCE_WITH_WUG,
WM_SOUND_OF_DESTRUCTION,
WM_SATURDAY_NIGHT_FEVER,
WM_LERADS_DEW,
WM_MELODYOFSINK,
WM_BEYOND_OF_WARCRY,
WM_UNLIMITED_HUMMING_VOICE,
SO_FIREWALK = 2443,
SO_ELECTRICWALK,
SO_SPELLFIST,
SO_EARTHGRAVE,
SO_DIAMONDDUST,
SO_POISON_BUSTER,
SO_PSYCHIC_WAVE,
SO_CLOUD_KILL,
SO_STRIKING,
SO_WARMER,
SO_VACUUM_EXTREME,
SO_VARETYR_SPEAR,
SO_ARRULLO,
SO_EL_CONTROL,
SO_SUMMON_AGNI,
SO_SUMMON_AQUA,
SO_SUMMON_VENTUS,
SO_SUMMON_TERA,
SO_EL_ACTION,
SO_EL_ANALYSIS,
SO_EL_SYMPATHY,
SO_EL_CURE,
SO_FIRE_INSIGNIA,
SO_WATER_INSIGNIA,
SO_WIND_INSIGNIA,
SO_EARTH_INSIGNIA,
GN_TRAINING_SWORD = 2474,
GN_REMODELING_CART,
GN_CART_TORNADO,
GN_CARTCANNON,
GN_CARTBOOST,
GN_THORNS_TRAP,
GN_BLOOD_SUCKER,
GN_SPORE_EXPLOSION,
GN_WALLOFTHORN,
GN_CRAZYWEED,
GN_CRAZYWEED_ATK,
GN_DEMONIC_FIRE,
GN_FIRE_EXPANSION,
GN_FIRE_EXPANSION_SMOKE_POWDER,
GN_FIRE_EXPANSION_TEAR_GAS,
GN_FIRE_EXPANSION_ACID,
GN_HELLS_PLANT,
GN_HELLS_PLANT_ATK,
GN_MANDRAGORA,
GN_SLINGITEM,
GN_CHANGEMATERIAL,
GN_MIX_COOKING,
GN_MAKEBOMB,
GN_S_PHARMACY,
GN_SLINGITEM_RANGEMELEEATK,
AB_SECRAMENT = 2515,
WM_SEVERE_RAINSTORM_MELEE,
SR_HOWLINGOFLION,
SR_RIDEINLIGHTNING,
LG_OVERBRAND_BRANDISH,
LG_OVERBRAND_PLUSATK,
ALL_ODINS_RECALL = 2533,
RETURN_TO_ELDICASTES,
ALL_BUYING_STORE,
ALL_GUARDIAN_RECALL,
ALL_ODINS_POWER,
BEER_BOTTLE_CAP,
NPC_ASSASSINCROSS,
NPC_DISSONANCE,
NPC_UGLYDANCE,
ALL_TETANY,
ALL_RAY_OF_PROTECTION,
MC_CARTDECORATE,
GM_ITEM_ATKMAX,
GM_ITEM_ATKMIN,
GM_ITEM_MATKMAX,
GM_ITEM_MATKMIN,
ALL_LIGHTGUARD,
RL_GLITTERING_GREED = 2551,
RL_RICHS_COIN,
RL_MASS_SPIRAL,
RL_BANISHING_BUSTER,
RL_B_TRAP,
RL_FLICKER,
RL_S_STORM,
RL_E_CHAIN,
RL_QD_SHOT,
RL_C_MARKER,
RL_FIREDANCE,
RL_H_MINE,
RL_P_ALTER,
RL_FALLEN_ANGEL,
RL_R_TRIP,
RL_D_TAIL,
RL_FIRE_RAIN,
RL_HEAT_BARREL,
RL_AM_BLAST,
RL_SLUGSHOT,
RL_HAMMER_OF_GOD,
RL_R_TRIP_PLUSATK,
RL_B_FLICKER_ATK,
RL_GLITTERING_GREED_ATK,
KO_YAMIKUMO = 3001,
KO_RIGHT,
KO_LEFT,
KO_JYUMONJIKIRI,
KO_SETSUDAN,
KO_BAKURETSU,
KO_HAPPOKUNAI,
KO_MUCHANAGE,
KO_HUUMARANKA,
KO_MAKIBISHI,
KO_MEIKYOUSISUI,
KO_ZANZOU,
KO_KYOUGAKU,
KO_JYUSATSU,
KO_KAHU_ENTEN,
KO_HYOUHU_HUBUKI,
KO_KAZEHU_SEIRAN,
KO_DOHU_KOUKAI,
KO_KAIHOU,
KO_ZENKAI,
KO_GENWAKU,
KO_IZAYOI,
KG_KAGEHUMI,
KG_KYOMU,
KG_KAGEMUSYA,
OB_ZANGETSU,
OB_OBOROGENSOU,
OB_OBOROGENSOU_TRANSITION_ATK,
OB_AKAITSUKI,
ECL_SNOWFLIP = 3031,
ECL_PEONYMAMY,
ECL_SADAGUI,
ECL_SEQUOIADUST,
ECLAGE_RECALL,
BA_POEMBRAGI2,
DC_FORTUNEKISS2,
ITEM_OPTION_SPLASH_ATTACK,
GM_FORCE_TRANSFER,
GM_WIDE_RESURRECTION,
ALL_NIFLHEIM_RECALL,
ALL_PRONTERA_RECALL,
ALL_GLASTHEIM_RECALL,
ALL_THANATOS_RECALL,
GC_DARKCROW = 5001,
RA_UNLIMIT,
GN_ILLUSIONDOPING,
RK_DRAGONBREATH_WATER,
RK_LUXANIMA,
NC_MAGMA_ERUPTION,
WM_FRIGG_SONG,
SO_ELEMENTAL_SHIELD,
SR_FLASHCOMBO,
SC_ESCAPE,
AB_OFFERTORIUM,
WL_TELEKINESIS_INTENSE,
LG_KINGS_GRACE,
ALL_FULL_THROTTLE,
NC_MAGMA_ERUPTION_DOTDAMAGE,
/** Summoner */
SU_BASIC_SKILL = 5018,
SU_BITE,
SU_HIDE,
SU_SCRATCH,
SU_STOOP,
SU_LOPE,
SU_SPRITEMABLE,
SU_POWEROFLAND,
SU_SV_STEMSPEAR,
SU_CN_POWDERING,
SU_CN_METEOR,
SU_SV_ROOTTWIST,
SU_SV_ROOTTWIST_ATK,
SU_POWEROFLIFE,
SU_SCAROFTAROU,
SU_PICKYPECK,
SU_PICKYPECK_DOUBLE_ATK,
SU_ARCLOUSEDASH,
SU_LUNATICCARROTBEAT,
SU_POWEROFSEA,
SU_TUNABELLY,
SU_TUNAPARTY,
SU_BUNCHOFSHRIMP,
SU_FRESHSHRIMP,
SU_CN_METEOR2,
SU_LUNATICCARROTBEAT2,
SU_SOULATTACK,
SU_POWEROFFLOCK,
SU_SVG_SPIRIT,
SU_HISS,
SU_NYANGGRASS,
SU_GROOMING,
SU_PURRING,
SU_SHRIMPARTY,
SU_SPIRITOFLIFE,
SU_MEOWMEOW,
SU_SPIRITOFLAND,
SU_CHATTERING,
SU_SPIRITOFSEA,
HLIF_HEAL = 8001,
HLIF_AVOID,
HLIF_BRAIN,
HLIF_CHANGE,
HAMI_CASTLE,
HAMI_DEFENCE,
HAMI_SKIN,
HAMI_BLOODLUST,
HFLI_MOON,
HFLI_FLEET,
HFLI_SPEED,
HFLI_SBR44,
HVAN_CAPRICE,
HVAN_CHAOTIC,
HVAN_INSTRUCT,
HVAN_EXPLOSION,
MUTATION_BASEJOB,
MH_SUMMON_LEGION,
MH_NEEDLE_OF_PARALYZE,
MH_POISON_MIST,
MH_PAIN_KILLER,
MH_LIGHT_OF_REGENE,
MH_OVERED_BOOST,
MH_ERASER_CUTTER,
MH_XENO_SLASHER,
MH_SILENT_BREEZE,
MH_STYLE_CHANGE,
MH_SONIC_CRAW,
MH_SILVERVEIN_RUSH,
MH_MIDNIGHT_FRENZY,
MH_STAHL_HORN,
MH_GOLDENE_FERSE,
MH_STEINWAND,
MH_HEILIGE_STANGE,
MH_ANGRIFFS_MODUS,
MH_TINDER_BREAKER,
MH_CBC,
MH_EQC,
MH_MAGMA_FLOW,
MH_GRANITIC_ARMOR,
MH_LAVA_SLIDE,
MH_PYROCLASTIC,
MH_VOLCANIC_ASH,
MS_BASH = 8201,
MS_MAGNUM,
MS_BOWLINGBASH,
MS_PARRYING,
MS_REFLECTSHIELD,
MS_BERSERK,
MA_DOUBLE,
MA_SHOWER,
MA_SKIDTRAP,
MA_LANDMINE,
MA_SANDMAN,
MA_FREEZINGTRAP,
MA_REMOVETRAP,
MA_CHARGEARROW,
MA_SHARPSHOOTING,
ML_PIERCE,
ML_BRANDISH,
ML_SPIRALPIERCE,
ML_DEFENDER,
ML_AUTOGUARD,
ML_DEVOTION,
MER_MAGNIFICAT,
MER_QUICKEN,
MER_SIGHT,
MER_CRASH,
MER_REGAIN,
MER_TENDER,
MER_BENEDICTION,
MER_RECUPERATE,
MER_MENTALCURE,
MER_COMPRESS,
MER_PROVOKE,
MER_AUTOBERSERK,
MER_DECAGI,
MER_SCAPEGOAT,
MER_LEXDIVINA,
MER_ESTIMATION,
MER_KYRIE,
MER_BLESSING,
MER_INCAGI,
MER_INVINCIBLEOFF2,
EL_CIRCLE_OF_FIRE = 8401,
EL_FIRE_CLOAK,
EL_FIRE_MANTLE,
EL_WATER_SCREEN,
EL_WATER_DROP,
EL_WATER_BARRIER,
EL_WIND_STEP,
EL_WIND_CURTAIN,
EL_ZEPHYR,
EL_SOLID_SKIN,
EL_STONE_SHIELD,
EL_POWER_OF_GAIA,
EL_PYROTECHNIC,
EL_HEATER,
EL_TROPIC,
EL_AQUAPLAY,
EL_COOLER,
EL_CHILLY_AIR,
EL_GUST,
EL_BLAST,
EL_WILD_STORM,
EL_PETROLOGY,
EL_CURSED_SOIL,
EL_UPHEAVAL,
EL_FIRE_ARROW,
EL_FIRE_BOMB,
EL_FIRE_BOMB_ATK,
EL_FIRE_WAVE,
EL_FIRE_WAVE_ATK,
EL_ICE_NEEDLE,
EL_WATER_SCREW,
EL_WATER_SCREW_ATK,
EL_TIDAL_WEAPON,
EL_WIND_SLASH,
EL_HURRICANE,
EL_HURRICANE_ATK,
EL_TYPOON_MIS,
EL_TYPOON_MIS_ATK,
EL_STONE_HAMMER,
EL_ROCK_CRUSHER,
EL_ROCK_CRUSHER_ATK,
EL_STONE_RAIN,
};
/// The client view ids for land skills.
enum {
UNT_SAFETYWALL = 0x7e,
UNT_FIREWALL,
UNT_WARP_WAITING,
UNT_WARP_ACTIVE,
UNT_BENEDICTIO, //TODO
UNT_SANCTUARY,
UNT_MAGNUS,
UNT_PNEUMA,
UNT_DUMMYSKILL, //These show no effect on the client
UNT_FIREPILLAR_WAITING,
UNT_FIREPILLAR_ACTIVE,
UNT_HIDDEN_TRAP, //TODO
UNT_TRAP, //TODO
UNT_HIDDEN_WARP_NPC, //TODO
UNT_USED_TRAPS,
UNT_ICEWALL,
UNT_QUAGMIRE,
UNT_BLASTMINE,
UNT_SKIDTRAP,
UNT_ANKLESNARE,
UNT_VENOMDUST,
UNT_LANDMINE,
UNT_SHOCKWAVE,
UNT_SANDMAN,
UNT_FLASHER,
UNT_FREEZINGTRAP,
UNT_CLAYMORETRAP,
UNT_TALKIEBOX,
UNT_VOLCANO,
UNT_DELUGE,
UNT_VIOLENTGALE,
UNT_LANDPROTECTOR,
UNT_LULLABY,
UNT_RICHMANKIM,
UNT_ETERNALCHAOS,
UNT_DRUMBATTLEFIELD,
UNT_RINGNIBELUNGEN,
UNT_ROKISWEIL,
UNT_INTOABYSS,
UNT_SIEGFRIED,
UNT_DISSONANCE,
UNT_WHISTLE,
UNT_ASSASSINCROSS,
UNT_POEMBRAGI,
UNT_APPLEIDUN,
UNT_UGLYDANCE,
UNT_HUMMING,
UNT_DONTFORGETME,
UNT_FORTUNEKISS,
UNT_SERVICEFORYOU,
UNT_GRAFFITI,
UNT_DEMONSTRATION,
UNT_CALLFAMILY,
UNT_GOSPEL,
UNT_BASILICA,
UNT_MOONLIT,
UNT_FOGWALL,
UNT_SPIDERWEB,
UNT_GRAVITATION,
UNT_HERMODE,
UNT_KAENSIN, //TODO
UNT_SUITON,
UNT_TATAMIGAESHI,
UNT_KAEN,
UNT_GROUNDDRIFT_WIND,
UNT_GROUNDDRIFT_DARK,
UNT_GROUNDDRIFT_POISON,
UNT_GROUNDDRIFT_WATER,
UNT_GROUNDDRIFT_FIRE,
UNT_DEATHWAVE, //TODO
UNT_WATERATTACK, //TODO
UNT_WINDATTACK, //TODO
UNT_EARTHQUAKE,
UNT_EVILLAND,
UNT_DARK_RUNNER, //TODO
UNT_DARK_TRANSFER, //TODO
UNT_EPICLESIS,
UNT_EARTHSTRAIN,
UNT_MANHOLE,
UNT_DIMENSIONDOOR,
UNT_CHAOSPANIC,
UNT_MAELSTROM,
UNT_BLOODYLUST,
UNT_FEINTBOMB,
UNT_MAGENTATRAP,
UNT_COBALTTRAP,
UNT_MAIZETRAP,
UNT_VERDURETRAP,
UNT_FIRINGTRAP,
UNT_ICEBOUNDTRAP,
UNT_ELECTRICSHOCKER,
UNT_CLUSTERBOMB,
UNT_REVERBERATION,
UNT_SEVERE_RAINSTORM,
UNT_FIREWALK,
UNT_ELECTRICWALK,
UNT_NETHERWORLD,
UNT_PSYCHIC_WAVE,
UNT_CLOUD_KILL,
UNT_POISONSMOKE,
UNT_NEUTRALBARRIER,
UNT_STEALTHFIELD,
UNT_WARMER,
UNT_THORNS_TRAP,
UNT_WALLOFTHORN,
UNT_DEMONIC_FIRE,
UNT_FIRE_EXPANSION_SMOKE_POWDER,
UNT_FIRE_EXPANSION_TEAR_GAS,
UNT_HELLS_PLANT,
UNT_VACUUM_EXTREME,
UNT_BANDING,
UNT_FIRE_MANTLE,
UNT_WATER_BARRIER,
UNT_ZEPHYR,
UNT_POWER_OF_GAIA,
UNT_FIRE_INSIGNIA,
UNT_WATER_INSIGNIA,
UNT_WIND_INSIGNIA,
UNT_EARTH_INSIGNIA,
UNT_POISON_MIST,
UNT_LAVA_SLIDE,
UNT_VOLCANIC_ASH,
UNT_ZENKAI_WATER,
UNT_ZENKAI_LAND,
UNT_ZENKAI_FIRE,
UNT_ZENKAI_WIND,
UNT_MAKIBISHI,
UNT_VENOMFOG,
UNT_ICEMINE,
UNT_FLAMECROSS,
UNT_HELLBURNING,
UNT_MAGMA_ERUPTION,
UNT_KINGS_GRACE,
UNT_GLITTERING_GREED,
UNT_B_TRAP,
UNT_FIRE_RAIN,
UNT_CATNIPPOWDER,
UNT_SV_ROOTTWIST,
/**
* Guild Auras
**/
UNT_GD_LEADERSHIP = 0xc1,
UNT_GD_GLORYWOUNDS = 0xc2,
UNT_GD_SOULCOLD = 0xc3,
UNT_GD_HAWKEYES = 0xc4,
UNT_MAX = 0x190
};
/** Constants to identify the auto-cast type. **/
enum autocast_type {
AUTOCAST_NONE = 0,
AUTOCAST_TEMP, // Used when type is only required during the execution of the calling instance. (For example bAutoSpell* skills.)
AUTOCAST_ABRA, // Used for Abracadabra (Hocus pocus).
AUTOCAST_IMPROVISE, // Used for Improvised Song.
AUTOCAST_ITEM, // Used for itemskill() script command.
};
/** Constants for allowed skill use while interacting with NPC. **/
enum skill_enabled_npc_flags {
SKILLENABLEDNPC_NONE = 0, //!< Don't allow using any skills while interacting with NPC.
SKILLENABLEDNPC_SELF = 1, //!< Allow using non-damaging self skills while interacting with NPC.
SKILLENABLEDNPC_ALL = 2, //!< Allow using all skills while interacting with NPC.
};
/**
* Structures
**/
/** A container holding all required items. **/
struct skill_required_item_data {
struct {
int id;
int amount[MAX_SKILL_LEVEL];
} item[MAX_SKILL_ITEM_REQUIRE];
bool any[MAX_SKILL_LEVEL];
};
struct skill_condition {
int weapon,ammo,ammo_qty,hp,sp,zeny,spiritball,mhp,state;
int msp;
int itemid[MAX_SKILL_ITEM_REQUIRE],amount[MAX_SKILL_ITEM_REQUIRE];
int equip_id[MAX_SKILL_ITEM_REQUIRE];
int equip_amount[MAX_SKILL_ITEM_REQUIRE];
};
// Database skills
struct s_skill_db {
int nameid;
char name[MAX_SKILL_NAME_LENGTH + 1];
char desc[MAX_SKILL_DESC_LENGTH + 1];
int range[MAX_SKILL_LEVEL];
int hit[MAX_SKILL_LEVEL];
int inf;
int element[MAX_SKILL_LEVEL];
int nk;
int splash[MAX_SKILL_LEVEL];
int max;
int num[MAX_SKILL_LEVEL];
int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
#ifdef RENEWAL_CAST
int fixed_cast[MAX_SKILL_LEVEL];
#endif
int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL],cooldown[MAX_SKILL_LEVEL];
int castcancel[MAX_SKILL_LEVEL];
int cast_def_rate[MAX_SKILL_LEVEL];
int inf2;
int maxcount[MAX_SKILL_LEVEL];
int skill_type[MAX_SKILL_LEVEL];
int blewcount[MAX_SKILL_LEVEL];
int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
int msp[MAX_SKILL_LEVEL];
int weapon;
int ammo;
int ammo_qty[MAX_SKILL_LEVEL];
int state[MAX_SKILL_LEVEL];
int spiritball[MAX_SKILL_LEVEL];
int castnodex[MAX_SKILL_LEVEL], delaynodex[MAX_SKILL_LEVEL];
int unit_id[MAX_SKILL_LEVEL][2];
int unit_layout_type[MAX_SKILL_LEVEL];
int unit_range[MAX_SKILL_LEVEL];
int unit_interval[MAX_SKILL_LEVEL];
int unit_target[MAX_SKILL_LEVEL];
int unit_flag;
struct skill_required_item_data req_items;
struct skill_required_item_data req_equip;
};
struct s_skill_unit_layout {
int count;
int dx[MAX_SKILL_UNIT_COUNT];
int dy[MAX_SKILL_UNIT_COUNT];
};
struct skill_timerskill {
int timer;
int src_id;
int target_id;
int map;
short x,y;
uint16 skill_id,skill_lv;
int type; // a BF_ type (NOTE: some places use this as general-purpose storage...)
int flag;
};
struct skill_unit_group {
int src_id;
int party_id;
int guild_id;
int bg_id;
int clan_id;
int map;
int target_flag; //Holds BCT_* flag for battle_check_target
int bl_flag; //Holds BL_* flag for map_foreachin* functions
int64 tick;
int limit,interval;
uint16 skill_id,skill_lv;
int val1,val2,val3;
char *valstr;
int unit_id;
int group_id;
int alive_count;
int item_id; //store item used.
struct {
int count;
struct skill_unit *data;
} unit;
struct {
unsigned ammo_consume : 1;
unsigned song_dance : 2; //0x1 Song/Dance, 0x2 Ensemble
unsigned guildaura : 1;
} state;
};
struct skill_unit {
struct block_list bl;
struct skill_unit_group *group;
int limit;
int val1,val2;
bool visible;
short alive,range;
int prev;
};
struct skill_unit_group_tickset {
int64 tick;
int id;
};
// Create Database item
struct s_skill_produce_db {
int nameid, trigger;
int req_skill,req_skill_lv,itemlv;
int mat_id[MAX_PRODUCE_RESOURCE],mat_amount[MAX_PRODUCE_RESOURCE];
};
// Creating database arrow
struct s_skill_arrow_db {
int nameid, trigger;
int cre_id[MAX_ARROW_RESOURCE],cre_amount[MAX_ARROW_RESOURCE];
};
// Abracadabra database
struct s_skill_abra_db {
uint16 skill_id;
int req_lv;
int per;
};
//GCross magic mushroom database
struct s_skill_magicmushroom_db {
uint16 skill_id;
};
struct skill_cd_entry {
int duration;//milliseconds
int total;/* used when reducing offline cooldown and for display on newer clients */
short skidx;//the skill index entries belong to
int64 started;/* gettick() of when it started, used vs duration to measure how much left upon logout */
int timer;/* timer id */
uint16 skill_id;//skill id
};
/**
* Skill Cool Down Delay Saving
* Struct skill_cd is not a member of struct map_session_data
* to keep cooldowns in memory between player log-ins.
* All cooldowns are reset when server is restarted.
**/
struct skill_cd {
struct skill_cd_entry *entry[MAX_SKILL_TREE];
unsigned char cursor;
};
/**
* Skill Unit Persistency during endack routes (mostly for songs see bugreport:4574)
**/
struct skill_unit_save {
uint16 skill_id, skill_lv;
};
struct s_skill_improvise_db {
uint16 skill_id;
short per;//1-10000
};
struct s_skill_changematerial_db {
int itemid;
short rate;
int qty[5];
short qty_rate[5];
};
struct s_skill_spellbook_db {
int nameid;
uint16 skill_id;
int point;
};
typedef int (*SkillFunc)(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
struct s_skill_dbs {
BEGIN_ZEROED_BLOCK; // This block will be zeroed in skill_defaults() as well as skill_readdb()
struct s_skill_db db[MAX_SKILL_DB];
struct s_skill_produce_db produce_db[MAX_SKILL_PRODUCE_DB];
struct s_skill_arrow_db arrow_db[MAX_SKILL_ARROW_DB];
struct s_skill_abra_db abra_db[MAX_SKILL_ABRA_DB];
struct s_skill_magicmushroom_db magicmushroom_db[MAX_SKILL_MAGICMUSHROOM_DB];
struct s_skill_improvise_db improvise_db[MAX_SKILL_IMPROVISE_DB];
struct s_skill_changematerial_db changematerial_db[MAX_SKILL_PRODUCE_DB];
struct s_skill_spellbook_db spellbook_db[MAX_SKILL_SPELLBOOK_DB];
END_ZEROED_BLOCK;
struct s_skill_unit_layout unit_layout[MAX_SKILL_UNIT_LAYOUT];
};
/**
* Skill.c Interface
**/
struct skill_interface {
int (*init) (bool minimal);
int (*final) (void);
void (*reload) (void);
void (*read_db) (bool minimal);
/* */
struct DBMap *cd_db; // char_id -> struct skill_cd
struct DBMap *name2id_db;
struct DBMap *unit_db; // int id -> struct skill_unit*
struct DBMap *usave_db; // char_id -> struct skill_unit_save
struct DBMap *group_db;// int group_id -> struct skill_unit_group*
struct DBMap *bowling_db;// int mob_id -> struct mob_data*s
/* */
struct eri *unit_ers; //For handling skill_unit's [Skotlex]
struct eri *timer_ers; //For handling skill_timerskills [Skotlex]
struct eri *cd_ers; // ERS Storage for skill cool down managers [Ind/Hercules]
struct eri *cd_entry_ers; // ERS Storage for skill cool down entries [Ind/Hercules]
/* */
struct s_skill_dbs *dbs;
/* */
int enchant_eff[5];
int deluge_eff[5];
int firewall_unit_pos;
int icewall_unit_pos;
int earthstrain_unit_pos;
int area_temp[8];
int unit_temp[20]; // temporary storage for tracking skill unit skill ids as players move in/out of them
int unit_group_newid;
/* accesssors */
int (*get_index) (int skill_id);
int (*get_type) (int skill_id, int skill_lv);
int (*get_hit) (int skill_id, int skill_lv);
int (*get_inf) (int skill_id);
int (*get_ele) (int skill_id, int skill_lv);
int (*get_nk) (int skill_id);
int (*get_max) (int skill_id);
int (*get_range) (int skill_id, int skill_lv);
int (*get_range2) (struct block_list *bl, int skill_id, int skill_lv);
int (*get_splash) (int skill_id, int skill_lv);
int (*get_hp) (int skill_id, int skill_lv);
int (*get_mhp) (int skill_id, int skill_lv);
int (*get_msp) (int skill_id, int skill_lv);
int (*get_sp) (int skill_id, int skill_lv);
int (*get_hp_rate) (int skill_id, int skill_lv);
int (*get_sp_rate) (int skill_id, int skill_lv);
int (*get_state) (int skill_id, int skill_lv);
int (*get_spiritball) (int skill_id, int skill_lv);
int (*get_itemid) (int skill_id, int item_idx);
int (*get_itemqty) (int skill_id, int item_idx, int skill_lv);
bool (*get_item_any_flag) (int skill_id, int skill_lv);
int (*get_equip_id) (int skill_id, int item_idx);
int (*get_equip_amount) (int skill_id, int item_idx, int skill_lv);
bool (*get_equip_any_flag) (int skill_id, int skill_lv);
int (*get_zeny) (int skill_id, int skill_lv);
int (*get_num) (int skill_id, int skill_lv);
int (*get_cast) (int skill_id, int skill_lv);
int (*get_delay) (int skill_id, int skill_lv);
int (*get_walkdelay) (int skill_id, int skill_lv);
int (*get_time) (int skill_id, int skill_lv);
int (*get_time2) (int skill_id, int skill_lv);
int (*get_castnodex) (int skill_id, int skill_lv);
int (*get_delaynodex) (int skill_id, int skill_lv);
int (*get_castdef) (int skill_id, int skill_lv);
int (*get_weapontype) (int skill_id);
int (*get_ammotype) (int skill_id);
int (*get_ammo_qty) (int skill_id, int skill_lv);
int (*get_unit_id) (int skill_id, int skill_lv, int flag);
int (*get_inf2) (int skill_id);
int (*get_castcancel) (int skill_id, int skill_lv);
int (*get_maxcount) (int skill_id, int skill_lv);
int (*get_blewcount) (int skill_id, int skill_lv);
int (*get_unit_flag) (int skill_id);
int (*get_unit_target) (int skill_id, int skill_lv);
int (*get_unit_interval) (int skill_id, int skill_lv);
int (*get_unit_bl_target) (int skill_id, int skill_lv);
int (*get_unit_layout_type) (int skill_id, int skill_lv);
int (*get_unit_range) (int skill_id, int skill_lv);
int (*get_cooldown) (int skill_id, int skill_lv);
int (*tree_get_max) (int skill_id, int class);
const char *(*get_name) (int skill_id);
const char *(*get_desc) (int skill_id);
/* whether its CAST_GROUND, CAST_DAMAGE or CAST_NODAMAGE */
int (*get_casttype) (int skill_id);
int (*get_casttype2) (int index);
bool (*is_combo) (int skill_id);
int (*name2id) (const char* name);
int (*isammotype) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*castend_id) (int tid, int64 tick, int id, intptr_t data);
int (*castend_pos) (int tid, int64 tick, int id, intptr_t data);
int (*castend_map) ( struct map_session_data *sd,uint16 skill_id, const char *mapname);
int (*cleartimerskill) (struct block_list *src);
int (*addtimerskill) (struct block_list *src, int64 tick, int target, int x, int y, uint16 skill_id, uint16 skill_lv, int type, int flag);
int (*additional_effect) (struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, int dmg_lv, int64 tick);
int (*counter_additional_effect) (struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int attack_type, int64 tick);
int (*blown) (struct block_list* src, struct block_list* target, int count, enum unit_dir dir, int flag);
int (*break_equip) (struct block_list *bl, unsigned short where, int rate, int flag);
int (*strip_equip) (struct block_list *bl, unsigned short where, int rate, int lv, int time);
struct skill_unit_group* (*id2group) (int group_id);
struct skill_unit_group *(*unitsetting) (struct block_list* src, uint16 skill_id, uint16 skill_lv, short x, short y, int flag);
struct skill_unit *(*initunit) (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2);
int (*delunit) (struct skill_unit *su);
struct skill_unit_group *(*init_unitgroup) (struct block_list* src, int count, uint16 skill_id, uint16 skill_lv, int unit_id, int limit, int interval);
int (*del_unitgroup) (struct skill_unit_group *group);
int (*clear_unitgroup) (struct block_list *src);
int (*clear_group) (struct block_list *bl, int flag);
int (*unit_onplace) (struct skill_unit *src, struct block_list *bl, int64 tick);
int (*unit_ondamaged) (struct skill_unit *src, struct block_list *bl, int64 damage, int64 tick);
int (*cast_fix) ( struct block_list *bl, uint16 skill_id, uint16 skill_lv);
int (*cast_fix_sc) ( struct block_list *bl, int time);
int (*vf_cast_fix) ( struct block_list *bl, double time, uint16 skill_id, uint16 skill_lv);
int (*delay_fix) ( struct block_list *bl, uint16 skill_id, uint16 skill_lv);
int (*check_condition_required_equip) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*check_condition_castbegin) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*check_condition_required_items) (struct map_session_data *sd, int skill_id, int skill_lv);
bool (*items_required) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*check_condition_castend) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*get_any_item_index) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*consume_requirement) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv, short type);
struct skill_condition (*get_requirement) (struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
int (*check_pc_partner) (struct map_session_data *sd, uint16 skill_id, uint16* skill_lv, int range, int cast_flag);
int (*unit_move) (struct block_list *bl, int64 tick, int flag);
int (*unit_onleft) (uint16 skill_id, struct block_list *bl, int64 tick);
int (*unit_onout) (struct skill_unit *src, struct block_list *bl, int64 tick);
int (*unit_move_unit_group) ( struct skill_unit_group *group, int16 m,int16 dx,int16 dy);
int (*sit) (struct map_session_data *sd, int type);
void (*brandishspear) (struct block_list* src, struct block_list* bl, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
void (*repairweapon) (struct map_session_data *sd, int idx);
void (*identify) (struct map_session_data *sd,int idx);
void (*weaponrefine) (struct map_session_data *sd,int idx);
int (*autospell) (struct map_session_data *md,uint16 skill_id);
int (*calc_heal) (struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, bool heal);
bool (*check_cloaking) (struct block_list *bl, struct status_change_entry *sce);
int (*check_cloaking_end) (struct block_list *bl, va_list ap);
bool (*can_cloak) (struct map_session_data *sd);
int (*enchant_elemental_end) (struct block_list *bl, int type);
int (*not_ok) (uint16 skill_id, struct map_session_data *sd);
int (*not_ok_unknown) (uint16 skill_id, struct map_session_data *sd);
int (*not_ok_hom) (uint16 skill_id, struct homun_data *hd);
int (*not_ok_hom_unknown) (uint16 skill_id, struct homun_data *hd);
int (*not_ok_mercenary) (uint16 skill_id, struct mercenary_data *md);
void (*validate_autocast_data) (struct map_session_data *sd, int skill_id, int skill_lv);
int (*chastle_mob_changetarget) (struct block_list *bl,va_list ap);
int (*can_produce_mix) ( struct map_session_data *sd, int nameid, int trigger, int qty);
int (*produce_mix) ( struct map_session_data *sd, uint16 skill_id, int nameid, int slot1, int slot2, int slot3, int qty );
int (*arrow_create) ( struct map_session_data *sd,int nameid);
void (*castend_type) (int type, struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
int (*castend_nodamage_id) (struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
int (*castend_damage_id) (struct block_list* src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int64 tick,int flag);
int (*castend_pos2) (struct block_list *src, int x, int y, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
int (*blockpc_start) (struct map_session_data *sd, uint16 skill_id, int tick);
int (*blockhomun_start) (struct homun_data *hd, uint16 skill_id, int tick);
int (*blockmerc_start) (struct mercenary_data *md, uint16 skill_id, int tick);
int (*attack) (int attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
int (*attack_area) (struct block_list *bl,va_list ap);
int (*area_sub) (struct block_list *bl, va_list ap);
int (*area_sub_count) (struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int64 tick, int flag);
int (*check_unit_range) (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
int (*check_unit_range_sub) (struct block_list *bl, va_list ap);
int (*check_unit_range2) (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
int (*check_unit_range2_sub) (struct block_list *bl, va_list ap);
void (*toggle_magicpower) (struct block_list *bl, uint16 skill_id, int skill_lv);
int (*magic_reflect) (struct block_list* src, struct block_list* bl, int type);
int (*onskillusage) (struct map_session_data *sd, struct block_list *bl, uint16 skill_id, int64 tick);
int (*cell_overlap) (struct block_list *bl, va_list ap);
int (*timerskill) (int tid, int64 tick, int id, intptr_t data);
void (*trap_do_splash) (struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick);
int (*trap_splash) (struct block_list *bl, va_list ap);
int (*check_condition_mercenary) (struct block_list *bl, int skill_id, int lv, int type);
struct skill_unit_group *(*locate_element_field) (struct block_list *bl);
int (*graffitiremover) (struct block_list *bl, va_list ap);
int (*activate_reverberation) ( struct block_list *bl, va_list ap);
int (*dance_overlap_sub) (struct block_list* bl, va_list ap);
int (*dance_overlap) (struct skill_unit* su, int flag);
struct s_skill_unit_layout *(*get_unit_layout) (uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y);
int (*frostjoke_scream) (struct block_list *bl, va_list ap);
int (*greed) (struct block_list *bl, va_list ap);
int (*destroy_trap) ( struct block_list *bl, va_list ap );
struct skill_unit_group_tickset *(*unitgrouptickset_search) (struct block_list *bl, struct skill_unit_group *group, int64 tick);
bool (*dance_switch) (struct skill_unit* su, int flag);
int (*check_condition_char_sub) (struct block_list *bl, va_list ap);
int (*check_condition_mob_master_sub) (struct block_list *bl, va_list ap);
void (*brandishspear_first) (struct square *tc, enum unit_dir dir, int16 x, int16 y);
void (*brandishspear_dir) (struct square* tc, enum unit_dir dir, int are);
int (*get_fixed_cast) (int skill_id, int skill_lv);
int (*sit_count) (struct block_list *bl, va_list ap);
int (*sit_in) (struct block_list *bl, va_list ap);
int (*sit_out) (struct block_list *bl, va_list ap);
void (*unitsetmapcell) (struct skill_unit *src, uint16 skill_id, uint16 skill_lv, cell_t cell, bool flag);
int (*unit_onplace_timer) (struct skill_unit *src, struct block_list *bl, int64 tick);
void (*unit_onplace_timer_unknown) (struct skill_unit *src, struct block_list *bl, int64 *tick);
int (*unit_effect) (struct block_list* bl, va_list ap);
int (*unit_timer_sub_onplace) (struct block_list* bl, va_list ap);
int (*unit_move_sub) (struct block_list* bl, va_list ap);
int (*blockpc_end) (int tid, int64 tick, int id, intptr_t data);
int (*blockhomun_end) (int tid, int64 tick, int id, intptr_t data);
int (*blockmerc_end) (int tid, int64 tick, int id, intptr_t data);
int (*split_atoi) (char *str, int *val);
int (*unit_timer) (int tid, int64 tick, int id, intptr_t data);
int (*unit_timer_sub) (union DBKey key, struct DBData *data, va_list ap);
void (*init_unit_layout) (void);
void (*init_unit_layout_unknown) (int skill_idx, int pos);
void (*validate_id) (struct config_setting_t *conf, struct s_skill_db *sk, int conf_index);
bool (*name_contains_invalid_character) (const char *name);
void (*validate_name) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_max_level) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_description) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_range) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_hittype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_skilltype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_skillinfo) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_attacktype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_element) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_damagetype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_splash_range) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_number_of_hits) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_interrupt_cast) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_cast_def_rate) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_number_of_instances) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_knock_back_tiles) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_cast_time) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_act_delay) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_walk_delay) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_skill_data1) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_skill_data2) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_cooldown) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_fixed_cast_time) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_castnodex) (struct config_setting_t *conf, struct s_skill_db *sk, bool delay);
void (*validate_hp_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_sp_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_hp_rate_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_sp_rate_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_max_hp_trigger) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_max_sp_trigger) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_zeny_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_weapontype_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_weapontype) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_ammotype_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_ammotype) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_ammo_amount) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_state_sub) (const char *state);
void (*validate_state) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_spirit_sphere_cost) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_item_requirements_sub_item_amount) (struct config_setting_t *conf, struct s_skill_db *sk, int item_index);
void (*validate_item_requirements_sub_items) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_item_requirements_sub_any_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_item_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_equip_requirements_sub_item_amount) (struct config_setting_t *conf, struct s_skill_db *sk, int item_index);
void (*validate_equip_requirements_sub_items) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_equip_requirements_sub_any_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_equip_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_requirements_item_name) (const char *name);
void (*validate_requirements) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_unit_id_sub) (int unit_id);
void (*validate_unit_id) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_unit_layout) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_unit_range) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_unit_interval) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_unit_flag_sub) (const char *type, bool on, struct s_skill_db *sk);
void (*validate_unit_flag) (struct config_setting_t *conf, struct s_skill_db *sk);
int (*validate_unit_target_sub) (const char *target);
void (*validate_unit_target) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_unit) (struct config_setting_t *conf, struct s_skill_db *sk);
void (*validate_additional_fields) (struct config_setting_t *conf, struct s_skill_db *sk);
bool (*read_skilldb) (const char *filename);
void (*config_set_level) (struct config_setting_t *conf, int *arr);
void (*level_set_value) (int *arr, int value);
bool (*parse_row_producedb) (char* split[], int columns, int current);
bool (*parse_row_createarrowdb) (char* split[], int columns, int current);
bool (*parse_row_abradb) (char* split[], int columns, int current);
bool (*parse_row_spellbookdb) (char* split[], int columns, int current);
bool (*parse_row_magicmushroomdb) (char* split[], int column, int current);
bool (*parse_row_improvisedb) (char* split[], int columns, int current);
bool (*parse_row_changematerialdb) (char* split[], int columns, int current);
/* save new unit skill */
void (*usave_add) (struct map_session_data * sd, uint16 skill_id, uint16 skill_lv);
/* trigger saved unit skills */
void (*usave_trigger) (struct map_session_data *sd);
/* load all stored skill cool downs */
void (*cooldown_load) (struct map_session_data * sd);
/* run spellbook of nameid id */
int (*spellbook) (struct map_session_data *sd, int nameid);
/* */
int (*block_check) (struct block_list *bl, enum sc_type type, uint16 skill_id);
int (*detonator) (struct block_list *bl, va_list ap);
bool (*check_camouflage) (struct block_list *bl, struct status_change_entry *sce);
int (*magicdecoy) (struct map_session_data *sd, int nameid);
int (*poisoningweapon) ( struct map_session_data *sd, int nameid);
int (*select_menu) (struct map_session_data *sd,uint16 skill_id);
int (*elementalanalysis) (struct map_session_data *sd, uint16 skill_lv, const struct itemlist *item_list);
int (*changematerial) (struct map_session_data *sd, const struct itemlist *item_list);
int (*get_elemental_type) (uint16 skill_id, uint16 skill_lv);
void (*cooldown_save) (struct map_session_data * sd);
int (*get_new_group_id) (void);
bool (*check_shadowform) (struct block_list *bl, int64 damage, int hit);
bool (*castend_damage_id_unknown) (struct block_list* src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, struct status_data *tstatus, struct status_change *sc);
void (*additional_effect_unknown) (struct block_list* src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int *attack_type, int *dmg_lv, int64 *tick);
void (*counter_additional_effect_unknown) (struct block_list* src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int *attack_type, int64 *tick);
void (*attack_combo1_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, struct status_change_entry *sce, int *combo);
void (*attack_combo2_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *combo);
void (*attack_display_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage);
int (*attack_copy_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
int (*attack_dir_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
void (*attack_blow_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage, enum unit_dir *dir);
void (*attack_post_unknown) (int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*timerskill_dead_unknown) (struct block_list *src, struct unit_data *ud, struct skill_timerskill *skl);
void (*timerskill_target_unknown) (int tid, int64 tick, struct block_list *src, struct block_list *target, struct unit_data *ud, struct skill_timerskill *skl);
void (*timerskill_notarget_unknown) (int tid, int64 tick, struct block_list *src, struct unit_data *ud, struct skill_timerskill *skl);
bool (*cleartimerskill_exception) (int skill_id);
bool (*castend_id_unknown) (struct unit_data *ud, struct block_list *src, struct block_list *target);
bool (*castend_nodamage_id_dead_unknown) (struct block_list *src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*castend_nodamage_id_undead_unknown) (struct block_list *src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*castend_nodamage_id_mado_unknown) (struct block_list *src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*castend_nodamage_id_unknown) (struct block_list *src, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
void (*castend_pos2_effect_unknown) (struct block_list* src, int *x, int *y, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
bool (*castend_pos2_unknown) (struct block_list* src, int *x, int *y, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag);
void (*unitsetting1_unknown) (struct block_list *src, uint16 *skill_id, uint16 *skill_lv, int16 *x, int16 *y, int *flag, int *val1, int *val2, int *val3);
void (*unitsetting2_unknown) (struct block_list *src, uint16 *skill_id, uint16 *skill_lv, int16 *x, int16 *y, int *flag, int *unit_flag, int *val1, int *val2, int *val3, struct skill_unit_group *group);
void (*unit_onplace_unknown) (struct skill_unit *src, struct block_list *bl, int64 *tick);
int (*check_condition_castbegin_off_unknown) (struct status_change *sc, uint16 *skill_id);
int (*check_condition_castbegin_mount_unknown) (struct status_change *sc, uint16 *skill_id);
int (*check_condition_castbegin_madogear_unknown) (struct status_change *sc, uint16 *skill_id);
int (*check_condition_castbegin_unknown) (struct status_change *sc, uint16 *skill_id);
bool (*check_condition_castend_unknown) (struct map_session_data* sd, uint16 *skill_id, uint16 *skill_lv);
bool (*get_requirement_off_unknown) (struct status_change *sc, uint16 *skill_id);
bool (*get_requirement_item_unknown) (struct status_change *sc, struct map_session_data* sd, uint16 *skill_id, uint16 *skill_lv, uint16 *idx, int *i);
void (*get_requirement_unknown) (struct status_change *sc, struct map_session_data* sd, uint16 *skill_id, uint16 *skill_lv, struct skill_condition *req);
int (*splash_target) (struct block_list* bl);
int (*check_npc_chaospanic) (struct block_list *bl, va_list args);
int (*count_wos) (struct block_list *bl, va_list ap);
int (*get_linked_song_dance_id) (int skill_id);
};
#ifdef HERCULES_CORE
void skill_defaults(void);
#endif // HERCULES_CORE
HPShared struct skill_interface *skill;
#endif /* MAP_SKILL_H */