/** * 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 . */ #ifndef MAP_STATUS_H #define MAP_STATUS_H #include "common/hercules.h" #include "common/mmo.h" // NEW_CARTS struct block_list; struct config_setting_t; struct elemental_data; struct homun_data; struct mercenary_data; struct mob_data; struct npc_data; struct pet_data; //Change the equation when the values are high enough to discard the //imprecision in exchange of overflow protection [Skotlex] //Also add 100% checks since those are the most used cases where we don't //want approximation errors. #define APPLY_RATE(value, rate) ( \ (rate) == 100 ? \ (value) \ : ( \ (value) > 100000 ? \ (rate) * ( (value) / 100 ) \ : \ (value) * (rate) / 100 \ ) \ ) /** * SC configuration type * @see db/sc_config.conf for more information **/ typedef enum sc_conf_type { SC_NO_REM_DEATH = 0x001, SC_NO_SAVE = 0x002, SC_NO_DISPELL = 0x004, SC_NO_CLEARANCE = 0x008, SC_BUFF = 0x010, SC_DEBUFF = 0x020, SC_MADO_NO_RESET = 0x040, SC_NO_CLEAR = 0x080, SC_VISIBLE = 0x100, SC_NO_BOSS = 0x200 } sc_conf_type; /** * Flags to be used with status->change_start */ enum scstart_flag { // Note: When updating this enum, also update the documentation in doc/script_commands.txt and the constants in db/const.txt SCFLAG_NONE = 0x00, ///< No special behavior. SCFLAG_NOAVOID = 0x01, ///< Cannot be avoided (it has to start). SCFLAG_FIXEDTICK = 0x02, ///< Tick should not be reduced (by vit, luk, lv, etc). SCFLAG_LOADED = 0x04, ///< sc_data was loaded, no value has to be altered. SCFLAG_FIXEDRATE = 0x08, ///< rate should not be reduced (not evaluated in status_change_start, but in some calls to other functions). SCFLAG_NOICON = 0x10, ///< Status icon (SI) should not be sent. SCFLAG_ALL = SCFLAG_NONE|SCFLAG_NOAVOID|SCFLAG_FIXEDTICK|SCFLAG_LOADED|SCFLAG_FIXEDRATE|SCFLAG_NOICON }; /** * Flags to be used with status->heal() and related functions. */ enum status_heal_flag { STATUS_HEAL_DEFAULT = 0x00, ///< Default STATUS_HEAL_FORCED = 0x01, ///< Forced healing (bypassing Berserk and similar) STATUS_HEAL_SHOWEFFECT = 0x02, ///< Show the HP/SP heal effect STATUS_HEAL_ALLOWREVIVE = 0x04, ///< Force resurrection in case of dead targets. }; // Status changes listing. These code are for use by the server. typedef enum sc_type { SC_NONE = -1, //First we enumerate common status ailments which are often used around. SC_STONE = 0, SC_COMMON_MIN = 0, // begin SC_FREEZE, SC_STUN, SC_SLEEP, SC_POISON, SC_CURSE, SC_SILENCE, SC_CONFUSION, SC_BLIND, SC_BLOODING, SC_DPOISON, //10 SC_FEAR, SC_COLD, SC_BURNING, SC_DEEP_SLEEP, SC_COMMON_MAX = 14, // end //Next up, we continue on 20, to leave enough room for additional "common" ailments in the future. SC_PROVOKE = 20, SC_ENDURE, SC_TWOHANDQUICKEN, SC_CONCENTRATION, SC_HIDING, SC_CLOAKING, SC_ENCHANTPOISON, SC_POISONREACT, SC_QUAGMIRE, SC_ANGELUS, SC_BLESSING, //30 SC_CRUCIS, SC_INC_AGI, SC_DEC_AGI, SC_SLOWPOISON, SC_IMPOSITIO , SC_SUFFRAGIUM, SC_ASPERSIO, SC_BENEDICTIO, SC_KYRIE, SC_MAGNIFICAT, //40 SC_GLORIA, SC_LEXAETERNA, SC_ADRENALINE, SC_WEAPONPERFECT, SC_OVERTHRUST, SC_MAXIMIZEPOWER, SC_TRICKDEAD, SC_SHOUT, SC_ENERGYCOAT, SC_BROKENARMOR, //50 - NOTE: These two aren't used anywhere, and they have an icon... SC_BROKENWEAPON, SC_ILLUSION, SC_WEIGHTOVER50, SC_WEIGHTOVER90, SC_ATTHASTE_POTION1, SC_ATTHASTE_POTION2, SC_ATTHASTE_POTION3, SC_ATTHASTE_INFINITY, SC_MOVHASTE_HORSE, SC_MOVHASTE_INFINITY, //60 SC_PLUSATTACKPOWER, SC_PLUSMAGICPOWER, SC_WEDDING, SC_SLOWDOWN, SC_ANKLESNARE, SC_KEEPING, SC_BARRIER, SC_NOEQUIPWEAPON, SC_NOEQUIPSHIELD, SC_NOEQUIPARMOR, //70 SC_NOEQUIPHELM, SC_PROTECTWEAPON, SC_PROTECTSHIELD, SC_PROTECTARMOR, SC_PROTECTHELM, SC_AUTOGUARD, SC_REFLECTSHIELD, SC_SPLASHER, SC_PROVIDENCE, SC_DEFENDER, //80 SC_MAGICROD, SC_SPELLBREAKER, SC_AUTOSPELL, SC_SIGHTTRASHER, SC_AUTOBERSERK, SC_SPEARQUICKEN, SC_AUTOCOUNTER, SC_SIGHT, SC_SAFETYWALL, SC_RUWACH, //90 SC_EXTREMITYFIST, SC_EXPLOSIONSPIRITS, SC_COMBOATTACK, SC_BLADESTOP_WAIT, SC_BLADESTOP, SC_PROPERTYFIRE, SC_PROPERTYWATER, SC_PROPERTYWIND, SC_PROPERTYGROUND, SC_VOLCANO, //100, SC_DELUGE, SC_VIOLENTGALE, SC_SUB_WEAPONPROPERTY, SC_ARMOR, SC_ARMORPROPERTY, SC_NOCHAT, SC_BABY, SC_AURABLADE, SC_PARRYING, SC_LKCONCENTRATION, //110 SC_TENSIONRELAX, SC_BERSERK, SC_FURY, SC_GOSPEL, SC_ASSUMPTIO, SC_BASILICA, SC_GUILDAURA, SC_MAGICPOWER, SC_EDP, SC_TRUESIGHT, //120 SC_WINDWALK, SC_MELTDOWN, SC_CARTBOOST, SC_CHASEWALK, SC_SWORDREJECT, SC_MARIONETTE_MASTER, SC_MARIONETTE, SC_PROPERTYUNDEAD, SC_JOINTBEAT, SC_MINDBREAKER, //130 SC_MEMORIZE, SC_FOGWALL, SC_SPIDERWEB, SC_DEVOTION, SC_SACRIFICE, SC_STEELBODY, SC_ORCISH, SC_STORMKICK_READY, SC_DOWNKICK_READY, SC_TURNKICK_READY, //140 SC_COUNTERKICK_READY, SC_DODGE_READY, SC_RUN, SC_PROPERTYDARK, SC_ADRENALINE2, SC_PROPERTYTELEKINESIS, SC_KAIZEL, SC_KAAHI, SC_KAUPE, SC_ONEHANDQUICKEN, //150 SC_PRESERVE, SC_GDSKILL_BATTLEORDER, SC_GDSKILL_REGENERATION, SC_DOUBLECASTING, SC_GRAVITATION, SC_OVERTHRUSTMAX, SC_LONGING, SC_HERMODE, SC_TAROTCARD, SC_CR_SHRINK, //160 SC_WZ_SIGHTBLASTER, SC_DC_WINKCHARM, SC_RG_CCONFINE_M, SC_RG_CCONFINE_S, SC_DANCING, SC_ARMOR_PROPERTY, SC_RICHMANKIM, SC_ETERNALCHAOS, SC_DRUMBATTLE, SC_NIBELUNGEN, //170 SC_ROKISWEIL, SC_INTOABYSS, SC_SIEGFRIED, SC_WHISTLE, SC_ASSNCROS, SC_POEMBRAGI, SC_APPLEIDUN, SC_MODECHANGE, SC_HUMMING, SC_DONTFORGETME, //180 SC_FORTUNE, SC_SERVICEFORYOU, SC_STOP, //Prevents inflicted chars from walking. [Skotlex] SC_STRUP, SC_SOULLINK, SC_COMA, //Not a real SC_, it makes a char's HP/SP hit 1. SC_CLAIRVOYANCE, SC_INCALLSTATUS, SC_CHASEWALK2, SC_INCAGI, //190 SC_INCVIT, SC_INCINT, SC_INCDEX, SC_INCLUK, SC_INCHIT, SC_INCHITRATE, SC_INCFLEE, SC_INCFLEERATE, SC_INCMHPRATE, SC_INCMSPRATE, //200 SC_INCATKRATE, SC_INCMATKRATE, SC_INCDEFRATE, SC_FOOD_STR, SC_FOOD_AGI, SC_FOOD_VIT, SC_FOOD_INT, SC_FOOD_DEX, SC_FOOD_LUK, SC_FOOD_BASICHIT, //210 SC_FOOD_BASICAVOIDANCE, SC_BATKFOOD, SC_WATKFOOD, SC_MATKFOOD, SC_SCRESIST, //Increases resistance to status changes. SC_XMAS, // Xmas Suit [Valaris] SC_WARM, //SG skills [Komurka] SC_SUN_COMFORT, SC_MOON_COMFORT, SC_STAR_COMFORT, //220 SC_FUSION, SC_SKILLRATE_UP, SC_SKE, SC_KAITE, SC_SWOO, // [marquis007] SC_SKA, // [marquis007] SC_EARTHSCROLL, SC_MIRACLE, //SG 'hidden' skill [Komurka] SC_GS_MADNESSCANCEL, SC_GS_ADJUSTMENT, //230 SC_GS_ACCURACY, SC_GS_GATLINGFEVER, SC_NJ_TATAMIGAESHI, SC_NJ_UTSUSEMI, SC_NJ_BUNSINJYUTSU, SC_NJ_KAENSIN, SC_NJ_SUITON, SC_NJ_NEN, SC_KNOWLEDGE, SC_SMA_READY, //240 SC_FLING, SC_HLIF_AVOID, SC_HLIF_CHANGE, SC_HAMI_BLOODLUST, SC_HLIF_FLEET, SC_HLIF_SPEED, SC_HAMI_DEFENCE, SC_INCASPDRATE, SC_PLUSAVOIDVALUE, SC_JAILED, //250 SC_ENCHANTARMS, SC_MAGICALATTACK, SC_STONESKIN, SC_CRITICALWOUND, SC_MAGICMIRROR, SC_SLOWCAST, SC_SUMMER, SC_CASH_PLUSEXP, SC_CASH_RECEIVEITEM, SC_CASH_BOSS_ALARM, //260 SC_CASH_DEATHPENALTY, SC_CRITICALPERCENT, //SC_INCDEF, //SC_INCBASEATK = 264, //SC_FASTCAST, SC_PROTECT_MDEF = 266, //SC_HPREGEN, SC_HEALPLUS = 268, SC_PNEUMA, SC_AUTOTRADE, //270 SC_KSPROTECTED, SC_ARMOR_RESIST, SC_ATKER_BLOOD, SC_TARGET_BLOOD, SC_TK_SEVENWIND, SC_PROTECT_DEF, //SC_SPREGEN, SC_WALKSPEED = 278, // Mercenary Only Bonus Effects SC_MER_FLEE, SC_MER_ATK, //280 SC_MER_HP, SC_MER_SP, SC_MER_HIT, SC_MER_QUICKEN, SC_REBIRTH, //SC_SKILLCASTRATE, //286 //SC_DEFRATIOATK, //SC_HPDRAIN, //SC_SKILLATKBONUS, //SC_ITEMSCRIPT, SC_S_LIFEPOTION = 291, SC_L_LIFEPOTION, SC_CASH_PLUSONLYJOBEXP, //SC_IGNOREDEF, SC_HELLPOWER = 295, SC_INVINCIBLE, SC_INVINCIBLEOFF, SC_MANU_ATK, SC_MANU_DEF, SC_SPL_ATK, //300 SC_SPL_DEF, SC_MANU_MATK, SC_SPL_MATK, SC_FOOD_STR_CASH, SC_FOOD_AGI_CASH, SC_FOOD_VIT_CASH, SC_FOOD_DEX_CASH, SC_FOOD_INT_CASH, SC_FOOD_LUK_CASH, /** * 3rd **/ //SC_FEAR, SC_FROSTMISTY = 311, /** * Rune Knight **/ SC_ENCHANTBLADE, SC_DEATHBOUND, SC_MILLENNIUMSHIELD, SC_CRUSHSTRIKE, SC_REFRESH, SC_REUSE_REFRESH, SC_GIANTGROWTH, SC_STONEHARDSKIN, SC_VITALITYACTIVATION, // 320 SC_STORMBLAST, SC_FIGHTINGSPIRIT, SC_ABUNDANCE, /** * Arch Bishop **/ SC_ADORAMUS, SC_EPICLESIS, SC_ORATIO, SC_LAUDAAGNUS, SC_LAUDARAMUS, SC_RENOVATIO, SC_EXPIATIO, // 330 SC_DUPLELIGHT, SC_SECRAMENT, /** * Warlock **/ SC_WHITEIMPRISON, SC_MARSHOFABYSS, SC_RECOGNIZEDSPELL, SC_STASIS, SC_SUMMON1, SC_SUMMON2, SC_SUMMON3, SC_SUMMON4, // 340 SC_SUMMON5, SC_READING_SB, SC_FREEZINGSP, /** * Ranger **/ SC_FEARBREEZE, SC_ELECTRICSHOCKER, SC_WUGDASH, SC_WUGBITE, SC_CAMOUFLAGE, /** * Mechanic **/ SC_ACCELERATION, SC_HOVERING, // 350 SC_SHAPESHIFT, SC_INFRAREDSCAN, SC_ANALYZE, SC_MAGNETICFIELD, SC_NEUTRALBARRIER, SC_NEUTRALBARRIER_MASTER, SC_STEALTHFIELD, SC_STEALTHFIELD_MASTER, SC_OVERHEAT, SC_OVERHEAT_LIMITPOINT, // 360 /** * Guillotine Cross **/ SC_VENOMIMPRESS, SC_POISONINGWEAPON, SC_WEAPONBLOCKING, SC_CLOAKINGEXCEED, SC_HALLUCINATIONWALK, SC_HALLUCINATIONWALK_POSTDELAY, SC_ROLLINGCUTTER, SC_TOXIN, SC_PARALYSE, SC_VENOMBLEED, // 370 SC_MAGICMUSHROOM, SC_DEATHHURT, SC_PYREXIA, SC_OBLIVIONCURSE, SC_LEECHESEND, /** * Royal Guard **/ SC_LG_REFLECTDAMAGE, SC_FORCEOFVANGUARD, SC_SHIELDSPELL_DEF, SC_SHIELDSPELL_MDEF, SC_SHIELDSPELL_REF, // 380 SC_EXEEDBREAK, SC_PRESTIGE, SC_BANDING, SC_BANDING_DEFENCE, SC_EARTHDRIVE, SC_INSPIRATION, /** * Sorcerer **/ SC_SPELLFIST, //SC_COLD, SC_STRIKING = 389, SC_WARMER, // 390 SC_VACUUM_EXTREME, SC_PROPERTYWALK, /** * Minstrel / Wanderer **/ SC_SWING, SC_SYMPHONY_LOVE, SC_MOONLIT_SERENADE, SC_RUSH_WINDMILL, SC_ECHOSONG, SC_HARMONIZE, SC_SIREN, //SC_DEEP_SLEEP, // 400 SC_SIRCLEOFNATURE = 401, SC_GLOOMYDAY, //SC_GLOOMYDAY_SK, SC_SONG_OF_MANA = 404, SC_DANCE_WITH_WUG, SC_SATURDAY_NIGHT_FEVER, SC_LERADS_DEW, SC_MELODYOFSINK, SC_BEYOND_OF_WARCRY, SC_UNLIMITED_HUMMING_VOICE, // 410 SC_SITDOWN_FORCE, SC_NETHERWORLD, /** * Sura **/ SC_CRESCENTELBOW = 413, SC_CURSEDCIRCLE_ATKER, SC_CURSEDCIRCLE_TARGET, SC_LIGHTNINGWALK, SC_RAISINGDRAGON, SC_GENTLETOUCH_ENERGYGAIN, SC_GENTLETOUCH_CHANGE, SC_GENTLETOUCH_REVITALIZE, // 420 /** * Genetic **/ SC_GN_CARTBOOST, SC_THORNS_TRAP, SC_BLOOD_SUCKER, SC_FIRE_EXPANSION_SMOKE_POWDER, SC_FIRE_EXPANSION_TEAR_GAS, SC_MANDRAGORA, SC_STOMACHACHE, SC_MYSTERIOUS_POWDER, SC_MELON_BOMB, SC_BANANA_BOMB, // 430 SC_BANANA_BOMB_SITDOWN_POSTDELAY, SC_SAVAGE_STEAK, SC_COCKTAIL_WARG_BLOOD, SC_MINOR_BBQ, SC_SIROMA_ICE_TEA, SC_DROCERA_HERB_STEAMED, SC_PUTTI_TAILS_NOODLES, SC_BOOST500, SC_FULL_SWING_K, SC_MANA_PLUS, // 440 SC_MUSTLE_M, SC_LIFE_FORCE_F, SC_EXTRACT_WHITE_POTION_Z, SC_VITATA_500, SC_EXTRACT_SALAMINE_JUICE, /** * Shadow Chaser **/ SC__REPRODUCE, SC__AUTOSHADOWSPELL, SC__SHADOWFORM, SC__BODYPAINT, SC__INVISIBILITY, // 450 SC__DEADLYINFECT, SC__ENERVATION, SC__GROOMY, SC__IGNORANCE, SC__LAZINESS, SC__UNLUCKY, SC__WEAKNESS, SC__STRIPACCESSARY, SC__MANHOLE, SC__BLOODYLUST, // 460 /** * Elemental Spirits **/ SC_CIRCLE_OF_FIRE, SC_CIRCLE_OF_FIRE_OPTION, SC_FIRE_CLOAK, SC_FIRE_CLOAK_OPTION, SC_WATER_SCREEN, SC_WATER_SCREEN_OPTION, SC_WATER_DROP, SC_WATER_DROP_OPTION, SC_WATER_BARRIER, SC_WIND_STEP, // 470 SC_WIND_STEP_OPTION, SC_WIND_CURTAIN, SC_WIND_CURTAIN_OPTION, SC_ZEPHYR, SC_SOLID_SKIN, SC_SOLID_SKIN_OPTION, SC_STONE_SHIELD, SC_STONE_SHIELD_OPTION, SC_POWER_OF_GAIA, SC_PYROTECHNIC, // 480 SC_PYROTECHNIC_OPTION, SC_HEATER, SC_HEATER_OPTION, SC_TROPIC, SC_TROPIC_OPTION, SC_AQUAPLAY, SC_AQUAPLAY_OPTION, SC_COOLER, SC_COOLER_OPTION, SC_CHILLY_AIR, // 490 SC_CHILLY_AIR_OPTION, SC_GUST, SC_GUST_OPTION, SC_BLAST, SC_BLAST_OPTION, SC_WILD_STORM, SC_WILD_STORM_OPTION, SC_PETROLOGY, SC_PETROLOGY_OPTION, SC_CURSED_SOIL, // 500 SC_CURSED_SOIL_OPTION, SC_UPHEAVAL, SC_UPHEAVAL_OPTION, SC_TIDAL_WEAPON, SC_TIDAL_WEAPON_OPTION, SC_ROCK_CRUSHER, SC_ROCK_CRUSHER_ATK, /* Guild Aura */ SC_LEADERSHIP, SC_GLORYWOUNDS, SC_SOULCOLD, // 510 SC_HAWKEYES, /* ... */ SC_ODINS_POWER, /* Sorcerer .extra */ SC_FIRE_INSIGNIA, SC_WATER_INSIGNIA, SC_WIND_INSIGNIA, SC_EARTH_INSIGNIA, /* new pushcart */ SC_PUSH_CART, /* Warlock Spell books */ SC_SPELLBOOK1, SC_SPELLBOOK2, SC_SPELLBOOK3, // 520 SC_SPELLBOOK4, SC_SPELLBOOK5, SC_SPELLBOOK6, /** * In official server there are only 7 maximum number of spell books that can be memorized * To increase the maximum value just add another status type before SC_SPELLBOOK7 (ex. SC_SPELLBOOK8, SC_SPELLBOOK9 and so on) **/ SC_SPELLBOOK7, /* Max HP & SP */ SC_INCMHP, SC_INCMSP, SC_PARTYFLEE, /** * Kagerou & Oboro [malufett] **/ SC_MEIKYOUSISUI, SC_KO_JYUMONJIKIRI, SC_KYOUGAKU, // 530 SC_IZAYOI, SC_ZENKAI, SC_KG_KAGEHUMI, SC_KYOMU, SC_KAGEMUSYA, SC_ZANGETSU, SC_GENSOU, SC_AKAITSUKI, //homon S SC_STYLE_CHANGE, SC_GOLDENE_FERSE, // 540 SC_ANGRIFFS_MODUS, SC_ERASER_CUTTER, SC_OVERED_BOOST, SC_LIGHT_OF_REGENE, SC_VOLCANIC_ASH, SC_GRANITIC_ARMOR, SC_MAGMA_FLOW, SC_PYROCLASTIC, SC_NEEDLE_OF_PARALYZE, SC_PAIN_KILLER, // 550 #ifdef RENEWAL SC_EXTREMITYFIST2, SC_RAID, #endif SC_DARKCROW = 553, SC_FULL_THROTTLE, SC_REBOUND, SC_UNLIMIT, SC_KINGS_GRACE, SC_TELEKINESIS_INTENSE, SC_OFFERTORIUM, SC_FRIGG_SONG, // 560 SC_ALL_RIDING, SC_HANBOK, SC_MONSTER_TRANSFORM, SC_ANGEL_PROTECT, SC_ILLUSIONDOPING, SC_MTF_ASPD, SC_MTF_RANGEATK, SC_MTF_MATK, SC_MTF_MLEATKED, SC_MTF_CRIDAMAGE, // 570 SC_MOONSTAR, SC_SUPER_STAR, SC_OKTOBERFEST, SC_STRANGELIGHTS, SC_DECORATION_OF_MUSIC, SC__MAELSTROM, SC__CHAOS, SC__FEINTBOMB_MASTER, SC_FALLENEMPIRE, SC_FLASHCOMBO, // 580 //Vellum Weapon reductions SC_DEFSET, SC_MDEFSET, SC_NO_SWITCH_EQUIP, // 2014 Halloween Event SC_MTF_MHP, SC_MTF_MSP, SC_MTF_PUMPKIN, SC_MTF_HITFLEE, SC_LJOSALFAR, SC_MERMAID_LONGING, SC_ACARAJE, // 590 SC_TARGET_ASPD, // Geffen Scrolls SC_SKELSCROLL, SC_DISTRUCTIONSCROLL, SC_ROYALSCROLL, SC_IMMUNITYSCROLL, SC_MYSTICSCROLL, SC_BATTLESCROLL, SC_ARMORSCROLL, SC_FREYJASCROLL, SC_SOULSCROLL, // 600 // Eden Crystal Synthesis SC_QUEST_BUFF1, SC_QUEST_BUFF2, SC_QUEST_BUFF3, // Geffen Magic Tournament SC_GEFFEN_MAGIC1, SC_GEFFEN_MAGIC2, SC_GEFFEN_MAGIC3, SC_FENRIR_CARD, SC_ATKER_ASPD, SC_ATKER_MOVESPEED, SC_FOOD_CRITICALSUCCESSVALUE, // 610 SC_CUP_OF_BOZA, SC_OVERLAPEXPUP, SC_MORA_BUFF, // MVP Scrolls SC_MVPCARD_TAOGUNKA, SC_MVPCARD_MISTRESS, SC_MVPCARD_ORCHERO, SC_MVPCARD_ORCLORD, SC_HAT_EFFECT, SC_FLOWERSMOKE, SC_FSTONE, // 620 SC_HAPPINESS_STAR, SC_MAPLE_FALLS, SC_TIME_ACCESSORY, SC_MAGICAL_FEATHER, SC_BLOSSOM_FLUTTERING, SC_GM_BATTLE, SC_GM_BATTLE2, SC_2011RWC, SC_STR_SCROLL, SC_INT_SCROLL, // 630 SC_STEAMPACK, SC_MOVHASTE_POTION, SC_MOVESLOW_POTION, SC_BUCHEDENOEL, SC_PHI_DEMON, SC_PROMOTE_HEALTH_RESERCH, SC_ENERGY_DRINK_RESERCH, SC_MAGIC_CANDY, SC_M_LIFEPOTION, SC_G_LIFEPOTION, // 640 SC_MYSTICPOWDER, // Summoner SC_SUHIDE, SC_SU_STOOP, SC_SPRITEMABLE, SC_CATNIPPOWDER, SC_SV_ROOTTWIST, SC_BITESCAR, SC_ARCLOUSEDASH, SC_TUNAPARTY, SC_SHRIMP, // 650 SC_FRESHSHRIMP, SC_DRESS_UP, // Rodex SC_DAILYSENDMAILCNT, // Clan System SC_CLAN_INFO, SC_SIT, SC_MOON, SC_TING, SC_DEVIL1, SC_RIDING, SC_FALCON, SC_WUGRIDER, SC_POSTDELAY, SC_ON_PUSH_CART, SC_RESIST_PROPERTY_WATER, SC_RESIST_PROPERTY_GROUND, SC_RESIST_PROPERTY_FIRE, SC_RESIST_PROPERTY_WIND, SC_CLIENT_ONLY_EQUIP_ARROW, SC_MADOGEAR, #ifndef SC_MAX SC_MAX, //Automatically updated max, used in for's to check we are within bounds. #endif } sc_type; /// Official status change ids, used to display status icons in the client. enum si_type { SI_BLANK = -1, }; // JOINTBEAT stackable ailments enum e_joint_break { BREAK_ANKLE = 0x01, // MoveSpeed reduced by 50% BREAK_WRIST = 0x02, // ASPD reduced by 25% BREAK_KNEE = 0x04, // MoveSpeed reduced by 30%, ASPD reduced by 10% BREAK_SHOULDER = 0x08, // DEF reduced by 50% BREAK_WAIST = 0x10, // DEF reduced by 25%, ATK reduced by 25% BREAK_NECK = 0x20, // current attack does 2x damage, inflicts 'bleeding' for 30 seconds BREAK_FLAGS = BREAK_ANKLE | BREAK_WRIST | BREAK_KNEE | BREAK_SHOULDER | BREAK_WAIST | BREAK_NECK, }; /** * Mob mode definitions. [Skotlex] * * @see doc/mob_db_mode_list.md for a description of each mode. */ enum e_mode { MD_NONE = 0x00000000, MD_CANMOVE = 0x00000001, MD_LOOTER = 0x00000002, MD_AGGRESSIVE = 0x00000004, MD_ASSIST = 0x00000008, MD_CASTSENSOR_IDLE = 0x00000010, MD_BOSS = 0x00000020, MD_PLANT = 0x00000040, MD_CANATTACK = 0x00000080, MD_DETECTOR = 0x00000100, MD_CASTSENSOR_CHASE = 0x00000200, MD_CHANGECHASE = 0x00000400, MD_ANGRY = 0x00000800, MD_CHANGETARGET_MELEE = 0x00001000, MD_CHANGETARGET_CHASE = 0x00002000, MD_TARGETWEAK = 0x00004000, MD_NOKNOCKBACK = 0x00008000, //MD_RANDOMTARGET = 0x00010000, // Not implemented // Note: This should be kept within INT_MAX, since it's often cast to int. MD_MASK = 0x7FFFFFFF, }; //Status change option definitions (options are what makes status changes visible to chars //who were not on your field of sight when it happened) //opt1: Non stackable status changes. enum e_opt1 { OPT1_STONE = 1, //Petrified OPT1_FREEZE, OPT1_STUN, OPT1_SLEEP, //Aegis uses OPT1 = 5 to identify undead enemies (which also grants them immunity to the other opt1 changes) OPT1_STONEWAIT=6, //Petrifying OPT1_BURNING, OPT1_IMPRISON, OPT1_CRYSTALIZE, }; //opt2: Stackable status changes. enum e_opt2 { OPT2_POISON = 0x0001, OPT2_CURSE = 0x0002, OPT2_SILENCE = 0x0004, OPT2_SIGNUMCRUCIS = 0x0008, OPT2_BLIND = 0x0010, OPT2_ANGELUS = 0x0020, OPT2_BLEEDING = 0x0040, OPT2_DPOISON = 0x0080, OPT2_FEAR = 0x0100, }; //opt3: (SHOW_EFST_*) enum e_opt3 { OPT3_NORMAL = 0x00000000, OPT3_QUICKEN = 0x00000001, OPT3_OVERTHRUST = 0x00000002, OPT3_ENERGYCOAT = 0x00000004, OPT3_EXPLOSIONSPIRITS = 0x00000008, OPT3_STEELBODY = 0x00000010, OPT3_BLADESTOP = 0x00000020, OPT3_AURABLADE = 0x00000040, OPT3_BERSERK = 0x00000080, OPT3_LIGHTBLADE = 0x00000100, OPT3_MOONLIT = 0x00000200, OPT3_MARIONETTE = 0x00000400, OPT3_ASSUMPTIO = 0x00000800, OPT3_WARM = 0x00001000, OPT3_KAITE = 0x00002000, OPT3_BUNSIN = 0x00004000, OPT3_SOULLINK = 0x00008000, OPT3_UNDEAD = 0x00010000, OPT3_CONTRACT = 0x00020000, }; //Defines for the manner system [Skotlex] enum manner_flags { MANNER_NOCHAT = 0x01, MANNER_NOSKILL = 0x02, MANNER_NOCOMMAND = 0x04, MANNER_NOITEM = 0x08, MANNER_NOROOM = 0x10, }; //Define flags for the status_calc_bl function. [Skotlex] enum scb_flag { SCB_NONE = 0x00000000, SCB_BASE = 0x00000001, SCB_MAXHP = 0x00000002, SCB_MAXSP = 0x00000004, SCB_STR = 0x00000008, SCB_AGI = 0x00000010, SCB_VIT = 0x00000020, SCB_INT = 0x00000040, SCB_DEX = 0x00000080, SCB_LUK = 0x00000100, SCB_BATK = 0x00000200, SCB_WATK = 0x00000400, SCB_MATK = 0x00000800, SCB_HIT = 0x00001000, SCB_FLEE = 0x00002000, SCB_DEF = 0x00004000, SCB_DEF2 = 0x00008000, SCB_MDEF = 0x00010000, SCB_MDEF2 = 0x00020000, SCB_SPEED = 0x00040000, SCB_ASPD = 0x00080000, SCB_DSPD = 0x00100000, SCB_CRI = 0x00200000, SCB_FLEE2 = 0x00400000, SCB_ATK_ELE = 0x00800000, SCB_DEF_ELE = 0x01000000, SCB_MODE = 0x02000000, SCB_SIZE = 0x04000000, SCB_RACE = 0x08000000, SCB_RANGE = 0x10000000, SCB_REGEN = 0x20000000, SCB_DYE = 0x40000000, // force cloth-dye change to 0 to avoid client crashes. #if 0 // Currently No SC use it. Also, when this will be implemented, there will be need to change to 64bit variable SCB_BODY = 0x80000000, // Force bodysStyle change to 0 #endif SCB_BATTLE = 0x3FFFFFFE, SCB_ALL = 0x3FFFFFFF }; //Regen related flags. enum e_regen { RGN_HP = 0x01, RGN_SP = 0x02, RGN_SHP = 0x04, RGN_SSP = 0x08, }; enum e_status_calc_opt { SCO_NONE = 0x0, SCO_FIRST = 0x1, /* trigger the calculations that should take place only onspawn/once */ SCO_FORCE = 0x2, /* only relevant to BL_PC types, ensures call bypasses the queue caused by delayed damage */ }; //Define to determine who gets HP/SP consumed on doing skills/etc. [Skotlex] #define BL_CONSUME (BL_PC|BL_HOM|BL_MER|BL_ELEM) //Define to determine who has regen #define BL_REGEN (BL_PC|BL_HOM|BL_MER|BL_ELEM) //Define to determine who will receive a clif_status_change packet for effects that require one to display correctly #define BL_SCEFFECT (BL_PC|BL_HOM|BL_MER|BL_MOB|BL_ELEM) //Basic damage info of a weapon //Required because players have two of these, one in status_data //and another for their left hand weapon. typedef struct weapon_atk { unsigned int atk, atk2; unsigned short range; unsigned char ele; #ifdef RENEWAL unsigned int matk; unsigned char wlv; #endif } weapon_atk; //For holding basic status (which can be modified by status changes) struct status_data { uint32 hp, sp, // see status_cpy before adding members before hp and sp max_hp, max_sp; uint16 str, agi, vit, int_, dex, luk; uint32 batk, matk_min, matk_max, speed, amotion, adelay, dmotion, mode; int32 hit, flee, cri, flee2, def2, mdef2, #ifdef RENEWAL_ASPD aspd_rate2, #endif aspd_rate; /** * defType is RENEWAL dependent and defined in src/map/config/data/const.h **/ defType def,mdef; unsigned char def_ele, ele_lv, size, race; struct weapon_atk rhw, lhw; //Right Hand/Left Hand Weapon. #ifdef RENEWAL int equip_atk; #endif }; //Additional regen data that only players have. struct regen_data_sub { unsigned short hp,sp; //tick accumulation before healing. struct { unsigned int hp,sp; } tick; //Regen rates (where every 1 means +100% regen) struct { unsigned char hp,sp; } rate; }; struct regen_data { unsigned short flag; //Marks what stuff you may heal or not. unsigned short hp,sp,shp,ssp; //tick accumulation before healing. struct { unsigned int hp,sp,shp,ssp; } tick; //Regen rates (where every 1 means +100% regen) struct { unsigned char hp,sp,shp,ssp; } rate; struct { unsigned walk:1; //Can you regen even when walking? unsigned gc:1; //Tags when you should have double regen due to GVG castle unsigned overweight :2; //overweight state (1: 50%, 2: 90%) unsigned block :2; //Block regen flag (1: Hp, 2: Sp) } state; //skill-regen, sitting-skill-regen (since not all chars with regen need it) struct regen_data_sub *sregen, *ssregen; }; struct sc_display_entry { enum sc_type type; int val1,val2,val3; }; struct status_change_entry { int timer; int total_tick; int val1,val2,val3,val4; bool infinite_duration; }; struct status_change { unsigned int option;// effect state (bitfield) unsigned int opt3;// skill state (bitfield) unsigned short opt1;// body state unsigned short opt2;// health state (bitfield) unsigned char count; //TODO: See if it is possible to implement the following SC's without requiring extra parameters while the SC is inactive. unsigned char jb_flag; //Joint Beat type flag //int sg_id; //ID of the previous Storm gust that hit you short comet_x, comet_y; // Point where src casted Comet - required to calculate damage from this point /** * The Storm Gust counter was dropped in renewal **/ #ifndef RENEWAL unsigned char sg_counter; //Storm gust counter (previous hits from storm gust) #endif unsigned char bs_counter; // Blood Sucker counter unsigned char fv_counter; // Force of vanguard counter struct status_change_entry *data[SC_MAX]; }; //Define for standard HP damage attacks. #define status_fix_damage(src, target, hp, walkdelay) (status->damage((src), (target), (hp), 0, (walkdelay), 0)) //Define for standard HP/SP damage triggers. #define status_zap(bl, hp, sp) (status->damage(NULL, (bl), (hp), (sp), 0, 1)) //Easier handling of status->percent_change #define status_percent_heal(bl, hp_rate, sp_rate) (status->percent_change(NULL, (bl), -(hp_rate), -(sp_rate), 0)) #define status_percent_damage(src, target, hp_rate, sp_rate, kill) (status->percent_change((src), (target), (hp_rate), (sp_rate), (kill)?1:2)) //Instant kill with no drops/exp/etc #define status_kill(bl) status_percent_damage(NULL, (bl), 100, 0, true) #define status_get_range(bl) (status->get_status_data(bl)->rhw.range) #define status_get_hp(bl) (status->get_status_data(bl)->hp) #define status_get_max_hp(bl) (status->get_status_data(bl)->max_hp) #define status_get_sp(bl) (status->get_status_data(bl)->sp) #define status_get_max_sp(bl) (status->get_status_data(bl)->max_sp) #define status_get_str(bl) (status->get_status_data(bl)->str) #define status_get_agi(bl) (status->get_status_data(bl)->agi) #define status_get_vit(bl) (status->get_status_data(bl)->vit) #define status_get_int(bl) (status->get_status_data(bl)->int_) #define status_get_dex(bl) (status->get_status_data(bl)->dex) #define status_get_luk(bl) (status->get_status_data(bl)->luk) #define status_get_hit(bl) (status->get_status_data(bl)->hit) #define status_get_flee(bl) (status->get_status_data(bl)->flee) #define status_get_mdef(bl) (status->get_status_data(bl)->mdef) #define status_get_flee2(bl) (status->get_status_data(bl)->flee2) #define status_get_def2(bl) (status->get_status_data(bl)->def2) #define status_get_mdef2(bl) (status->get_status_data(bl)->mdef2) #define status_get_critical(bl) (status->get_status_data(bl)->cri) #define status_get_batk(bl) (status->get_status_data(bl)->batk) #define status_get_watk(bl) (status->get_status_data(bl)->rhw.atk) #define status_get_watk2(bl) (status->get_status_data(bl)->rhw.atk2) #define status_get_matk_max(bl) (status->get_status_data(bl)->matk_max) #define status_get_matk_min(bl) (status->get_status_data(bl)->matk_min) #define status_get_lwatk(bl) (status->get_status_data(bl)->lhw.atk) #define status_get_lwatk2(bl) (status->get_status_data(bl)->lhw.atk2) #define status_get_adelay(bl) (status->get_status_data(bl)->adelay) #define status_get_amotion(bl) (status->get_status_data(bl)->amotion) #define status_get_dmotion(bl) (status->get_status_data(bl)->dmotion) #define status_get_element(bl) (status->get_status_data(bl)->def_ele) #define status_get_element_level(bl) (status->get_status_data(bl)->ele_lv) #define status_get_attack_sc_element(bl, sc) (status->calc_attack_element((bl), (sc), 0)) #define status_get_attack_element(bl) (status->get_status_data(bl)->rhw.ele) #define status_get_attack_lelement(bl) (status->get_status_data(bl)->lhw.ele) #define status_get_race(bl) (status->get_status_data(bl)->race) #define status_get_size(bl) (status->get_status_data(bl)->size) #define status_get_mode(bl) (status->get_status_data(bl)->mode) //Short version, receives rate in 1->100 range, and does not uses a flag setting. #define sc_start(src, bl, type, rate, val1, tick) (status->change_start((src),(bl),(type),100*(rate),(val1),0,0,0,(tick),SCFLAG_NONE)) #define sc_start2(src, bl, type, rate, val1, val2, tick) (status->change_start((src),(bl),(type),100*(rate),(val1),(val2),0,0,(tick),SCFLAG_NONE)) #define sc_start4(src, bl, type, rate, val1, val2, val3, val4, tick) (status->change_start((src),(bl),(type),100*(rate),(val1),(val2),(val3),(val4),(tick),SCFLAG_NONE)) #define status_change_end(bl,type,tid) (status->change_end_((bl),(type),(tid),__FILE__,__LINE__)) #define status_calc_bl(bl, flag) (status->calc_bl_((bl), (enum scb_flag)(flag), SCO_NONE)) #define status_calc_mob(md, opt) (status->calc_bl_(&(md)->bl, SCB_ALL, (opt))) #define status_calc_pet(pd, opt) (status->calc_bl_(&(pd)->bl, SCB_ALL, (opt))) #define status_calc_pc(sd, opt) (status->calc_bl_(&(sd)->bl, SCB_ALL, (opt))) #define status_calc_homunculus(hd, opt) (status->calc_bl_(&(hd)->bl, SCB_ALL, (opt))) #define status_calc_mercenary(md, opt) (status->calc_bl_(&(md)->bl, SCB_ALL, (opt))) #define status_calc_elemental(ed, opt) (status->calc_bl_(&(ed)->bl, SCB_ALL, (opt))) #define status_calc_npc(nd, opt) (status->calc_bl_(&(nd)->bl, SCB_ALL, (opt))) struct s_status_dbs { BEGIN_ZEROED_BLOCK; /* Everything within this block will be memset to 0 when status_defaults() is executed */ int max_weight_base[CLASS_COUNT]; int HP_table[CLASS_COUNT][MAX_LEVEL + 1]; int SP_table[CLASS_COUNT][MAX_LEVEL + 1]; int aspd_base[CLASS_COUNT][MAX_SINGLE_WEAPON_TYPE+1]; // +1 for RENEWAL_ASPD sc_type Skill2SCTable[MAX_SKILL_DB]; // skill -> status struct { int id; int relevant_bl_types; } IconChangeTable[SC_MAX]; unsigned int ChangeFlagTable[SC_MAX]; // status -> flags int SkillChangeTable[SC_MAX]; // status -> skill bool DisplayType[SC_MAX]; /* */ int atkmods[3][MAX_SINGLE_WEAPON_TYPE];//ATK weapon modification for size (size_fix.txt) char job_bonus[CLASS_COUNT][MAX_LEVEL]; sc_conf_type sc_conf[SC_MAX]; END_ZEROED_BLOCK; /* End */ }; /*===================================== * Interface : status.h * Generated by HerculesInterfaceMaker * created by Susu *-------------------------------------*/ struct status_interface { /* vars */ int current_equip_item_index; int current_equip_card_id; int current_equip_option_index; struct s_status_dbs *dbs; struct eri *data_ers; //For sc_data entries struct status_data dummy; int64 natural_heal_prev_tick; unsigned int natural_heal_diff_tick; /* */ int (*init) (bool minimal); void (*final) (void); /* funcs */ // for looking up associated data sc_type (*skill2sc) (int skill_id); int (*sc2skill) (sc_type sc); unsigned int (*sc2scb_flag) (sc_type sc); int (*get_sc_relevant_bl_types) (sc_type type); int (*get_sc_type) (sc_type idx); int (*get_sc_icon) (sc_type type); int (*damage) (struct block_list *src,struct block_list *target,int64 hp,int64 sp, int walkdelay, int flag); //Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills) int (*charge) (struct block_list* bl, int64 hp, int64 sp); int (*percent_change) (struct block_list *src,struct block_list *target,signed char hp_rate, signed char sp_rate, int flag); //Used to set the hp/sp of an object to an absolute value (can't kill) int (*set_hp) (struct block_list *bl, unsigned int hp, enum status_heal_flag flag); int (*set_sp) (struct block_list *bl, unsigned int sp, enum status_heal_flag flag); int (*heal) (struct block_list *bl,int64 hp,int64 sp, enum status_heal_flag flag); int (*revive) (struct block_list *bl, unsigned char per_hp, unsigned char per_sp); int (*fixed_revive) (struct block_list *bl, unsigned int per_hp, unsigned int per_sp); struct regen_data * (*get_regen_data) (struct block_list *bl); struct status_data * (*get_status_data) (struct block_list *bl); struct status_data * (*get_base_status) (struct block_list *bl); const char *(*get_name) (const struct block_list *bl); int (*get_class) (const struct block_list *bl); int (*get_lv) (const struct block_list *bl); defType (*get_def) (struct block_list *bl); unsigned short (*get_speed) (struct block_list *bl); unsigned char (*calc_attack_element) (struct block_list *bl, struct status_change *sc, int element); int (*get_party_id) (const struct block_list *bl); int (*get_guild_id) (const struct block_list *bl); int (*get_emblem_id) (const struct block_list *bl); int (*get_mexp) (const struct block_list *bl); int (*get_race2) (const struct block_list *bl); struct view_data * (*get_viewdata) (struct block_list *bl); void (*set_viewdata) (struct block_list *bl, int class_); void (*change_init) (struct block_list *bl); struct status_change * (*get_sc) (struct block_list *bl); int (*isdead) (struct block_list *bl); int (*isimmune) (struct block_list *bl); int (*get_sc_def) (struct block_list *src, struct block_list *bl, enum sc_type type, int rate, int tick, int flag); int (*change_start) (struct block_list *src, struct block_list *bl, enum sc_type type, int rate, int val1, int val2, int val3, int val4, int tick, int flag); int (*change_start_sub) (struct block_list *src, struct block_list *bl, enum sc_type type, int rate, int val1, int val2, int val3, int val4, int tick, int total_tick, int flag); int (*change_end_) (struct block_list* bl, enum sc_type type, int tid, const char* file, int line); bool (*is_immune_to_status) (struct status_change* sc, enum sc_type type); bool (*is_boss_resist_sc) (enum sc_type type); bool (*end_sc_before_start) (struct block_list *bl, struct status_data *st, struct status_change* sc, enum sc_type type, int undead_flag, int val1, int val2, int val3, int val4); void (*change_start_stop_action) (struct block_list *bl, enum sc_type type); int (*change_start_set_option) (struct block_list *bl, struct status_change* sc, enum sc_type type, int val1, int val2, int val3, int val4); int (*get_val_flag) (enum sc_type type); void (*change_start_display) (struct map_session_data *sd, enum sc_type type, int val1, int val2, int val3, int val4); bool (*change_start_unknown_sc) (struct block_list *src, struct block_list *bl, enum sc_type type, int calc_flag, int rate, int val1, int val2, int val3, int val4, int total_tick, int flag); int (*kaahi_heal_timer) (int tid, int64 tick, int id, intptr_t data); int (*change_timer) (int tid, int64 tick, int id, intptr_t data); int (*change_timer_sub) (struct block_list* bl, va_list ap); int (*change_clear) (struct block_list* bl, int type); int (*change_clear_buffs) (struct block_list* bl, int type); void (*calc_bl_) (struct block_list *bl, enum scb_flag flag, enum e_status_calc_opt opt); int (*calc_mob_) (struct mob_data* md, enum e_status_calc_opt opt); int (*calc_pet_) (struct pet_data* pd, enum e_status_calc_opt opt); int (*calc_pc_) (struct map_session_data* sd, enum e_status_calc_opt opt); void (*calc_pc_additional) (struct map_session_data* sd, enum e_status_calc_opt opt); void (*calc_pc_recover_hp) (struct map_session_data* sd, struct status_data *bstatus); int (*calc_homunculus_) (struct homun_data *hd, enum e_status_calc_opt opt); int (*calc_mercenary_) (struct mercenary_data *md, enum e_status_calc_opt opt); int (*calc_elemental_) (struct elemental_data *ed, enum e_status_calc_opt opt); void (*calc_misc) (struct block_list *bl, struct status_data *st, int level); void (*calc_regen) (struct block_list *bl, struct status_data *st, struct regen_data *regen); void (*calc_regen_rate) (struct block_list *bl, struct regen_data *regen, struct status_change *sc); int (*check_skilluse) (struct block_list *src, struct block_list *target, uint16 skill_id, int flag); // [Skotlex] int (*check_visibility) (struct block_list *src, struct block_list *target); //[Skotlex] int (*change_spread) (struct block_list *src, struct block_list *bl); defType (*calc_def) (struct block_list *bl, struct status_change *sc, int def, bool viewable); short (*calc_def2) (struct block_list *bl, struct status_change *sc, int def2, bool viewable); defType (*calc_mdef) (struct block_list *bl, struct status_change *sc, int mdef, bool viewable); short (*calc_mdef2) (struct block_list *bl, struct status_change *sc, int mdef2, bool viewable); int (*calc_batk)(struct block_list *bl, struct status_change *sc, int batk, bool viewable); int (*base_matk) (struct block_list *bl, const struct status_data *st, int level); int (*get_weapon_atk) (struct block_list *src, struct weapon_atk *watk, int flag); int (*get_total_mdef) (struct block_list *src); int (*get_total_def) (struct block_list *src); int (*get_matk) (struct block_list *src, int flag); void (*update_matk) ( struct block_list *bl ); int (*readdb) (void); void (*initChangeTables) (void); void (*initDummyData) (void); int (*base_amotion_pc) (struct map_session_data *sd, struct status_data *st); int (*base_atk) (const struct block_list *bl, const struct status_data *st); unsigned int (*get_base_maxhp) (const struct map_session_data *sd, const struct status_data *st); unsigned int (*get_base_maxsp) (const struct map_session_data *sd, const struct status_data *st); unsigned int (*get_restart_hp) (const struct map_session_data *sd, const struct status_data *st); unsigned int (*get_restart_sp) (const struct map_session_data *sd, const struct status_data *st); int (*calc_npc_) (struct npc_data *nd, enum e_status_calc_opt opt); unsigned short (*calc_str) (struct block_list *bl, struct status_change *sc, int str); unsigned short (*calc_agi) (struct block_list *bl, struct status_change *sc, int agi); unsigned short (*calc_vit) (struct block_list *bl, struct status_change *sc, int vit); unsigned short (*calc_int) (struct block_list *bl, struct status_change *sc, int int_); unsigned short (*calc_dex) (struct block_list *bl, struct status_change *sc, int dex); unsigned short (*calc_luk) (struct block_list *bl, struct status_change *sc, int luk); int (*calc_watk) (struct block_list *bl, struct status_change *sc, int watk, bool viewable); int (*calc_matk) (struct block_list *bl, struct status_change *sc, int matk, bool viewable); signed int (*calc_hit) (struct block_list *bl, struct status_change *sc, int hit, bool viewable); signed int (*calc_critical) (struct block_list *bl, struct status_change *sc, int critical, bool viewable); signed int (*calc_flee) (struct block_list *bl, struct status_change *sc, int flee, bool viewable); signed int (*calc_flee2) (struct block_list *bl, struct status_change *sc, int flee2, bool viewable); unsigned short (*calc_speed) (struct block_list *bl, struct status_change *sc, int speed); short (*calc_aspd_rate) (struct block_list *bl, struct status_change *sc, int aspd_rate); unsigned short (*calc_dmotion) (struct block_list *bl, struct status_change *sc, int dmotion); short (*calc_aspd) (struct block_list *bl, struct status_change *sc, short flag); short (*calc_fix_aspd) (struct block_list *bl, struct status_change *sc, int aspd); unsigned int (*calc_maxhp) (struct block_list *bl, struct status_change *sc, uint64 maxhp); unsigned int (*calc_maxsp) (struct block_list *bl, struct status_change *sc, unsigned int maxsp); unsigned char (*calc_element) (struct block_list *bl, struct status_change *sc, int element); unsigned char (*calc_element_lv) (struct block_list *bl, struct status_change *sc, int lv); uint32 (*calc_mode) (const struct block_list *bl, const struct status_change *sc, uint32 mode); int (*calc_ematk) (struct block_list *bl, struct status_change *sc, int matk); void (*calc_bl_main) (struct block_list *bl, int flag); void (*display_add) (struct map_session_data *sd, enum sc_type type, int dval1, int dval2, int dval3); void (*display_remove) (struct map_session_data *sd, enum sc_type type); int (*natural_heal) (struct block_list *bl, va_list args); int (*natural_heal_timer) (int tid, int64 tick, int id, intptr_t data); bool (*readdb_job2) (char *fields[], int columns, int current); bool (*readdb_sizefix) (char *fields[], int columns, int current); bool (*read_scdb_libconfig) (void); bool (*read_scdb_libconfig_sub) (struct config_setting_t *it, int idx, const char *source); bool (*read_scdb_libconfig_sub_flag) (struct config_setting_t *it, int type, const char *source); bool (*read_scdb_libconfig_sub_flag_additional) (struct config_setting_t *it, int type, const char *source); void (*read_job_db) (void); void (*read_job_db_sub) (int idx, const char *name, struct config_setting_t *jdb); void (*set_sc) (uint16 skill_id, sc_type sc, unsigned int flag); void (*copy) (struct status_data *a, const struct status_data *b); int (*base_matk_min) (const struct status_data *st); int (*base_matk_max) (const struct status_data *st); }; #ifdef HERCULES_CORE void status_defaults(void); #endif // HERCULES_CORE HPShared struct status_interface *status; #endif /* MAP_STATUS_H */