diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2013-02-04 00:49:50 -0800 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2013-02-07 12:54:23 -0800 |
commit | c67c2b7435a13d7ce17b2075e22dc5c6036f702a (patch) | |
tree | b84b7b205a361b39d65944a9edb2a353356a9ac9 /src/map/skill.cpp | |
parent | b3a0b3e7c94bce46bc0654528df0748cf0c2a6ac (diff) | |
download | tmwa-c67c2b7435a13d7ce17b2075e22dc5c6036f702a.tar.gz tmwa-c67c2b7435a13d7ce17b2075e22dc5c6036f702a.tar.bz2 tmwa-c67c2b7435a13d7ce17b2075e22dc5c6036f702a.tar.xz tmwa-c67c2b7435a13d7ce17b2075e22dc5c6036f702a.zip |
Remove some more Skill-related stuff
Diffstat (limited to 'src/map/skill.cpp')
-rw-r--r-- | src/map/skill.cpp | 3430 |
1 files changed, 78 insertions, 3352 deletions
diff --git a/src/map/skill.cpp b/src/map/skill.cpp index aac7e1f..a93f375 100644 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -18,478 +18,6 @@ #include "../poison.hpp" -#define SKILLUNITTIMER_INVERVAL 100 - -// This table is wrong. -// The only used skill with a status effect is NPC_SELFDESTRUCT, -// and due to the misnumber, it wasn't active anyway. -static __attribute__((deprecated)) -earray<StatusChange, SkillID, MAX_SKILL_DB> SkillStatusChangeTable //= -{{ - // 0- - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // NV_BASIC - StatusChange::NEGATIVE1, // SM_SWORD - StatusChange::NEGATIVE1, // SM_TWOHAND - StatusChange::NEGATIVE1, // SM_RECOVERY - StatusChange::NEGATIVE1, // SM_BASH - StatusChange::NEGATIVE1, // SM_PROVOKE - StatusChange::NEGATIVE1, // SM_MAGNUM - StatusChange::NEGATIVE1, // SM_ENDURE - StatusChange::NEGATIVE1, // MG_SRECOVERY - // 10- - StatusChange::NEGATIVE1, // MG_SIGHT - StatusChange::NEGATIVE1, // MG_NAPALMBEAT - StatusChange::NEGATIVE1, // MG_SAFETYWALL - StatusChange::NEGATIVE1, // MG_SOULSTRIKE - StatusChange::NEGATIVE1, // MG_COLDBOLT - StatusChange::NEGATIVE1, // MG_FROSTDIVER - StatusChange::NEGATIVE1, // MG_STONECURSE - StatusChange::NEGATIVE1, // MG_FIREBALL - StatusChange::NEGATIVE1, // MG_FIREWALL - StatusChange::NEGATIVE1, // MG_FIREBOLT - // 20- - StatusChange::NEGATIVE1, // MG_LIGHTNINGBOLT - StatusChange::NEGATIVE1, // MG_THUNDERSTORM - StatusChange::NEGATIVE1, // AL_DP - StatusChange::NEGATIVE1, // AL_DEMONBANE - StatusChange::NEGATIVE1, // AL_RUWACH - StatusChange::NEGATIVE1, // AL_PNEUMA - StatusChange::NEGATIVE1, // AL_TELEPORT - StatusChange::NEGATIVE1, // AL_WARP - StatusChange::NEGATIVE1, // AL_HEAL - StatusChange::NEGATIVE1, // AL_INCAGI - // 30- - StatusChange::NEGATIVE1, // AL_DECAGI - StatusChange::NEGATIVE1, // AL_HOLYWATER - StatusChange::NEGATIVE1, // AL_CRUCIS - StatusChange::NEGATIVE1, // AL_ANGELUS - StatusChange::NEGATIVE1, // AL_BLESSING - StatusChange::NEGATIVE1, // AL_CURE - StatusChange::NEGATIVE1, // MC_INCCARRY - StatusChange::NEGATIVE1, // MC_DISCOUNT - StatusChange::NEGATIVE1, // MC_OVERCHARGE - StatusChange::NEGATIVE1, // MC_PUSHCART - // 40- - StatusChange::NEGATIVE1, // MC_IDENTIFY - StatusChange::NEGATIVE1, // MC_VENDING - StatusChange::NEGATIVE1, // MC_MAMMONITE - StatusChange::NEGATIVE1, // AC_OWL - StatusChange::NEGATIVE1, // AC_VULTURE - StatusChange::NEGATIVE1, // AC_CONCENTRATION - StatusChange::NEGATIVE1, // AC_DOUBLE - StatusChange::NEGATIVE1, // AC_SHOWER - StatusChange::NEGATIVE1, // TF_DOUBLE - StatusChange::NEGATIVE1, // TF_MISS - // 50- - StatusChange::NEGATIVE1, // TF_STEAL - StatusChange::NEGATIVE1, // TF_HIDING - StatusChange::NEGATIVE1, // TF_POISON - StatusChange::NEGATIVE1, // TF_DETOXIFY - StatusChange::NEGATIVE1, // ALL_RESURRECTION - StatusChange::NEGATIVE1, // KN_SPEARMASTERY - StatusChange::NEGATIVE1, // KN_PIERCE - StatusChange::NEGATIVE1, // KN_BRANDISHSPEAR - StatusChange::NEGATIVE1, // KN_SPEARSTAB - StatusChange::NEGATIVE1, // KN_SPEARBOOMERANG - // 60- - StatusChange::NEGATIVE1, // KN_TWOHANDQUICKEN - StatusChange::NEGATIVE1, // KN_AUTOCOUNTER - StatusChange::NEGATIVE1, // KN_BOWLINGBASH - StatusChange::NEGATIVE1, // KN_RIDING - StatusChange::NEGATIVE1, // KN_CAVALIERMASTERY - StatusChange::NEGATIVE1, // PR_MACEMASTERY - StatusChange::NEGATIVE1, // PR_IMPOSITIO - StatusChange::NEGATIVE1, // PR_SUFFRAGIUM - StatusChange::NEGATIVE1, // PR_ASPERSIO - StatusChange::NEGATIVE1, // PR_BENEDICTIO - // 70- - StatusChange::NEGATIVE1, // PR_SANCTUARY - StatusChange::NEGATIVE1, // PR_SLOWPOISON - StatusChange::NEGATIVE1, // PR_STRECOVERY - StatusChange::NEGATIVE1, // PR_KYRIE - StatusChange::NEGATIVE1, // PR_MAGNIFICAT - StatusChange::NEGATIVE1, // PR_GLORIA - StatusChange::NEGATIVE1, // PR_LEXDIVINA - StatusChange::NEGATIVE1, // PR_TURNUNDEAD - StatusChange::NEGATIVE1, // PR_LEXAETERNA - StatusChange::NEGATIVE1, // PR_MAGNUS - // 80- - StatusChange::NEGATIVE1, // WZ_FIREPILLAR - StatusChange::NEGATIVE1, // WZ_SIGHTRASHER - StatusChange::NEGATIVE1, // WZ_FIREIVY - StatusChange::NEGATIVE1, // WZ_METEOR - StatusChange::NEGATIVE1, // WZ_JUPITEL - StatusChange::NEGATIVE1, // WZ_VERMILION - StatusChange::NEGATIVE1, // WZ_WATERBALL - StatusChange::NEGATIVE1, // WZ_ICEWALL - StatusChange::NEGATIVE1, // WZ_FROSTNOVA - StatusChange::NEGATIVE1, // WZ_STORMGUST - // 90- - StatusChange::NEGATIVE1, // WZ_EARTHSPIKE - StatusChange::NEGATIVE1, // WZ_HEAVENDRIVE - StatusChange::NEGATIVE1, // WZ_QUAGMIRE - StatusChange::NEGATIVE1, // WZ_ESTIMATION - StatusChange::NEGATIVE1, // BS_IRON - StatusChange::NEGATIVE1, // BS_STEEL - StatusChange::NEGATIVE1, // BS_ENCHANTEDSTONE - StatusChange::NEGATIVE1, // BS_ORIDEOCON - StatusChange::NEGATIVE1, // BS_DAGGER - StatusChange::NEGATIVE1, // BS_SWORD - // 100- - StatusChange::NEGATIVE1, // BS_TWOHANDSWORD - StatusChange::NEGATIVE1, // BS_AXE - StatusChange::NEGATIVE1, // BS_MACE - StatusChange::NEGATIVE1, // BS_KNUCKLE - StatusChange::NEGATIVE1, // BS_SPEAR - StatusChange::NEGATIVE1, // BS_HILTBINDING - StatusChange::NEGATIVE1, // BS_FINDINGORE - StatusChange::NEGATIVE1, // BS_WEAPONRESEARCH - StatusChange::NEGATIVE1, // BS_REPAIRWEAPON - StatusChange::NEGATIVE1, // BS_SKINTEMPER - // 110- - StatusChange::NEGATIVE1, // BS_HAMMERFALL - StatusChange::NEGATIVE1, // BS_ADRENALINE - StatusChange::NEGATIVE1, // BS_WEAPONPERFECT - StatusChange::NEGATIVE1, // BS_OVERTHRUST - StatusChange::NEGATIVE1, // BS_MAXIMIZE - StatusChange::NEGATIVE1, // HT_SKIDTRAP - StatusChange::NEGATIVE1, // HT_LANDMINE - StatusChange::NEGATIVE1, // HT_ANKLESNARE - StatusChange::NEGATIVE1, // HT_SHOCKWAVE - StatusChange::NEGATIVE1, // HT_SANDMAN - // 120- - StatusChange::NEGATIVE1, // HT_FLASHER - StatusChange::NEGATIVE1, // HT_FREEZINGTRAP - StatusChange::NEGATIVE1, // HT_BLASTMINE - StatusChange::NEGATIVE1, // HT_CLAYMORETRAP - StatusChange::NEGATIVE1, // HT_REMOVETRAP - StatusChange::NEGATIVE1, // HT_TALKIEBOX - StatusChange::NEGATIVE1, // HT_BEASTBANE - StatusChange::NEGATIVE1, // HT_FALCON - StatusChange::NEGATIVE1, // HT_STEELCROW - StatusChange::NEGATIVE1, // HT_BLITZBEAT - // 130- - StatusChange::NEGATIVE1, // HT_DETECTING - StatusChange::NEGATIVE1, // HT_SPRINGTRAP - StatusChange::NEGATIVE1, // AS_RIGHT - StatusChange::NEGATIVE1, // AS_LEFT - StatusChange::NEGATIVE1, // AS_KATAR - StatusChange::NEGATIVE1, // AS_CLOAKING - StatusChange::NEGATIVE1, // AS_SONICBLOW - StatusChange::NEGATIVE1, // AS_GRIMTOOTH - StatusChange::NEGATIVE1, // AS_ENCHANTPOISON - StatusChange::NEGATIVE1, // AS_POISONREACT - // 140- - StatusChange::NEGATIVE1, // AS_VENOMDUST - StatusChange::NEGATIVE1, // AS_SPLASHER - StatusChange::NEGATIVE1, // NV_FIRSTAID - StatusChange::NEGATIVE1, // NV_TRICKDEAD - StatusChange::NEGATIVE1, // SM_MOVINGRECOVERY - StatusChange::NEGATIVE1, // SM_FATALBLOW - StatusChange::NEGATIVE1, // SM_AUTOBERSERK - StatusChange::NEGATIVE1, // AC_MAKINGARROW - StatusChange::NEGATIVE1, // AC_CHARGEARROW - StatusChange::NEGATIVE1, // TF_SPRINKLESAND - // 150- - StatusChange::NEGATIVE1, // TF_BACKSLIDING - StatusChange::NEGATIVE1, // TF_PICKSTONE - StatusChange::NEGATIVE1, // TF_THROWSTONE - StatusChange::NEGATIVE1, // MC_CARTREVOLUTION - StatusChange::NEGATIVE1, // MC_CHANGECART - StatusChange::NEGATIVE1, // MC_LOUD - StatusChange::NEGATIVE1, // AL_HOLYLIGHT - StatusChange::NEGATIVE1, // MG_ENERGYCOAT - StatusChange::NEGATIVE1, // NPC_PIERCINGATT - StatusChange::NEGATIVE1, // NPC_MENTALBREAKER - // 160- - StatusChange::NEGATIVE1, // NPC_RANGEATTACK - StatusChange::NEGATIVE1, // NPC_ATTRICHANGE - StatusChange::NEGATIVE1, // NPC_CHANGEWATER - StatusChange::NEGATIVE1, // NPC_CHANGEGROUND - StatusChange::NEGATIVE1, // NPC_CHANGEFIRE - StatusChange::NEGATIVE1, // NPC_CHANGEWIND - StatusChange::NEGATIVE1, // NPC_CHANGEPOISON - StatusChange::NEGATIVE1, // NPC_CHANGEHOLY - StatusChange::NEGATIVE1, // NPC_CHANGEDARKNESS - StatusChange::NEGATIVE1, // NPC_CHANGETELEKINESIS - // 170- - StatusChange::NEGATIVE1, // NPC_CRITICALSLASH - StatusChange::NEGATIVE1, // NPC_COMBOATTACK - StatusChange::NEGATIVE1, // NPC_GUIDEDATTACK - SC_SELFDESTRUCTION, // NPC_SELFDESTRUCTION - StatusChange::NEGATIVE1, // NPC_SPLASHATTACK - StatusChange::NEGATIVE1, // NPC_SUICIDE - StatusChange::NEGATIVE1, // NPC_POISON - StatusChange::NEGATIVE1, // NPC_BLINDATTACK - StatusChange::NEGATIVE1, // NPC_SILENCEATTACK - StatusChange::NEGATIVE1, // NPC_STUNATTACK - // 180- - StatusChange::NEGATIVE1, // NPC_PETRIFYATTACK - StatusChange::NEGATIVE1, // NPC_CURSEATTACK - StatusChange::NEGATIVE1, // NPC_SLEEPATTACK - StatusChange::NEGATIVE1, // NPC_RANDOMATTACK - StatusChange::NEGATIVE1, // NPC_WATERATTACK - StatusChange::NEGATIVE1, // NPC_GROUNDATTACK - StatusChange::NEGATIVE1, // NPC_FIREATTACK - StatusChange::NEGATIVE1, // NPC_WINDATTACK - StatusChange::NEGATIVE1, // NPC_POISONATTACK - StatusChange::NEGATIVE1, // NPC_HOLYATTACK - // 190- - StatusChange::NEGATIVE1, // NPC_DARKNESSATTACK - StatusChange::NEGATIVE1, // NPC_TELEKINESISATTACK - StatusChange::NEGATIVE1, // NPC_MAGICALATTACK - StatusChange::NEGATIVE1, // NPC_METAMORPHOSIS - StatusChange::NEGATIVE1, // NPC_PROVOCATION - StatusChange::NEGATIVE1, // NPC_SMOKING - StatusChange::NEGATIVE1, // NPC_SUMMONSLAVE - StatusChange::NEGATIVE1, // NPC_EMOTION - StatusChange::NEGATIVE1, // NPC_TRANSFORMATION - StatusChange::NEGATIVE1, // NPC_BLOODDRAIN - // 200- - StatusChange::NEGATIVE1, // NPC_ENERGYDRAIN - StatusChange::NEGATIVE1, // NPC_KEEPING - StatusChange::NEGATIVE1, // NPC_DARKBREATH - StatusChange::NEGATIVE1, // NPC_DARKBLESSING - StatusChange::NEGATIVE1, // NPC_BARRIER - StatusChange::NEGATIVE1, // NPC_DEFENDER - StatusChange::NEGATIVE1, // NPC_LICK - StatusChange::NEGATIVE1, // NPC_HALLUCINATION - StatusChange::NEGATIVE1, // NPC_REBIRTH - StatusChange::NEGATIVE1, // NPC_SUMMONMONSTER - // 210- - StatusChange::NEGATIVE1, // RG_SNATCHER - StatusChange::NEGATIVE1, // RG_STEALCOIN - StatusChange::NEGATIVE1, // RG_BACKSTAP - StatusChange::NEGATIVE1, // RG_TUNNELDRIVE - StatusChange::NEGATIVE1, // RG_RAID - StatusChange::NEGATIVE1, // RG_STRIPWEAPON - StatusChange::NEGATIVE1, // RG_STRIPSHIELD - StatusChange::NEGATIVE1, // RG_STRIPARMOR - StatusChange::NEGATIVE1, // RG_STRIPHELM - StatusChange::NEGATIVE1, // RG_INTIMIDATE - // 220- - StatusChange::NEGATIVE1, // RG_GRAFFITI - StatusChange::NEGATIVE1, // RG_FLAGGRAFFITI - StatusChange::NEGATIVE1, // RG_CLEANER - StatusChange::NEGATIVE1, // RG_GANGSTER - StatusChange::NEGATIVE1, // RG_COMPULSION - StatusChange::NEGATIVE1, // RG_PLAGIARISM - StatusChange::NEGATIVE1, // AM_AXEMASTERY - StatusChange::NEGATIVE1, // AM_LEARNINGPOTION - StatusChange::NEGATIVE1, // AM_PHARMACY - StatusChange::NEGATIVE1, // AM_DEMONSTRATION - // 230- - StatusChange::NEGATIVE1, // AM_ACIDTERROR - StatusChange::NEGATIVE1, // AM_POTIONPITCHER - StatusChange::NEGATIVE1, // AM_CANNIBALIZE - StatusChange::NEGATIVE1, // AM_SPHEREMINE - StatusChange::NEGATIVE1, // AM_CP_WEAPON - StatusChange::NEGATIVE1, // AM_CP_SHIELD - StatusChange::NEGATIVE1, // AM_CP_ARMOR - StatusChange::NEGATIVE1, // AM_CP_HELM - StatusChange::NEGATIVE1, // AM_BIOETHICS - StatusChange::NEGATIVE1, // AM_BIOTECHNOLOGY - // 240- - StatusChange::NEGATIVE1, // AM_CREATECREATURE - StatusChange::NEGATIVE1, // AM_CULTIVATION - StatusChange::NEGATIVE1, // AM_FLAMECONTROL - StatusChange::NEGATIVE1, // AM_CALLHOMUN - StatusChange::NEGATIVE1, // AM_REST - StatusChange::NEGATIVE1, // AM_DRILLMASTER - StatusChange::NEGATIVE1, // AM_HEALHOMUN - StatusChange::NEGATIVE1, // AM_RESURRECTHOMUN - StatusChange::NEGATIVE1, // CR_TRUST - StatusChange::NEGATIVE1, // CR_AUTOGUARD - // 250- - StatusChange::NEGATIVE1, // CR_SHIELDCHARGE - StatusChange::NEGATIVE1, // CR_SHIELDBOOMERANG - StatusChange::NEGATIVE1, // CR_REFLECTSHIELD - StatusChange::NEGATIVE1, // CR_HOLYCROSS - StatusChange::NEGATIVE1, // CR_GRANDCROSS - StatusChange::NEGATIVE1, // CR_DEVOTION - StatusChange::NEGATIVE1, // CR_PROVIDENCE - StatusChange::NEGATIVE1, // CR_DEFENDER - StatusChange::NEGATIVE1, // CR_SPEARQUICKEN - StatusChange::NEGATIVE1, // MO_IRONHAND - // 260- - StatusChange::NEGATIVE1, // MO_SPIRITSRECOVERY - StatusChange::NEGATIVE1, // MO_CALLSPIRITS - StatusChange::NEGATIVE1, // MO_ABSORBSPIRITS - StatusChange::NEGATIVE1, // MO_TRIPLEATTACK - StatusChange::NEGATIVE1, // MO_BODYRELOCATION - StatusChange::NEGATIVE1, // MO_DODGE - StatusChange::NEGATIVE1, // MO_INVESTIGATE - StatusChange::NEGATIVE1, // MO_FINGEROFFENSIVE - StatusChange::NEGATIVE1, // MO_STEELBODY - StatusChange::NEGATIVE1, // MO_BLADESTOP - // 270- - StatusChange::NEGATIVE1, // MO_EXPLOSIONSPIRITS - StatusChange::NEGATIVE1, // MO_EXTREMITYFIST - StatusChange::NEGATIVE1, // MO_CHAINCOMBO - StatusChange::NEGATIVE1, // MO_COMBOFINISH - StatusChange::NEGATIVE1, // SA_ADVANCEDBOOK - StatusChange::NEGATIVE1, // SA_CASTCANCEL - StatusChange::NEGATIVE1, // SA_MAGICROD - StatusChange::NEGATIVE1, // SA_SPELLBREAKER - StatusChange::NEGATIVE1, // SA_FREECAST - StatusChange::NEGATIVE1, // SA_AUTOSPELL - // 280- - StatusChange::NEGATIVE1, // SA_FLAMELAUNCHER - StatusChange::NEGATIVE1, // SA_FROSTWEAPON - StatusChange::NEGATIVE1, // SA_LIGHTNINGLOADER - StatusChange::NEGATIVE1, // SA_SEISMICWEAPON - StatusChange::NEGATIVE1, // SA_DRAGONOLOGY - StatusChange::NEGATIVE1, // SA_VOLCANO - StatusChange::NEGATIVE1, // SA_DELUGE - StatusChange::NEGATIVE1, // SA_VIOLENTGALE - StatusChange::NEGATIVE1, // SA_LANDPROTECTOR - StatusChange::NEGATIVE1, // SA_DISPELL - // 290- - StatusChange::NEGATIVE1, // SA_ABRACADABRA - StatusChange::NEGATIVE1, // SA_MONOCELL - StatusChange::NEGATIVE1, // SA_CLASSCHANGE - StatusChange::NEGATIVE1, // SA_SUMMONMONSTER - StatusChange::NEGATIVE1, // SA_REVERSEORCISH - StatusChange::NEGATIVE1, // SA_DEATH - StatusChange::NEGATIVE1, // SA_FORTUNE - StatusChange::NEGATIVE1, // SA_TAMINGMONSTER - StatusChange::NEGATIVE1, // SA_QUESTION - StatusChange::NEGATIVE1, // SA_GRAVITY - // 300- - StatusChange::NEGATIVE1, // SA_LEVELUP - StatusChange::NEGATIVE1, // SA_INSTANTDEATH - StatusChange::NEGATIVE1, // SA_FULLRECOVERY - StatusChange::NEGATIVE1, // SA_COMA - StatusChange::NEGATIVE1, // BD_ADAPTATION - StatusChange::NEGATIVE1, // BD_ENCORE - StatusChange::NEGATIVE1, // BD_LULLABY - StatusChange::NEGATIVE1, // BD_RICHMANKIM - StatusChange::NEGATIVE1, // BD_ETERNALCHAOS - StatusChange::NEGATIVE1, // BD_DRUMBATTLEFIELD - // 310- - StatusChange::NEGATIVE1, // BD_RINGNIBELUNGEN - StatusChange::NEGATIVE1, // BD_ROKISWEIL - StatusChange::NEGATIVE1, // BD_INTOABYSS - StatusChange::NEGATIVE1, // BD_SIEGFRIED - StatusChange::NEGATIVE1, // BD_RAGNAROK - StatusChange::NEGATIVE1, // BA_MUSICALLESSON - StatusChange::NEGATIVE1, // BA_MUSICALSTRIKE - StatusChange::NEGATIVE1, // BA_DISSONANCE - StatusChange::NEGATIVE1, // BA_FROSTJOKE - StatusChange::NEGATIVE1, // BA_WHISTLE - // 320- - StatusChange::NEGATIVE1, // BA_ASSASSINCROSS - StatusChange::NEGATIVE1, // BA_POEMBRAGI - StatusChange::NEGATIVE1, // BA_APPLEIDUN - StatusChange::NEGATIVE1, // DC_DANCINGLESSON - StatusChange::NEGATIVE1, // DC_THROWARROW - StatusChange::NEGATIVE1, // DC_UGLYDANCE - StatusChange::NEGATIVE1, // DC_SCREAM - StatusChange::NEGATIVE1, // DC_HUMMING - StatusChange::NEGATIVE1, // DC_DONTFORGETME - StatusChange::NEGATIVE1, // DC_FORTUNEKISS - // 330- - StatusChange::NEGATIVE1, // DC_SERVICEFORYOU - StatusChange::NEGATIVE1, // NPC_SELFDESTRUCTION2 - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // WE_MALE - StatusChange::NEGATIVE1, // WE_FEMALE - StatusChange::NEGATIVE1, // WE_CALLPARTNER - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // NPC_DARKCROSS - StatusChange::NEGATIVE1, // (none) - // 340- - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - // 350- - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // (none) - StatusChange::NEGATIVE1, // LK_AURABLADE - StatusChange::NEGATIVE1, // LK_PARRYING - StatusChange::NEGATIVE1, // LK_CONCENTRATION - StatusChange::NEGATIVE1, // LK_TENSIONRELAX - StatusChange::NEGATIVE1, // LK_BERSERK - // 360- - StatusChange::NEGATIVE1, // LK_FURY - StatusChange::NEGATIVE1, // HP_ASSUMPTIO - StatusChange::NEGATIVE1, // HP_BASILICA - StatusChange::NEGATIVE1, // HP_MEDITATIO - StatusChange::NEGATIVE1, // HW_SOULDRAIN - StatusChange::NEGATIVE1, // HW_MAGICCRASHER - StatusChange::NEGATIVE1, // HW_MAGICPOWER - StatusChange::NEGATIVE1, // PA_PRESSURE - StatusChange::NEGATIVE1, // PA_SACRIFICE - StatusChange::NEGATIVE1, // PA_GOSPEL - // 370- - StatusChange::NEGATIVE1, // CH_PALMSTRIKE - StatusChange::NEGATIVE1, // CH_TIGERFIST - StatusChange::NEGATIVE1, // CH_CHAINCRUSH - StatusChange::NEGATIVE1, // PF_HPCONVERSION - StatusChange::NEGATIVE1, // PF_SOULCHANGE - StatusChange::NEGATIVE1, // PF_SOULBURN - StatusChange::NEGATIVE1, // ASC_KATAR - StatusChange::NEGATIVE1, // ASC_HALLUCINATION - StatusChange::NEGATIVE1, // ASC_EDP - StatusChange::NEGATIVE1, // ASC_BREAKER - // 380- - StatusChange::NEGATIVE1, // SN_SIGHT - StatusChange::NEGATIVE1, // SN_FALCONASSAULT - StatusChange::NEGATIVE1, // SN_SHARPSHOOTING - StatusChange::NEGATIVE1, // SN_WINDWALK - StatusChange::NEGATIVE1, // WS_MELTDOWN - StatusChange::NEGATIVE1, // WS_CREATECOIN - StatusChange::NEGATIVE1, // WS_CREATENUGGET - StatusChange::NEGATIVE1, // WS_CARTBOOST - StatusChange::NEGATIVE1, // WS_SYSTEMCREATE - StatusChange::NEGATIVE1, // ST_CHASEWALK - // 390- - StatusChange::NEGATIVE1, // ST_REJECTSWORD - StatusChange::NEGATIVE1, // ST_STEALBACKPACK - StatusChange::NEGATIVE1, // CR_ALCHEMY - StatusChange::NEGATIVE1, // CR_SYNTHESISPOTION - StatusChange::NEGATIVE1, // CG_ARROWVULCAN - StatusChange::NEGATIVE1, // CG_MOONLIT - StatusChange::NEGATIVE1, // CG_MARIONETTE - StatusChange::NEGATIVE1, // LK_SPIRALPIERCE - StatusChange::NEGATIVE1, // LK_HEADCRUSH - StatusChange::NEGATIVE1, // LK_JOINTBEAT - // 400- - StatusChange::NEGATIVE1, // HW_NAPALMVULCAN - StatusChange::NEGATIVE1, // CH_SOULCOLLECT - StatusChange::NEGATIVE1, // PF_MINDBREAKER - StatusChange::NEGATIVE1, // PF_MEMORIZE - StatusChange::NEGATIVE1, // PF_FOGWALL - StatusChange::NEGATIVE1, // PF_SPIDERWEB - StatusChange::NEGATIVE1, // ASC_METEORASSAULT - StatusChange::NEGATIVE1, // ASC_CDP - StatusChange::NEGATIVE1, // WE_BABY - StatusChange::NEGATIVE1, // WE_CALLPARENT - // 410- - StatusChange::NEGATIVE1, // WE_CALLBABY - StatusChange::NEGATIVE1, // TK_RUN - StatusChange::NEGATIVE1, // TK_READYSTORM - StatusChange::NEGATIVE1, // TK_STORMKICK - StatusChange::NEGATIVE1, // TK_READYDOWN - StatusChange::NEGATIVE1, // TK_DOWNKICK - StatusChange::NEGATIVE1, // TK_READYTURN - StatusChange::NEGATIVE1, // TK_TURNKICK - StatusChange::NEGATIVE1, // TK_READYCOUNTER - StatusChange::NEGATIVE1, // TK_COUNTER -}}; - struct skill_name_db skill_names[] = { {AC_OWL, "OWL", "Owl's_Eye"}, @@ -522,14 +50,6 @@ struct skill_name_db skill_names[] = {SkillID::ZERO, nullptr, nullptr} }; -static -const int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; -static -const int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; - -static -int rdamage; - earray<struct skill_db, SkillID, MAX_SKILL_DB> skill_db; @@ -538,25 +58,11 @@ int skill_attack(BF attack_type, struct block_list *src, struct block_list *dsrc, struct block_list *bl, SkillID skillid, int skilllv, unsigned int tick, BCT flag); static -int skill_delunitgroup(struct skill_unit_group *group); -static void skill_devotion_end(struct map_session_data *md, struct map_session_data *sd, int target); static -struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, - int x, int y); -static -struct skill_unit_group *skill_initunitgroup(struct block_list *src, - int count, SkillID skillid, int skilllv, int unit_id); -static void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data); -static -int skill_unitgrouptickset_delete(struct block_list *bl, int group_id); -static -struct skill_unit_group_tickset *skill_unitgrouptickset_search( - struct block_list *bl, int group_id); - int skill_get_hit(SkillID id) { @@ -568,11 +74,6 @@ int skill_get_inf(SkillID id) return skill_db[id].inf; } -int skill_get_pl(SkillID id) -{ - return skill_db[id].pl; -} - int skill_get_nk(SkillID id) { return skill_db[id].nk; @@ -593,23 +94,11 @@ int skill_get_range(SkillID id, int lv) return (lv <= 0) ? 0 : skill_db[id].range[lv - 1]; } -static -int skill_get_hp(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].hp[lv - 1]; -} - int skill_get_sp(SkillID id, int lv) { return (lv <= 0) ? 0 : skill_db[id].sp[lv - 1]; } -static -int skill_get_zeny(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].zeny[lv - 1]; -} - int skill_get_num(SkillID id, int lv) { return (lv <= 0) ? 0 : skill_db[id].num[lv - 1]; @@ -625,26 +114,6 @@ int skill_get_delay(SkillID id, int lv) return (lv <= 0) ? 0 : skill_db[id].delay[lv - 1]; } -int skill_get_time(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].upkeep_time[lv - 1]; -} - -int skill_get_time2(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].upkeep_time2[lv - 1]; -} - -int skill_get_castdef(SkillID id) -{ - return skill_db[id].cast_def_rate; -} - -int skill_get_weapontype(SkillID id) -{ - return skill_db[id].weapon; -} - int skill_get_inf2(SkillID id) { return skill_db[id].inf2; @@ -655,42 +124,12 @@ int skill_get_maxcount(SkillID id) return skill_db[id].maxcount; } -int skill_get_blewcount(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].blewcount[lv - 1]; -} - -static -int skill_get_mhp(SkillID id, int lv) -{ - return (lv <= 0) ? 0 : skill_db[id].mhp[lv - 1]; -} - static int skill_get_castnodex(SkillID id, int lv) { return (lv <= 0) ? 0 : skill_db[id].castnodex[lv - 1]; } -/* プロトタイプ */ -static -struct skill_unit_group *skill_unitsetting(struct block_list *src, - SkillID skillid, int skilllv, - int x, int y, int flag); -static -int skill_check_condition(struct map_session_data *sd, int type); -static -void skill_status_change_timer_sub(struct block_list *bl, - struct block_list *src, StatusChange type, unsigned int tick); -static -void skill_landprotector(struct block_list *bl, SkillID skillid, int *alive); -static -void skill_trap_splash(struct block_list *bl, - struct block_list *src, int tick, int splash_count); -static -void skill_count_target(struct block_list *bl, - struct block_list *src, int *c); - static int distance(int x0, int y0, int x1, int y1) { @@ -706,7 +145,7 @@ int distance(int x0, int y0, int x1, int y1) *------------------------------------------ */ int skill_additional_effect(struct block_list *src, struct block_list *bl, - SkillID skillid, int skilllv, BF attack_type, + SkillID skillid, int skilllv, BF, unsigned int) { struct map_session_data *sd = NULL; @@ -715,7 +154,6 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl, int luk; int sc_def_mdef, sc_def_vit, sc_def_int, sc_def_luk; - int sc_def_mdef2, sc_def_vit2, sc_def_int2, sc_def_luk2; int sc_def_phys_shield_spell; nullpo_ret(src); @@ -726,11 +164,13 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl, if (src->type == BL_PC) { - nullpo_ret(sd = (struct map_session_data *) src); + sd = (struct map_session_data *) src; + nullpo_ret(sd); } else if (src->type == BL_MOB) { - nullpo_ret(md = (struct mob_data *) src); //未使用? + md = (struct mob_data *) src; + nullpo_ret(md); //未使用? } sc_def_phys_shield_spell = 0; @@ -746,10 +186,7 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl, sc_def_luk = 100 - (3 + luk); //自分の耐性 luk = battle_get_luk(src); - sc_def_mdef2 = 100 - (3 + battle_get_mdef(src) + luk / 3); - sc_def_vit2 = 100 - (3 + battle_get_vit(src) + luk / 3); - sc_def_int2 = 100 - (3 + battle_get_int(src) + luk / 3); - sc_def_luk2 = 100 - (3 + luk); + if (bl->type == BL_MOB) { if (sc_def_mdef > 50) @@ -779,206 +216,6 @@ int skill_additional_effect(struct block_list *src, struct block_list *bl, break; } - if (not (sd && bool(attack_type & BF_WEAPON))) - return 0; - earray<int, BadSC, BadSC::COUNT> arr_sc_def_card1 //= - {{ - sc_def_mdef, // stone - sc_def_mdef, // freeze - sc_def_vit, // stan - sc_def_int, // sleep - sc_def_vit, // poison - sc_def_luk, // curse - sc_def_vit, // silence - sc_def_int, // confusion - sc_def_int, // blind - }}, arr_sc_def_card2 //= - {{ - sc_def_mdef2, // stone - sc_def_mdef2, // freeze - sc_def_vit2, // stan - sc_def_int2, // sleep - sc_def_vit2, // poison - sc_def_luk2, // curse - sc_def_vit2, // silence - sc_def_int2, // confusion - sc_def_int2, // blind - }}; - - for (BadSC bi : erange(BadSC(), BadSC::COUNT)) - { - StatusChange si = BadSC_to_SC(bi); - int sc_def_card1 = arr_sc_def_card1[bi]; - int eff1 = sd->addeff[bi]; - if (sd->state.arrow_atk) - eff1 += sd->arrow_addeff[bi]; - if (MRAND(10000) < eff1 * sc_def_card1 / 100) - { - if (battle_config.battle_log) - PRINTF("PC %d skill_addeff: cardによる異常発動 %d %d\n", - sd->bl.id, si, eff1); - - skill_status_change_start(bl, si, 7, 0, 0, 0, - (bi == BadSC::CONFUSION) - ? 10000 + 7000 - : 0, - 0); - } - - int sc_def_card2 = arr_sc_def_card2[bi]; - int eff2 = sd->addeff2[bi]; - - if (MRAND(10000) < eff2 * sc_def_card2 / 100) - { - if (battle_config.battle_log) - PRINTF("PC %d skill_addeff: cardによる異常発動 %d %d\n", - src->id, si, eff2); - skill_status_change_start(src, si, 7, 0, 0, 0, - (bi == BadSC::CONFUSION) - ? 10000 + 7000 - : 0, - 0); - } - } - return 0; -} - -/*========================================================================= - スキル攻撃吹き飛ばし処理 --------------------------------------------------------------------------*/ -static -int skill_blown(struct block_list *src, struct block_list *target, int count) -{ - int dx = 0, dy = 0, nx, ny; - int x = target->x, y = target->y; - int ret; - MS prev_state = MS_IDLE; - int moveblock; - struct map_session_data *sd = NULL; - struct mob_data *md = NULL; - struct skill_unit *su = NULL; - - nullpo_ret(src); - nullpo_ret(target); - - if (target->type == BL_PC) - { - nullpo_ret(sd = (struct map_session_data *) target); - } - else if (target->type == BL_MOB) - { - nullpo_ret(md = (struct mob_data *) target); - } - else if (target->type == BL_SKILL) - { - nullpo_ret(su = (struct skill_unit *) target); - } - else - return 0; - - if (!(count & 0x10000 && (sd || md || su))) - { /* 指定なしなら位置関係から方向を求める */ - dx = target->x - src->x; - dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0); - dy = target->y - src->y; - dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0); - } - if (dx == 0 && dy == 0) - { - int dir = battle_get_dir(target); - if (dir >= 0 && dir < 8) - { - dx = -dirx[dir]; - dy = -diry[dir]; - } - } - - ret = path_blownpos(target->m, x, y, dx, dy, count & 0xffff); - nx = ret >> 16; - ny = ret & 0xffff; - moveblock = (x / BLOCK_SIZE != nx / BLOCK_SIZE - || y / BLOCK_SIZE != ny / BLOCK_SIZE); - - if (count & 0x20000) - { - battle_stopwalking(target, 1); - if (sd) - { - sd->to_x = nx; - sd->to_y = ny; - sd->walktimer = 1; - clif_walkok(sd); - clif_movechar(sd); - } - else if (md) - { - md->to_x = nx; - md->to_y = ny; - prev_state = md->state.state; - md->state.state = MS_WALK; - clif_fixmobpos(md); - } - } - else - battle_stopwalking(target, 2); - - dx = nx - x; - dy = ny - y; - - if (sd) /* 画面外に出たので消去 */ - map_foreachinmovearea(std::bind(clif_pcoutsight, ph::_1, sd), - target->m, x - AREA_SIZE, y - AREA_SIZE, - x + AREA_SIZE, y + AREA_SIZE, - dx, dy, BL_NUL); - else if (md) - map_foreachinmovearea(std::bind(clif_moboutsight, ph::_1, md), - target->m, x - AREA_SIZE, y - AREA_SIZE, - x + AREA_SIZE, y + AREA_SIZE, - dx, dy, BL_PC); - - if (su) - { - skill_unit_move_unit_group(su->group, target->m, dx, dy); - } - else - { -// eptr<struct status_change, StatusChange> sc_data=battle_get_sc_data(target); - if (moveblock) - map_delblock(target); - target->x = nx; - target->y = ny; - if (moveblock) - map_addblock(target); -/*ダンス中にエフェクトは移動しないらしい - if (sc_data && sc_data[SC_DANCING].timer!=-1){ //対象がダンス中なのでエフェクトも移動 - struct skill_unit_group *sg= (struct skill_unit_group *)sc_data[SC_DANCING].val2; - if (sg) - skill_unit_move_unit_group(sg,target->m,dx,dy); - } -*/ - } - - if (sd) - { /* 画面内に入ってきたので表示 */ - map_foreachinmovearea(std::bind(clif_pcinsight, ph::_1, sd), - target->m, nx - AREA_SIZE, ny - AREA_SIZE, - nx + AREA_SIZE, ny + AREA_SIZE, - -dx, -dy, BL_NUL); - if (count & 0x20000) - sd->walktimer = -1; - } - else if (md) - { - map_foreachinmovearea(std::bind(clif_mobinsight, ph::_1, md), - target->m, nx - AREA_SIZE, ny - AREA_SIZE, - nx + AREA_SIZE, ny + AREA_SIZE, - -dx, -dy, BL_PC); - if (count & 0x20000) - md->state.state = prev_state; - } - - skill_unit_move(target, gettick(), (count & 0xffff) + 7); /* スキルユニットの判定 */ - return 0; } @@ -1002,7 +239,6 @@ int skill_attack(BF attack_type, struct block_list *src, eptr<struct status_change, StatusChange> sc_data; int type, lv, damage; - rdamage = 0; nullpo_ret(src); nullpo_ret(dsrc); nullpo_ret(bl); @@ -1020,11 +256,6 @@ int skill_attack(BF attack_type, struct block_list *src, return 0; if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl)) //対象がPCですでに死んでいたら何もしない return 0; - if (sc_data && sc_data[SC_HIDING].timer != -1) - { //ハイディング状態で - if (skill_get_pl(skillid) != 2) //スキルの属性が地属性でなければ何もしない - return 0; - } if (src->type == BL_PC && ((struct map_session_data *) src)->chatID) //術者がPCでチャット中なら何もしない return 0; if (dsrc->type == BL_PC && ((struct map_session_data *) dsrc)->chatID) //術者がPCでチャット中なら何もしない @@ -1033,76 +264,16 @@ int skill_attack(BF attack_type, struct block_list *src, //何もしない判定ここまで type = -1; - lv = (flag >> 20) & 0xf; - dmg = battle_calc_attack(attack_type, src, bl, skillid, skilllv, flag & 0xff); //ダメージ計算 + lv = flag.level; + dmg = battle_calc_attack(attack_type, src, bl, skillid, skilllv, flag.lo); //ダメージ計算 damage = dmg.damage + dmg.damage2; if (lv == 15) lv = -1; - if (flag & 0xff00) - type = (flag & 0xff00) >> 8; - - if (damage <= 0 || damage < dmg.div_) //吹き飛ばし判定?※ - dmg.blewcount = 0; - -//武器スキル?ここから - //AppleGirl Was Here - if (bool(attack_type & BF_MAGIC) - && damage > 0 - && src != bl - && src == dsrc) - { //Blah Blah - if (bl->type == BL_PC) - { //Blah Blah - struct map_session_data *tsd = (struct map_session_data *) bl; - if (tsd->magic_damage_return > 0) - { //More Blah - rdamage += damage * tsd->magic_damage_return / 100; - if (rdamage < 1) - rdamage = 1; - } - } - } - //Stop Here - if (bool(attack_type & BF_WEAPON) - && damage > 0 - && src != bl - && src == dsrc) - { //武器スキル&ダメージあり&使用者と対象者が違う&src=dsrc - if (bool(dmg.flag & BF_SHORT)) - { //近距離攻撃時?※ - if (bl->type == BL_PC) - { //対象がPCの時 - struct map_session_data *tsd = (struct map_session_data *) bl; - nullpo_ret(tsd); - if (tsd->short_weapon_damage_return > 0) - { //近距離攻撃跳ね返し?※ - rdamage += damage * tsd->short_weapon_damage_return / 100; - if (rdamage < 1) - rdamage = 1; - } - } - } - else if (bool(dmg.flag & BF_LONG)) - { //遠距離攻撃時?※ - if (bl->type == BL_PC) - { //対象がPCの時 - struct map_session_data *tsd = (struct map_session_data *) bl; - nullpo_ret(tsd); - if (tsd->long_weapon_damage_return > 0) - { //遠距離攻撃跳ね返し?※ - rdamage += damage * tsd->long_weapon_damage_return / 100; - if (rdamage < 1) - rdamage = 1; - } - } - } - if (rdamage > 0) - clif_damage(src, src, tick, dmg.amotion, 0, rdamage, 1, 4, 0); - } -//武器スキル?ここまで + if (flag.mid) + type = flag.mid; switch (skillid) { @@ -1114,14 +285,6 @@ int skill_attack(BF attack_type, struct block_list *src, (lv != 0) ? lv : skilllv, (skillid == SkillID::ZERO) ? 5 : type); } - if (dmg.blewcount > 0) - { /* 吹き飛ばし処理とそのパケット */ - skill_blown(dsrc, bl, dmg.blewcount); - if (bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *) bl); - else - clif_fixpos(bl); - } map_freeblock_lock(); /* 実際にダメージ処理を行う */ @@ -1147,11 +310,11 @@ int skill_attack(BF attack_type, struct block_list *src, target = md->target_id; if (src->type == BL_PC) md->target_id = src->id; - mobskill_use(md, tick, MSC_SKILLUSED, skillid); + mobskill_use(md, tick, MobSkillCondition::ANY, skillid); md->target_id = target; } else - mobskill_use(md, tick, MSC_SKILLUSED, skillid); + mobskill_use(md, tick, MobSkillCondition::ANY, skillid); } } } @@ -1189,9 +352,6 @@ int skill_attack(BF attack_type, struct block_list *src, pc_heal(sd, hp, sp); } - if (rdamage > 0) - battle_damage(bl, src, rdamage, 0); - map_freeblock_unlock(); return (dmg.damage + dmg.damage2); /* 与ダメを返す */ @@ -1208,143 +368,13 @@ void skill_area_sub(struct block_list *bl, { nullpo_retv(bl); - if (bl->type != BL_PC && bl->type != BL_MOB && bl->type != BL_SKILL) + if (bl->type != BL_PC && bl->type != BL_MOB) return; if (battle_check_target(src, bl, flag) > 0) func(src, bl, skill_id, skill_lv, tick, flag); } -int skill_check_unit_range(int, int, int, int, SkillID) -{ - return 0; -} - -static -void skill_check_unit_range2_sub(struct block_list *bl, int *c) -{ - nullpo_retv(bl); - nullpo_retv(c); - - if (bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB)) - return; - - if (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl)) - return; - - (*c)++; -} - -int skill_check_unit_range2(int m, int x, int y, int range) -{ - int c = 0; - - map_foreachinarea(std::bind(skill_check_unit_range2_sub, ph::_1, &c), - m, x - range, y - range, - x + range, y + range, BL_NUL); - - return c; -} - -/*========================================== - * - *------------------------------------------ - */ -static -void skill_timer(timer_id, tick_t tick, custom_id_t id, custom_data_t data) -{ - struct map_session_data *sd = NULL; - struct mob_data *md = NULL; - struct block_list *src = map_id2bl(id), *target; - struct skill_timerskill *skl = NULL; - - nullpo_retv(src); - - if (src->prev == NULL) - return; - - if (src->type == BL_PC) - { - nullpo_retv(sd = (struct map_session_data *) src); - skl = &sd->skilltimerskill[data]; - } - else if (src->type == BL_MOB) - { - nullpo_retv(md = (struct mob_data *) src); - skl = &md->skilltimerskill[data]; - } - - else - return; - - nullpo_retv(skl); - - skl->timer = -1; - if (skl->target_id) - { - target = map_id2bl(skl->target_id); - if (target == NULL) - return; - if (target->prev == NULL) - return; - if (src->m != target->m) - return; - if (sd && pc_isdead(sd)) - return; - if (target->type == BL_PC - && pc_isdead((struct map_session_data *) target)) - return; - - switch (skl->skill_id) - { - default: - skill_attack(skl->type.bf, src, src, target, skl->skill_id, - skl->skill_lv, tick, skl->flag); - break; - } - } -} - -/*========================================== - * - *------------------------------------------ - */ -int skill_cleartimerskill(struct block_list *src) -{ - int i; - - nullpo_ret(src); - - if (src->type == BL_PC) - { - struct map_session_data *sd = (struct map_session_data *) src; - nullpo_ret(sd); - for (i = 0; i < MAX_SKILLTIMERSKILL; i++) - { - if (sd->skilltimerskill[i].timer != -1) - { - delete_timer(sd->skilltimerskill[i].timer, skill_timer); - sd->skilltimerskill[i].timer = -1; - } - } - } - else if (src->type == BL_MOB) - { - struct mob_data *md = (struct mob_data *) src; - nullpo_ret(md); - for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) - { - if (md->skilltimerskill[i].timer != -1) - { - delete_timer(md->skilltimerskill[i].timer, skill_timer); - md->skilltimerskill[i].timer = -1; - } - } - } - - return 0; -} - /* 範囲スキル使用処理小分けここまで * ------------------------------------------------------------------------- */ @@ -1386,7 +416,7 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl, break; case NPC_SELFDESTRUCTION: /* 自爆 */ - if (flag & 1) + if (flag.lo & 1) { /* 個別にダメージを与える */ if (src->type == BL_MOB) @@ -1420,7 +450,7 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl, case SkillID::ZERO: if (sd) { - if (flag & 3) + if (flag.lo & 3) { if (bl->id != skill_area_temp_id) skill_attack(BF_WEAPON, src, src, bl, skillid, @@ -1428,11 +458,11 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl, } else { - int ar = sd->splash_range; + // TODO does this happen? skill_area_temp_id = bl->id; map_foreachinarea(std::bind(skill_area_sub, ph::_1, src, skillid, skilllv, tick, flag | BCT_ENEMY | BCT_lo_x01, skill_castend_damage_id), - bl->m, bl->x - ar, bl->y - ar, - bl->x + ar, bl->y + ar, BL_NUL); + bl->m, bl->x - 0, bl->y - 0, + bl->x + 0, bl->y + 0, BL_NUL); } } break; @@ -1450,6 +480,8 @@ int skill_castend_damage_id(struct block_list *src, struct block_list *bl, * スキル使用(詠唱完了、ID指定支援系) *------------------------------------------ */ +// skillid.nk == 1 +// so skillid in (NPC_SUMMONSLAVE, NPC_EMOTION) int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, SkillID skillid, int skilllv, unsigned int, BCT) @@ -1475,11 +507,13 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, if (bl->type == BL_PC) { - nullpo_retr(1, dstsd = (struct map_session_data *) bl); + dstsd = (struct map_session_data *) bl; + nullpo_retr(1, dstsd); } else if (bl->type == BL_MOB) { - nullpo_retr(1, dstmd = (struct mob_data *) bl); + dstmd = (struct mob_data *) bl; + nullpo_retr(1, dstmd); if (sc_def_vit > 50) sc_def_vit = 50; if (sc_def_mdef > 50) @@ -1502,32 +536,21 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, map_freeblock_lock(); switch (skillid) { - case NPC_SELFDESTRUCTION: /* 自爆 */ - skill_status_change_start(bl, SkillStatusChangeTable[skillid], - skilllv, uint16_t(skillid), 0, 0, - skill_get_time(skillid, skilllv), 0); - break; - - case NPC_SUMMONSLAVE: /* 手下召喚 */ + case NPC_SUMMONSLAVE: if (md && !md->master_id) { mob_summonslave(md, - mob_db[md->mob_class].skill[md->skillidx].val, - skilllv, - (true) ? 1 : 0); + mob_db[md->mob_class].skill[md->skillidx].val, + skilllv, + (true) ? 1 : 0); } break; - case NPC_EMOTION: /* エモーション */ + case NPC_EMOTION: if (md) clif_emotion(&md->bl, - mob_db[md->mob_class].skill[md->skillidx].val[0]); + mob_db[md->mob_class].skill[md->skillidx].val[0]); break; - - default: - PRINTF("Unknown skill used:%d\n", skillid); - map_freeblock_unlock(); - return 1; } map_freeblock_unlock(); @@ -1535,1162 +558,11 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, } /*========================================== - * スキル使用(詠唱完了、ID指定) - *------------------------------------------ - */ -static -void skill_castend_id(timer_id tid, tick_t tick, custom_id_t id, custom_data_t) -{ - struct map_session_data *sd = map_id2sd(id) /*,*target_sd=NULL */ ; - struct block_list *bl; - int range, inf2; - - nullpo_retv( sd); - - if (sd->bl.prev == NULL) //prevが無いのはありなの? - return; - - if (sd->skilltimer != tid) /* タイマIDの確認 */ - return; - sd->skilltimer = -1; - - if ((bl = map_id2bl(sd->skilltarget)) == NULL || bl->prev == NULL) - { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - if (sd->bl.m != bl->m || pc_isdead(sd)) - { //マップが違うか自分が死んでいる - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - - inf2 = skill_get_inf2(sd->skillid); - if (((skill_get_inf(sd->skillid) & 1) || inf2 & 4) && // 彼我敵対関係チェック - battle_check_target(&sd->bl, bl, BCT_ENEMY) <= 0) - { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - if (inf2 & 0xC00 && sd->bl.id != bl->id) - { - int fail_flag = 1; - if (inf2 & 0x400 && battle_check_target(&sd->bl, bl, BCT_PARTY) > 0) - fail_flag = 0; - if (fail_flag) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - } - - range = skill_get_range(sd->skillid, sd->skilllv); - if (range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - range += battle_config.pc_skill_add_range; - if (battle_config.skill_out_range_consume) - { - // changed to allow casting when target walks out of range [Valaris] - if (range < distance(sd->bl.x, sd->bl.y, bl->x, bl->y)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - } - if (!skill_check_condition(sd, 1)) - { /* 使用条件チェック */ - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - if (battle_config.skill_out_range_consume) - { - if (range < distance(sd->bl.x, sd->bl.y, bl->x, bl->y)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - return; - } - } - - if (battle_config.pc_skill_log) - PRINTF("PC %d skill castend skill=%d\n", - sd->bl.id, sd->skillid); - pc_stop_walking(sd, 0); - - switch (skill_get_nk(sd->skillid)) - { - /* 攻撃系/吹き飛ばし系 */ - case 0: - case 2: - skill_castend_damage_id(&sd->bl, bl, - sd->skillid, sd->skilllv, - tick, BCT_ZERO); - break; - case 1: /* 支援系 */ - skill_castend_nodamage_id(&sd->bl, bl, - sd->skillid, sd->skilllv, - tick, BCT_ZERO); - break; - } -} - -/*========================================== - * スキル使用(詠唱完了、map指定) - *------------------------------------------ - */ -int skill_castend_map(struct map_session_data *sd, SkillID skill_num, - const char *mapname) -{ - nullpo_ret(sd); - if (sd->bl.prev == NULL || pc_isdead(sd)) - return 0; - - if (bool(sd->opt1) - || bool(sd->status.option & Option::HIDE2)) - return 0; - - if (skill_num != sd->skillid) /* 不正パケットらしい */ - return 0; - - pc_stopattack(sd); - - if (battle_config.pc_skill_log) - PRINTF("PC %d skill castend skill =%d map=%s\n", - sd->bl.id, skill_num, mapname); - pc_stop_walking(sd, 0); - - if (strcmp(mapname, "cancel") == 0) - return 0; - - return 0; -} - -/*========================================== - * スキルユニット設定処理 - *------------------------------------------ - */ -struct skill_unit_group *skill_unitsetting(struct block_list *src, - SkillID skillid, int skilllv, - int x, int y, int) -{ - struct skill_unit_group *group; - int i, count = 1, limit_ = 10000, val1_ = 0, val2_ = 0; - BCT target = BCT_ENEMY; - int interval = 1000, range_ = 0; - - nullpo_ret(src); - - nullpo_retr(NULL, group = skill_initunitgroup(src, count, skillid, skilllv, 0)); - group->limit = limit_; - group->val1 = val1_; - group->val2 = val2_; - group->target_flag = target; - group->interval = interval; - group->range = range_; - for (i = 0; i < count; i++) - { - struct skill_unit *unit; - int ux = x, uy = y, val1 = skilllv, val2 = 0, limit = - group->limit, alive = 1; - int range = group->range; - //直上スキルの場合設置座標上にランドプロテクターがないかチェック - if (range <= 0) - map_foreachinarea(std::bind(skill_landprotector, ph::_1, skillid, &alive), - src->m, ux, uy, - ux, uy, BL_SKILL); - - if (alive) - { - nullpo_retr(NULL, unit = skill_initunit(group, i, ux, uy)); - unit->val1 = val1; - unit->val2 = val2; - unit->limit = limit; - unit->range = range; - } - } - return group; -} - -/*========================================== - * スキルユニットの発動イベント - *------------------------------------------ - */ -static -int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, - unsigned int tick) -{ - struct skill_unit_group *sg; - struct block_list *ss; - struct skill_unit_group_tickset *ts; - struct map_session_data *srcsd = NULL; - int diff, goflag, splash_count = 0; - - nullpo_ret(src); - nullpo_ret(bl); - - if (bl->prev == NULL || !src->alive - || (bl->type == BL_PC && pc_isdead((struct map_session_data *) bl))) - return 0; - - nullpo_ret(sg = src->group); - nullpo_ret(ss = map_id2bl(sg->src_id)); - - if (ss->type == BL_PC) - nullpo_ret(srcsd = (struct map_session_data *) ss); - if (srcsd && srcsd->chatID) - return 0; - - if (bl->type != BL_PC && bl->type != BL_MOB) - return 0; - nullpo_ret(ts = skill_unitgrouptickset_search(bl, sg->group_id)); - diff = DIFF_TICK(tick, ts->tick); - goflag = (diff > sg->interval || diff < 0); - - //対象がLP上に居る場合は無効 - map_foreachinarea(std::bind(skill_landprotector, ph::_1, SkillID::ZERO, &goflag), - bl->m, bl->x, bl->y, - bl->x, bl->y, BL_SKILL); - - if (!goflag) - return 0; - ts->tick = tick; - ts->group_id = sg->group_id; - - switch (sg->unit_id) - { - case 0x83: /* サンクチュアリ */ - { - int race = battle_get_race(bl); - int damage_flag = - (battle_check_undead(race, battle_get_elem_type(bl)) - || race == 6) ? 1 : 0; - - if (battle_get_hp(bl) >= battle_get_max_hp(bl) && !damage_flag) - break; - - if ((sg->val1--) <= 0) - { - skill_delunitgroup(sg); - return 0; - } - if (!damage_flag) - { - int heal = sg->val2; - if (bl->type == BL_PC - && ((struct map_session_data *) bl)-> - special_state.no_magic_damage) - heal = 0; /* 黄金蟲カード(ヒール量0) */ - battle_heal(NULL, bl, heal, 0, 0); - } - else - skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - } - break; - - case 0x84: /* マグヌスエクソシズム */ - { - int race = battle_get_race(bl); - int damage_flag = - (battle_check_undead(race, battle_get_elem_type(bl)) - || race == 6) ? 1 : 0; - - if (!damage_flag) - return 0; - skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - } - break; - - case 0x85: /* ニューマ */ - { - struct skill_unit *unit2; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - if (sc_data && sc_data[SC_PNEUMA].timer == -1) - skill_status_change_start(bl, SC_PNEUMA, sg->skill_lv, - (int) src, 0, 0, 0, 0); - else if ((unit2 = (struct skill_unit *) sc_data[SC_PNEUMA].val2) - && unit2 != src) - { - if (DIFF_TICK(sg->tick, unit2->group->tick) > 0) - skill_status_change_start(bl, SC_PNEUMA, sg->skill_lv, - (int) src, 0, 0, 0, 0); - ts->tick -= sg->interval; - } - } - break; - case 0x7e: /* セイフティウォール */ - { - struct skill_unit *unit2; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - if (sc_data && sc_data[SC_SAFETYWALL].timer == -1) - skill_status_change_start(bl, SC_SAFETYWALL, sg->skill_lv, - (int) src, 0, 0, 0, 0); - else if ((unit2 = (struct skill_unit *) sc_data[SC_SAFETYWALL].val2) - && unit2 != src) - { - if (sg->val1 < unit2->group->val1) - skill_status_change_start(bl, SC_SAFETYWALL, sg->skill_lv, - (int) src, 0, 0, 0, 0); - ts->tick -= sg->interval; - } - } - break; - - case 0x86: /* ロードオブヴァーミリオン(&ストームガスト &グランドクロス) */ - skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - break; - - case 0x7f: /* ファイヤーウォール */ - if ((src->val2--) > 0) - skill_attack(BF_MAGIC, ss, &src->bl, bl, - sg->skill_id, sg->skill_lv, tick, BCT_ZERO); - if (src->val2 <= 0) - skill_delunit(src); - break; - - case 0x87: /* ファイアーピラー(発動前) */ - skill_delunit(src); - skill_unitsetting(ss, sg->skill_id, sg->skill_lv, src->bl.x, - src->bl.y, 1); - break; - - case 0x88: /* ファイアーピラー(発動後) */ - if (DIFF_TICK(tick, sg->tick) < 150) - skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - break; - - case 0x90: /* スキッドトラップ */ - { - int i, c = skill_get_blewcount(sg->skill_id, sg->skill_lv); - for (i = 0; i < c; i++) - skill_blown(&src->bl, bl, 1 | 0x30000); - sg->unit_id = 0x8c; - clif_changelook(&src->bl, LOOK_BASE, sg->unit_id); - sg->limit = DIFF_TICK(tick, sg->tick) + 1500; - } - break; - - case 0x93: /* ランドマイン */ - skill_attack(BF_MISC, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - sg->unit_id = 0x8c; - clif_changelook(&src->bl, LOOK_BASE, 0x88); - sg->limit = DIFF_TICK(tick, sg->tick) + 1500; - break; - - case 0x8f: /* ブラストマイン */ - case 0x94: /* ショックウェーブトラップ */ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x97: /* フリージングトラップ */ - case 0x98: /* クレイモアートラップ */ - map_foreachinarea(std::bind(skill_count_target, ph::_1, &src->bl, &splash_count), - src->bl.m, src->bl.x - src->range, src->bl.y - src->range, - src->bl.x + src->range, src->bl.y + src->range, BL_NUL); - map_foreachinarea(std::bind(skill_trap_splash, ph::_1, &src->bl, tick, splash_count), - src->bl.m, src->bl.x - src->range, src->bl.y - src->range, - src->bl.x + src->range, src->bl.y + src->range, BL_NUL); - sg->unit_id = 0x8c; - clif_changelook(&src->bl, LOOK_BASE, sg->unit_id); - sg->limit = DIFF_TICK(tick, sg->tick) + 1500; - break; - - case 0x91: /* アンクルスネア */ - { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - if (sg->val2 == 0 && sc_data && sc_data[SC_ANKLE].timer == -1) - { - int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE - || bl->y / BLOCK_SIZE != - src->bl.y / BLOCK_SIZE); - int sec = skill_get_time2(sg->skill_id, - sg->skill_lv) - - (double) battle_get_agi(bl) * 0.1; - if (bool(battle_get_mode(bl) & MobMode::BOSS)) - sec = sec / 5; - battle_stopwalking(bl, 1); - skill_status_change_start(bl, SC_ANKLE, - sg->skill_lv, 0, 0, 0, - sec, 0); - - if (moveblock) - map_delblock(bl); - bl->x = src->bl.x; - bl->y = src->bl.y; - if (moveblock) - map_addblock(bl); - if (bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *) bl); - else - clif_fixpos(bl); - sg->limit = DIFF_TICK(tick, sg->tick) + sec; - sg->val2 = bl->id; - } - } - break; - - case 0x80: /* ワープポータル(発動後) */ - if (bl->type == BL_PC) - { - struct map_session_data *sd = (struct map_session_data *) bl; - if (sd && src->bl.m == bl->m && src->bl.x == bl->x - && src->bl.y == bl->y && src->bl.x == sd->to_x - && src->bl.y == sd->to_y) - { - if (battle_config.chat_warpportal || !sd->chatID) - { - if ((sg->val1--) > 0) - { - pc_setpos(sd, sg->valstr, sg->val2 >> 16, - sg->val2 & 0xffff, 3); - if (sg->src_id == bl->id - || (strcmp(map[src->bl.m].name, sg->valstr) - == 0 && src->bl.x == (sg->val2 >> 16) - && src->bl.y == (sg->val2 & 0xffff))) - skill_delunitgroup(sg); - } - else - skill_delunitgroup(sg); - } - } - } - else if (bl->type == BL_MOB && battle_config.mob_warpportal) - { - int m = map_mapname2mapid(sg->valstr); - mob_warp((struct mob_data *) bl, m, sg->val2 >> 16, - sg->val2 & 0xffff, 3); - } - break; - - case 0x8e: /* クァグマイア */ - { - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (bl->type == BL_PC - && ((struct map_session_data *) bl)-> - special_state.no_magic_damage) - break; - if (battle_get_sc_data(bl)[type].timer == -1) - skill_status_change_start(bl, type, sg->skill_lv, (int) src, - 0, 0, - skill_get_time2(sg->skill_id, - sg->skill_lv), 0); - } - break; - case 0x92: /* ベノムダスト */ - { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sc_data && sc_data[type].timer == -1) - skill_status_change_start(bl, type, sg->skill_lv, (int) src, - 0, 0, - skill_get_time2(sg->skill_id, - sg->skill_lv), 0); - } - break; - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - { - struct skill_unit *unit2; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sc_data && sc_data[type].timer == -1) - skill_status_change_start(bl, type, sg->skill_lv, (int) src, - 0, 0, - skill_get_time2(sg->skill_id, - sg->skill_lv), 0); - else if ((unit2 = (struct skill_unit *) sc_data[type].val2) - && unit2 != src) - { - if (DIFF_TICK(sg->tick, unit2->group->tick) > 0) - skill_status_change_start(bl, type, sg->skill_lv, - (int) src, 0, 0, - skill_get_time2(sg->skill_id, - sg->skill_lv), - 0); - ts->tick -= sg->interval; - } - } break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - { - struct skill_unit *unit2; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sg->src_id == bl->id) - break; - if (sc_data && sc_data[type].timer == -1) - skill_status_change_start(bl, type, sg->skill_lv, sg->val1, - sg->val2, (int) src, - skill_get_time2(sg->skill_id, - sg->skill_lv), 0); - else if ((unit2 = (struct skill_unit *) sc_data[type].val4) - && unit2 != src) - { - if (unit2->group - && DIFF_TICK(sg->tick, unit2->group->tick) > 0) - skill_status_change_start(bl, type, sg->skill_lv, - sg->val1, sg->val2, (int) src, - skill_get_time2(sg->skill_id, - sg->skill_lv), - 0); - ts->tick -= sg->interval; - } - } break; - - case 0xaa: /* イドゥンの林檎 */ - { - struct skill_unit *unit2; - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sg->src_id == bl->id) - break; - if (sc_data && sc_data[type].timer == -1) - skill_status_change_start(bl, type, sg->skill_lv, - (sg->val1) >> 16, - (sg->val1) & 0xffff, (int) src, - skill_get_time2(sg->skill_id, - sg->skill_lv), 0); - else if ((unit2 = (struct skill_unit *) sc_data[type].val4) - && unit2 != src) - { - if (DIFF_TICK(sg->tick, unit2->group->tick) > 0) - skill_status_change_start(bl, type, sg->skill_lv, - (sg->val1) >> 16, - (sg->val1) & 0xffff, (int) src, - skill_get_time2(sg->skill_id, - sg->skill_lv), - 0); - ts->tick -= sg->interval; - } - } break; - - case 0xb1: /* デモンストレーション */ - skill_attack(BF_WEAPON, ss, &src->bl, bl, sg->skill_id, - sg->skill_lv, tick, BCT_ZERO); - if (bl->type == BL_PC && MRAND(100) < sg->skill_lv - && battle_config.equipment_breaking) - pc_breakweapon((struct map_session_data *) bl); - break; - case 0x99: /* トーキーボックス */ - if (sg->src_id == bl->id) //自分が踏んでも発動しない - break; - if (sg->val2 == 0) - { - sg->unit_id = 0x8c; - clif_changelook(&src->bl, LOOK_BASE, sg->unit_id); - sg->limit = DIFF_TICK(tick, sg->tick) + 5000; - sg->val2 = -1; //踏んだ - } - break; - case 0xb2: /* あなたを_会いたいです */ - case 0xb3: /* ゴスペル */ - case 0xb6: /* フォグウォール */ - //とりあえず何もしない - break; - - case 0xb7: /* スパイダーウェッブ */ - if (sg->val2 == 0) - { - int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE - || bl->y / BLOCK_SIZE != - src->bl.y / BLOCK_SIZE); - skill_additional_effect(ss, bl, sg->skill_id, sg->skill_lv, - BF_MISC, tick); - if (moveblock) - map_delblock(bl); - bl->x = (&src->bl)->x; - bl->y = (&src->bl)->y; - if (moveblock) - map_addblock(bl); - if (bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *) bl); - else - clif_fixpos(bl); - sg->limit = - DIFF_TICK(tick, - sg->tick) + skill_get_time2(sg->skill_id, - sg->skill_lv); - sg->val2 = bl->id; - } - break; - -/* default: - if (battle_config.error_log) - PRINTF("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); - break;*/ - } - if (bl->type == BL_MOB && ss != bl) /* スキル使用条件のMOBスキル */ - { - if (battle_config.mob_changetarget_byskill == 1) - { - int target = ((struct mob_data *) bl)->target_id; - if (ss->type == BL_PC) - ((struct mob_data *) bl)->target_id = ss->id; - mobskill_use((struct mob_data *) bl, tick, - MSC_SKILLUSED, sg->skill_id); - ((struct mob_data *) bl)->target_id = target; - } - else - mobskill_use((struct mob_data *) bl, tick, - MSC_SKILLUSED, sg->skill_id); - } - - return 0; -} - -/*========================================== - * スキルユニットから離脱する(もしくはしている)場合 - *------------------------------------------ - */ -static -int skill_unit_onout(struct skill_unit *src, struct block_list *bl, - unsigned int tick) -{ - struct skill_unit_group *sg; - - nullpo_ret(src); - nullpo_ret(bl); - nullpo_ret(sg = src->group); - - if (bl->prev == NULL || !src->alive) - return 0; - - if (bl->type != BL_PC && bl->type != BL_MOB) - return 0; - - switch (sg->unit_id) - { - case 0x7e: /* セイフティウォール */ - case 0x85: /* ニューマ */ - case 0x8e: /* クァグマイア */ - { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - StatusChange type = - (sg->unit_id == 0x85) ? SC_PNEUMA : SC_SAFETYWALL; - if (sc_data - && sc_data[type].timer != -1 - && ((struct skill_unit *) sc_data[type].val2) == src) - { - skill_status_change_end(bl, type, -1); - } - } break; - - case 0x91: /* アンクルスネア */ - { - struct block_list *target = map_id2bl(sg->val2); - if (target && target == bl) - { - skill_status_change_end(bl, SC_ANKLE, -1); - sg->limit = DIFF_TICK(tick, sg->tick) + 1000; - } - } - break; - case 0xb5: - case 0xb8: - { - sg->limit = DIFF_TICK(tick, sg->tick) + 1000; - } - break; - case 0xb6: - { - sg->limit = DIFF_TICK(tick, sg->tick) + 1000; - } - break; - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - struct skill_unit *su; - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sc_data && sc_data[type].timer != -1 - && (su = ((struct skill_unit *) sc_data[type].val2)) - && su == src) - { - skill_status_change_end(bl, type, -1); - } - } - break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - { - eptr<struct status_change, StatusChange> sc_data = battle_get_sc_data(bl); - struct skill_unit *su; - StatusChange type = SkillStatusChangeTable[sg->skill_id]; - if (sc_data && sc_data[type].timer != -1 - && (su = ((struct skill_unit *) sc_data[type].val4)) - && su == src) - { - skill_status_change_end(bl, type, -1); - } - } - break; - case 0xb7: /* スパイダーウェッブ */ - { - sg->limit = DIFF_TICK(tick, sg->tick) + 1000; - } - break; - -/* default: - if (battle_config.error_log) - PRINTF("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); - break;*/ - } - skill_unitgrouptickset_delete(bl, sg->group_id); - return 0; -} - -/*========================================== - * スキルユニットの削除イベント - *------------------------------------------ - */ -static -int skill_unit_ondelete(struct skill_unit *src, struct block_list *bl, - unsigned int tick) -{ - struct skill_unit_group *sg; - - nullpo_ret(src); - nullpo_ret(bl); - nullpo_ret(sg = src->group); - - if (bl->prev == NULL || !src->alive) - return 0; - - if (bl->type != BL_PC && bl->type != BL_MOB) - return 0; - - switch (sg->unit_id) - { - case 0x85: /* ニューマ */ - case 0x7e: /* セイフティウォール */ - case 0x8e: /* クァグマイヤ */ - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - return skill_unit_onout(src, bl, tick); - -/* default: - if (battle_config.error_log) - PRINTF("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); - break;*/ - } - skill_unitgrouptickset_delete(bl, sg->group_id); - return 0; -} - -/*========================================== - * スキルユニットの限界イベント - *------------------------------------------ - */ -static -int skill_unit_onlimit(struct skill_unit *src, unsigned int) -{ - struct skill_unit_group *sg; - - nullpo_ret(src); - nullpo_ret(sg = src->group); - - switch (sg->unit_id) - { - case 0x81: /* ワープポータル(発動前) */ - { - struct skill_unit_group *group = - skill_unitsetting(map_id2bl(sg->src_id), sg->skill_id, - sg->skill_lv, - src->bl.x, src->bl.y, 1); - if (group == NULL) - return 0; - CREATE(group->valstr, char, 24); - memcpy(group->valstr, sg->valstr, 24); - group->val2 = sg->val2; - } - break; - - case 0x8d: /* アイスウォール */ - map_setcell(src->bl.m, src->bl.x, src->bl.y, src->val2); - break; - case 0xb2: /* あなたに会いたい */ - { - struct map_session_data *sd = NULL; - struct map_session_data *p_sd = NULL; - if ((sd = - (struct map_session_data *)(map_id2bl(sg->src_id))) == - NULL) - return 0; - if ((p_sd = pc_get_partner(sd)) == NULL) - return 0; - - pc_setpos(p_sd, map[src->bl.m].name, src->bl.x, src->bl.y, 3); - } - break; - } - return 0; -} - -/*========================================== - * スキルユニットのダメージイベント - *------------------------------------------ - */ -int skill_unit_ondamaged(struct skill_unit *src, struct block_list *bl, - int damage, unsigned int) -{ - struct skill_unit_group *sg; - - nullpo_ret(src); - nullpo_ret(sg = src->group); - - switch (sg->unit_id) - { - case 0x8d: /* アイスウォール */ - src->val1 -= damage; - break; - case 0x8f: /* ブラストマイン */ - case 0x98: /* クレイモアートラップ */ - skill_blown(bl, &src->bl, 2); //吹き飛ばしてみる - break; - default: - damage = 0; - break; - } - return damage; -} - -/*---------------------------------------------------------------------------- */ - -/*========================================== - * スキル使用(詠唱完了、場所指定) - *------------------------------------------ - */ -static -void skill_castend_pos(timer_id tid, tick_t tick, custom_id_t id, custom_data_t) -{ - struct map_session_data *sd = map_id2sd(id) /*,*target_sd=NULL */ ; - int maxcount; - - nullpo_retv(sd); - - if (sd->bl.prev == NULL) - return; - if (sd->skilltimer != tid) /* タイマIDの確認 */ - return; - sd->skilltimer = -1; - if (pc_isdead(sd)) - { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - - if (battle_config.pc_land_skill_limit) - { - maxcount = skill_get_maxcount(sd->skillid); - if (maxcount > 0) - { - int i, c; - for (i = c = 0; i < MAX_SKILLUNITGROUP; i++) - { - if (sd->skillunit[i].alive_count > 0 - && sd->skillunit[i].skill_id == sd->skillid) - c++; - } - if (c >= maxcount) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - } - } - - int range = skill_get_range(sd->skillid, sd->skilllv); - if (range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - range += battle_config.pc_skill_add_range; - if (battle_config.skill_out_range_consume) - { // changed to allow casting when target walks out of range [Valaris] - if (range < distance(sd->bl.x, sd->bl.y, sd->skillx, sd->skilly)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - } - if (!skill_check_condition(sd, 1)) - { /* 使用条件チェック */ - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return; - } - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - if (battle_config.skill_out_range_consume) - { - if (range < distance(sd->bl.x, sd->bl.y, sd->skillx, sd->skilly)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - return; - } - } - - if (battle_config.pc_skill_log) - PRINTF("PC %d skill castend skill=%d\n", - sd->bl.id, sd->skillid); - pc_stop_walking(sd, 0); -} - - -/*========================================== - * スキル使用条件(偽で使用失敗) - *------------------------------------------ - */ -int skill_check_condition(struct map_session_data *sd, int type) -{ - int hp, sp, hp_rate, sp_rate, zeny, weapon, spiritball, - lv, mhp; - int index[10], itemid[10], amount[10]; - - nullpo_ret(sd); - - if (battle_config.gm_skilluncond > 0 - && pc_isGM(sd) >= battle_config.gm_skilluncond) - { - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return 1; - } - - if (bool(sd->opt1)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return 0; - } - if (pc_is90overweight(sd)) - { - clif_skill_fail(sd, sd->skillid, 9, 0); - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - return 0; - } - - if (sd->skillitem == sd->skillid) - { /* アイテムの場合無条件成功 */ - if (type & 1) - { - sd->skillitem = SkillID::NEGATIVE; - sd->skillitemlv = -1; - } - return 1; - } - if (bool(sd->opt1)) - { - clif_skill_fail(sd, sd->skillid, 0, 0); - return 0; - } - - SkillID skill = sd->skillid; - lv = sd->skilllv; - hp = skill_get_hp(skill, lv); /* 消費HP */ - sp = skill_get_sp(skill, lv); /* 消費SP */ - hp_rate = (lv <= 0) ? 0 : skill_db[skill].hp_rate[lv - 1]; - sp_rate = (lv <= 0) ? 0 : skill_db[skill].sp_rate[lv - 1]; - zeny = skill_get_zeny(skill, lv); - weapon = skill_db[skill].weapon; - spiritball = (lv <= 0) ? 0 : skill_db[skill].spiritball[lv - 1]; - mhp = skill_get_mhp(skill, lv); /* 消費HP */ - for (int i = 0; i < 10; i++) - { - itemid[i] = skill_db[skill].itemid[i]; - amount[i] = skill_db[skill].amount[i]; - } - if (mhp > 0) - hp += (sd->status.max_hp * mhp) / 100; - if (hp_rate > 0) - hp += (sd->status.hp * hp_rate) / 100; - else - hp += (sd->status.max_hp * abs(hp_rate)) / 100; - if (sp_rate > 0) - sp += (sd->status.sp * sp_rate) / 100; - else - sp += (sd->status.max_sp * abs(sp_rate)) / 100; - if (sd->dsprate != 100) - sp = sp * sd->dsprate / 100; /* 消費SP修正 */ - - if (!(type & 2)) - { - if (hp > 0 && sd->status.hp < hp) - { /* HPチェック */ - clif_skill_fail(sd, skill, 2, 0); /* HP不足:失敗通知 */ - return 0; - } - if (sp > 0 && sd->status.sp < sp) - { /* SPチェック */ - clif_skill_fail(sd, skill, 1, 0); /* SP不足:失敗通知 */ - return 0; - } - if (zeny > 0 && sd->status.zeny < zeny) - { - clif_skill_fail(sd, skill, 5, 0); - return 0; - } - if (!(weapon & (1 << sd->status.weapon))) - { - clif_skill_fail(sd, skill, 6, 0); - return 0; - } - if (spiritball > 0 && sd->spiritball < spiritball) - { - clif_skill_fail(sd, skill, 0, 0); // 氣球不足 - return 0; - } - } - - for (int i = 0; i < 10; i++) - { - index[i] = -1; - if (itemid[i] <= 0) - continue; - if (itemid[i] >= 715 && itemid[i] <= 717 - && sd->special_state.no_gemstone) - continue; - - index[i] = pc_search_inventory(sd, itemid[i]); - if (index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) - { - if (itemid[i] == 716 || itemid[i] == 717) - clif_skill_fail(sd, skill, (7 + (itemid[i] - 716)), 0); - else - clif_skill_fail(sd, skill, 0, 0); - return 0; - } - } - - if (!(type & 1)) - return 1; - - { - for (int i = 0; i < 10; i++) - { - if (index[i] >= 0) - pc_delitem(sd, index[i], amount[i], 0); // アイテム消費 - } - } - - if (type & 2) - return 1; - - pc_heal(sd, -sp, -hp); // [Fate] This might suppress some dupe messages - - if (zeny > 0) // Zeny消費 - pc_payzeny(sd, zeny); - if (spiritball > 0) // 氣球消費 - pc_delspiritball(sd, spiritball, 0); - - return 1; -} - -/*========================================== * 詠唱時間計算 *------------------------------------------ */ int skill_castfix(struct block_list *bl, int time) { - struct map_session_data *sd; struct mob_data *md; // [Valaris] eptr<struct status_change, StatusChange> sc_data; int dex; @@ -2706,12 +578,10 @@ int skill_castfix(struct block_list *bl, int time) skill = md->skillid; lv = md->skilllv; } - else { - sd = (struct map_session_data *) bl; - skill = sd->skillid; - lv = sd->skilllv; + skill = SkillID::ZERO; + lv = 0; } sc_data = battle_get_sc_data(bl); @@ -2725,10 +595,10 @@ int skill_castfix(struct block_list *bl, int time) if (time == 0) return 0; if (castnodex > 0 && bl->type == BL_PC) - castrate = ((struct map_session_data *) bl)->castrate; + castrate = 100; else if (castnodex <= 0 && bl->type == BL_PC) { - castrate = ((struct map_session_data *) bl)->castrate; + castrate = 100; time = time * castrate * (battle_config.castrate_dex_scale - dex) / (battle_config.castrate_dex_scale * @@ -2767,186 +637,10 @@ int skill_delayfix(struct block_list *bl, int time) } /*========================================== - * スキル使用(ID指定) - *------------------------------------------ - */ -int skill_use_id(struct map_session_data *sd, int target_id, - SkillID skill_num, int skill_lv) -{ - unsigned int tick; - int casttime = 0, delay = 0, range_; - int forcecast = 0; - struct block_list *bl; - eptr<struct status_change, StatusChange> sc_data; - tick = gettick(); - - nullpo_ret(sd); - - if ((bl = map_id2bl(target_id)) == NULL) - { -/* if (battle_config.error_log) - PRINTF("skill target not found %d\n",target_id); */ - return 0; - } - if (sd->bl.m != bl->m || pc_isdead(sd)) - return 0; - - sc_data = sd->sc_data; - - /* 沈黙や異常(ただし、グリムなどの判定をする) */ - if (bool(sd->opt1)) - return 0; - - if (bool(sd->status.option & Option::HIDE2)) - return 0; - - if (skill_get_inf2(skill_num) & 0x200 && sd->bl.id == target_id) - return 0; - - sd->skillid = skill_num; - sd->skilllv = skill_lv; - - if (!skill_check_condition(sd, 0)) - return 0; - - /* 射程と障害物チェック */ - range_ = skill_get_range(skill_num, skill_lv); - if (range_ < 0) - range_ = battle_get_range(&sd->bl) - (range_ + 1); - if (!battle_check_range(&sd->bl, bl, range_)) - return 0; - - pc_stopattack(sd); - - casttime = skill_castfix(&sd->bl, skill_get_cast(skill_num, skill_lv)); - delay = skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv)); - sd->state.skillcastcancel = skill_db[skill_num].castcancel; - - if (battle_config.pc_skill_log) - PRINTF("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n", - sd->bl.id, target_id, skill_num, skill_lv, casttime); - - if (casttime > 0 || forcecast) - { /* 詠唱が必要 */ - struct mob_data *md; - - /* 詠唱反応モンスター */ - if (bl->type == BL_MOB && (md = (struct mob_data *) bl) - && bool(mob_db[md->mob_class].mode & MobMode::CAST_SENSOR) - && md->state.state != MS_ATTACK - && sd->invincible_timer == -1) - { - md->target_id = sd->bl.id; - md->state.attackable = true; - md->min_chase = 13; - } - } - - if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */ - sd->state.skillcastcancel = 0; - - sd->skilltarget = target_id; - sd->skillx = 0; - sd->skilly = 0; - sd->canact_tick = tick + casttime + delay; - sd->canmove_tick = tick; - - if (casttime > 0) - { - sd->skilltimer = add_timer(tick + casttime, skill_castend_id, sd->bl.id, 0); - pc_stop_walking(sd, 0); - } - else - { - sd->skilltimer = -1; - skill_castend_id(sd->skilltimer, tick, sd->bl.id, 0); - } - - return 0; -} - -/*========================================== - * スキル使用(場所指定) - *------------------------------------------ - */ -int skill_use_pos(struct map_session_data *sd, - int skill_x, int skill_y, - SkillID skill_num, int skill_lv) -{ - struct block_list bl; - eptr<struct status_change, StatusChange> sc_data; - unsigned int tick; - int casttime = 0, delay = 0, range; - - nullpo_ret(sd); - - if (pc_isdead(sd)) - return 0; - - sc_data = sd->sc_data; - - if (bool(sd->opt1)) - return 0; - - if (bool(sd->status.option & Option::HIDE2)) - return 0; - - sd->skillid = skill_num; - sd->skilllv = skill_lv; - sd->skillx = skill_x; - sd->skilly = skill_y; - if (!skill_check_condition(sd, 0)) - return 0; - - /* 射程と障害物チェック */ - bl.type = BL_NUL; - bl.m = sd->bl.m; - bl.x = skill_x; - bl.y = skill_y; - range = skill_get_range(skill_num, skill_lv); - if (range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - if (!battle_check_range(&sd->bl, &bl, range)) - return 0; - - pc_stopattack(sd); - - casttime = skill_castfix(&sd->bl, skill_get_cast(skill_num, skill_lv)); - delay = skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv)); - sd->state.skillcastcancel = skill_db[skill_num].castcancel; - - if (battle_config.pc_skill_log) - PRINTF("PC %d skill use target_pos= (%d,%d) skill=%d lv=%d cast=%d\n", - sd->bl.id, skill_x, skill_y, - skill_num, skill_lv, casttime); - - if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */ - sd->state.skillcastcancel = 0; - - sd->skilltarget = 0; - tick = gettick(); - sd->canact_tick = tick + casttime + delay; - sd->canmove_tick = tick; - - if (casttime > 0) - { - sd->skilltimer = add_timer(tick + casttime, skill_castend_pos, sd->bl.id, 0); - pc_stop_walking(sd, 0); - } - else - { - sd->skilltimer = -1; - skill_castend_pos(sd->skilltimer, tick, sd->bl.id, 0); - } - - return 0; -} - -/*========================================== * スキル詠唱キャンセル *------------------------------------------ */ -int skill_castcancel(struct block_list *bl, int type) +int skill_castcancel(struct block_list *bl, int) { int inf; @@ -2959,25 +653,6 @@ int skill_castcancel(struct block_list *bl, int type) nullpo_ret(sd); sd->canact_tick = tick; sd->canmove_tick = tick; - if (sd->skilltimer != -1) - { - if (!type) - { - if ((inf = skill_get_inf(sd->skillid)) == 2 || inf == 32) - delete_timer(sd->skilltimer, skill_castend_pos); - else - delete_timer(sd->skilltimer, skill_castend_id); - } - else - { - if ((inf = skill_get_inf(sd->skillid_old)) == 2 || inf == 32) - delete_timer(sd->skilltimer, skill_castend_pos); - else - delete_timer(sd->skilltimer, skill_castend_id); - } - sd->skilltimer = -1; - clif_skillcastcancel(bl); - } return 0; } @@ -3026,17 +701,6 @@ void skill_devotion(struct map_session_data *md, int) } } -void skill_devotion2(struct block_list *bl, int crusader) -{ - // 被ディボーションが歩いた時の距離チェック - struct map_session_data *sd = map_id2sd(crusader); - - nullpo_retv(bl); - - if (sd) - skill_devotion3(&sd->bl, bl->id); -} - int skill_devotion3(struct block_list *bl, int target) { // クルセが歩いた時の距離チェック @@ -3063,11 +727,10 @@ int skill_devotion3(struct block_list *bl, int target) } void skill_devotion_end(struct map_session_data *md, - struct map_session_data *sd, int target) + struct map_session_data *, int target) { // クルセと被ディボキャラのリセット nullpo_retv(md); - nullpo_retv(sd); md->dev.val1[target] = md->dev.val2[target] = 0; } @@ -3077,136 +740,12 @@ int skill_gangsterparadise(struct map_session_data *, int) return 0; } -/*========================================== - * ランドプロテクターチェック(foreachinarea) - *------------------------------------------ - */ -void skill_landprotector(struct block_list *, SkillID, int *) -{ -} - -/*========================================== - * イドゥンの林檎の回復処理(foreachinarea) - *------------------------------------------ - */ -static -void skill_idun_heal(struct block_list *bl, struct skill_unit *unit) -{ - struct skill_unit_group *sg; - int heal; - - nullpo_retv(bl); - nullpo_retv(unit); - nullpo_retv(sg = unit->group); - - heal = - 30 + sg->skill_lv * 5 + ((sg->val1) >> 16) * 5 + - ((sg->val1) & 0xfff) / 2; - - if (bl->type == BL_SKILL || bl->id == sg->src_id) - return; - - if (bl->type == BL_PC || bl->type == BL_MOB) - { - battle_heal(NULL, bl, heal, 0, 0); - } -} - -/*========================================== - * 指定範囲内でsrcに対して有効なターゲットのblの数を数える(foreachinarea) - *------------------------------------------ - */ -void skill_count_target(struct block_list *bl, - struct block_list *src, int *c) -{ - nullpo_retv(bl); - - if (src == NULL) - return; - if (c == NULL) - return; - if (battle_check_target(src, bl, BCT_ENEMY) > 0) - (*c)++; -} - -/*========================================== - * トラップ範囲処理(foreachinarea) - *------------------------------------------ - */ -void skill_trap_splash(struct block_list *bl, - struct block_list *src, int tick, int splash_count) -{ - struct skill_unit *unit; - struct skill_unit_group *sg; - struct block_list *ss; - int i; - - nullpo_retv(bl); - nullpo_retv(src); - unit = (struct skill_unit *) src; - nullpo_retv(sg = unit->group); - nullpo_retv(ss = map_id2bl(sg->src_id)); - - if (battle_check_target(src, bl, BCT_ENEMY) > 0) - { - switch (sg->unit_id) - { - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x94: /* ショックウェーブトラップ */ - skill_additional_effect(ss, bl, sg->skill_id, sg->skill_lv, - BF_MISC, tick); - break; - case 0x8f: /* ブラストマイン */ - case 0x98: /* クレイモアートラップ */ - for (i = 0; i < splash_count; i++) - { - skill_attack(BF_MISC, ss, src, bl, sg->skill_id, - sg->skill_lv, tick, - (sg->val2) ? BCT_mid_x05 : BCT_ZERO); - } - // TODO: determine if this was supposed to break - FALLTHROUGH; - case 0x97: /* フリージングトラップ */ - skill_attack(BF_WEAPON, ss, src, bl, sg->skill_id, - sg->skill_lv, tick, (sg->val2) ? BCT_mid_x05 : BCT_ZERO); - break; - default: - break; - } - } -} - /*---------------------------------------------------------------------------- * ステータス異常 *---------------------------------------------------------------------------- */ /*========================================== - * ステータス異常タイマー範囲処理 - *------------------------------------------ - */ -void skill_status_change_timer_sub(struct block_list *bl, - struct block_list *src, StatusChange type, unsigned int) -{ - nullpo_retv(bl); - nullpo_retv(src); - - if (bl->type != BL_PC && bl->type != BL_MOB) - return; - - switch (type) - { - case SC_SIGHT: /* サイト */ - if (bool((*battle_get_option(bl)) & (Option::HIDE2 | Option::CLOAK))) - { - skill_status_change_end(bl, SC_HIDING, -1); - } - break; - } -} - -/*========================================== * ステータス異常終了 *------------------------------------------ */ @@ -3249,11 +788,16 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid) sc_data = battle_get_sc_data(bl); if (not sc_data) return 0; - nullpo_ret(sc_count = battle_get_sc_count(bl)); - nullpo_ret(option = battle_get_option(bl)); - nullpo_ret(opt1 = battle_get_opt1(bl)); - nullpo_ret(opt2 = battle_get_opt2(bl)); - nullpo_ret(opt3 = battle_get_opt3(bl)); + sc_count = battle_get_sc_count(bl); + nullpo_ret(sc_count); + option = battle_get_option(bl); + nullpo_ret(option); + opt1 = battle_get_opt1(bl); + nullpo_ret(opt1); + opt2 = battle_get_opt2(bl); + nullpo_ret(opt2); + opt3 = battle_get_opt3(bl); + nullpo_ret(opt3); if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) @@ -3268,7 +812,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid) switch (type) { /* 異常の種類ごとの処理 */ - case SC_HIDING: case SC_SPEEDPOTION0: /* 増速ポーション */ case SC_ATKPOT: /* attack potion [Valaris] */ case SC_MATKPOT: /* magic attack potion [Valaris] */ @@ -3291,7 +834,7 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid) struct mob_data *md = NULL; if (bl->type == BL_MOB && (md = (struct mob_data *) bl)) skill_castend_damage_id(bl, bl, - SkillID( sc_data[type].val2), sc_data[type].val1, + static_cast<SkillID>(sc_data[type].val2), sc_data[type].val1, gettick(), BCT_ZERO); } break; @@ -3357,16 +900,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, int tid) *opt2 &= ~Opt2::_atkpot; opt_flag = 1; break; - - case SC_HIDING: - *option &= ~Option::HIDE2; - opt_flag = 1; - break; - - case SC_SIGHT: - *option &= ~Option::SIGHT; - opt_flag = 1; - break; } if (night_flag == 1 @@ -3412,7 +945,7 @@ int skill_update_heal_animation(struct map_session_data *sd) */ void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom_data_t data) { - StatusChange type = StatusChange(data); + StatusChange type = static_cast<StatusChange>(data); struct block_list *bl; struct map_session_data *sd = NULL; eptr<struct status_change, StatusChange> sc_data; @@ -3446,43 +979,6 @@ void skill_status_change_timer(timer_id tid, tick_t tick, custom_id_t id, custom switch (type) { /* 特殊な処理になる場合 */ - case SC_HIDING: /* ハイディング */ - if (sd) - { /* SPがあって、時間制限の間は持続 */ - if (sd->status.sp > 0 && (--sc_data[type].val2) > 0) - { - if (sc_data[type].val2 % (sc_data[type].val1 + 3) == 0) - { - sd->status.sp--; - clif_updatestatus(sd, SP_SP); - } - sc_data[type].timer = add_timer( /* タイマー再設定 */ - 1000 + tick, - skill_status_change_timer, - bl->id, data); - return; - } - } - break; - - case SC_SIGHT: /* サイト */ - { - const int range = 7; - map_foreachinarea(std::bind(skill_status_change_timer_sub, ph::_1, bl, type, tick), - bl->m, bl->x - range, bl->y - range, - bl->x + range, bl->y + range, BL_NUL); - - if ((--sc_data[type].val2) > 0) - { - sc_data[type].timer = add_timer( /* タイマー再設定 */ - 250 + tick, - skill_status_change_timer, - bl->id, data); - return; - } - } - break; - case SC_STONE: if (sc_data[type].val2 != 0) { @@ -3642,25 +1138,28 @@ int skill_status_effect(struct block_list *bl, StatusChange type, Opt2 *opt2; Opt3 *opt3; int opt_flag = 0, calc_flag = 0; - int race, elem, undead_flag; + int undead_flag; SP updateflag = SP::ZERO; int scdef = 0; nullpo_ret(bl); - if (bl->type == BL_SKILL) - return 0; sc_data = battle_get_sc_data(bl); if (not sc_data) return 0; - nullpo_ret(sc_count = battle_get_sc_count(bl)); - nullpo_ret(option = battle_get_option(bl)); - nullpo_ret(opt1 = battle_get_opt1(bl)); - nullpo_ret(opt2 = battle_get_opt2(bl)); - nullpo_ret(opt3 = battle_get_opt3(bl)); - - race = battle_get_race(bl); + sc_count = battle_get_sc_count(bl); + nullpo_ret(sc_count); + option = battle_get_option(bl); + nullpo_ret(option); + opt1 = battle_get_opt1(bl); + nullpo_ret(opt1); + opt2 = battle_get_opt2(bl); + nullpo_ret(opt2); + opt3 = battle_get_opt3(bl); + nullpo_ret(opt3); + + Race race = battle_get_race(bl); MobMode mode = battle_get_mode(bl); - elem = battle_get_elem_type(bl); + Element elem = battle_get_elem_type(bl); undead_flag = battle_check_undead(race, elem); switch (type) @@ -3691,20 +1190,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type, if (bl->type == BL_PC) { sd = (struct map_session_data *) bl; - - if (SC_STONE <= type && type <= SC_BLIND) - { - BadSC bsc = BadSC_from_SC(type); - /* カードによる耐性 */ - if (sd && sd->reseff[bsc] > 0 - && MRAND(10000) < sd->reseff[bsc]) - { - if (battle_config.battle_log) - PRINTF("PC %d skill_sc_start: cardによる異常耐性発動\n", - sd->bl.id); - return 0; - } - } } else if (bl->type == BL_MOB) { @@ -3868,31 +1353,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type, } break; - /* option */ - case SC_HIDING: /* ハイディング */ - calc_flag = 1; - if (bl->type == BL_PC) - { - val2 = tick / 1000; /* 持続時間 */ - tick = 1000; - } - break; - - case SC_SIGHT: /* サイト/ルアフ */ - val2 = tick / 250; - tick = 10; - break; - - /* セーフティウォール、ニューマ */ - case SC_SAFETYWALL: - case SC_PNEUMA: - tick = ((struct skill_unit *) val2)->group->limit; - break; - - /* アンクル */ - case SC_ANKLE: - break; - case SC_WEIGHT50: case SC_WEIGHT90: case SC_BROKNWEAPON: @@ -3975,15 +1435,6 @@ int skill_status_effect(struct block_list *bl, StatusChange type, *opt2 |= Opt2::_slowpoison; opt_flag = 1; break; - case SC_HIDING: - battle_stopattack(bl); /* 攻撃停止 */ - *option |= Option::HIDE2; - opt_flag = 1; - break; - case SC_SIGHT: - *option |= Option::SIGHT; - opt_flag = 1; - break; } if (opt_flag) /* optionの変更 */ @@ -4032,11 +1483,16 @@ int skill_status_change_clear(struct block_list *bl, int type) sc_data = battle_get_sc_data(bl); if (not sc_data) return 0; - nullpo_ret(sc_count = battle_get_sc_count(bl)); - nullpo_ret(option = battle_get_option(bl)); - nullpo_ret(opt1 = battle_get_opt1(bl)); - nullpo_ret(opt2 = battle_get_opt2(bl)); - nullpo_ret(opt3 = battle_get_opt3(bl)); + sc_count = battle_get_sc_count(bl); + nullpo_ret(sc_count); + option = battle_get_option(bl); + nullpo_ret(option); + opt1 = battle_get_opt1(bl); + nullpo_ret(opt1); + opt2 = battle_get_opt2(bl); + nullpo_ret(opt2); + opt3 = battle_get_opt3(bl); + nullpo_ret(opt3); if (*sc_count == 0) return 0; @@ -4051,7 +1507,7 @@ int skill_status_change_clear(struct block_list *bl, int type) *opt1 = Opt1::ZERO; *opt2 = Opt2::ZERO; *opt3 = Opt3::ZERO; - *option &= Option::MASK; + *option = Option::ZERO; if (night_flag == 1 && type == 1) // by [Yor] *opt2 |= Opt2::BLIND; @@ -4062,32 +1518,6 @@ int skill_status_change_clear(struct block_list *bl, int type) return 0; } -/* クローキング検査(周りに移動不可能地帯があるか) */ -int skill_check_cloaking(struct block_list *bl) -{ - static int dx[] = { -1, 0, 1, -1, 1, -1, 0, 1 }; - static int dy[] = { -1, -1, -1, 0, 0, 1, 1, 1 }; - int end = 1, i; - - nullpo_ret(bl); - - if (bl->type == BL_PC && battle_config.pc_cloak_check_type & 1) - return 0; - if (bl->type == BL_MOB && battle_config.monster_cloak_check_type & 1) - return 0; - for (i = 0; i < sizeof(dx) / sizeof(dx[0]); i++) - { - int c = map_getcell(bl->m, bl->x + dx[i], bl->y + dy[i]); - if (c == 1 || c == 5) - end = 0; - } - if (end) - { - *battle_get_option(bl) &= ~Option::CLOAK; /* 念のための処理 */ - } - return end; -} - /* *---------------------------------------------------------------------------- * スキルユニット @@ -4105,693 +1535,8 @@ void skill_stop_dancing(struct block_list *, int) // TODO remove this } -/*========================================== - * スキルユニット初期化 - *------------------------------------------ - */ -struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, - int x, int y) -{ - struct skill_unit *unit; - - nullpo_retr(NULL, group); - nullpo_retr(NULL, unit = &group->unit[idx]); - - if (!unit->alive) - group->alive_count++; - - unit->bl.id = map_addobject(&unit->bl); - unit->bl.type = BL_SKILL; - unit->bl.m = group->map; - unit->bl.x = x; - unit->bl.y = y; - unit->group = group; - unit->val1 = unit->val2 = 0; - unit->alive = 1; - - map_addblock(&unit->bl); - return unit; -} - void skill_unit_timer_sub_ondelete(struct block_list *bl, struct block_list *src, unsigned int tick); -/*========================================== - * スキルユニット削除 - *------------------------------------------ - */ -int skill_delunit(struct skill_unit *unit) -{ - struct skill_unit_group *group; - int range; - - nullpo_ret(unit); - if (!unit->alive) - return 0; - nullpo_ret(group = unit->group); - - /* onlimitイベント呼び出し */ - skill_unit_onlimit(unit, gettick()); - - /* ondeleteイベント呼び出し */ - range = group->range; - map_foreachinarea(std::bind(skill_unit_timer_sub_ondelete, ph::_1, &unit->bl, gettick()), - unit->bl.m, unit->bl.x - range, unit->bl.y - range, - unit->bl.x + range, unit->bl.y + range, BL_NUL); - - unit->group = NULL; - unit->alive = 0; - map_delobjectnofree(unit->bl.id, BL_SKILL); - if (group->alive_count > 0 && (--group->alive_count) <= 0) - skill_delunitgroup(group); - - return 0; -} - -/*========================================== - * スキルユニットグループ初期化 - *------------------------------------------ - */ -static -int skill_unit_group_newid = 10; -struct skill_unit_group *skill_initunitgroup(struct block_list *src, - int count, SkillID skillid, int skilllv, int unit_id) -{ - int i; - struct skill_unit_group *group = NULL, *list = NULL; - int maxsug = 0; - - nullpo_retr(NULL, src); - - if (src->type == BL_PC) - { - list = ((struct map_session_data *) src)->skillunit; - maxsug = MAX_SKILLUNITGROUP; - } - else if (src->type == BL_MOB) - { - list = ((struct mob_data *) src)->skillunit; - maxsug = MAX_MOBSKILLUNITGROUP; - } - if (list) - { - for (i = 0; i < maxsug; i++) /* 空いているもの検索 */ - if (list[i].group_id == 0) - { - group = &list[i]; - break; - } - - if (group == NULL) - { /* 空いてないので古いもの検索 */ - int j = 0; - unsigned maxdiff = 0, x, tick = gettick(); - for (i = 0; i < maxsug; i++) - if ((x = DIFF_TICK(tick, list[i].tick)) > maxdiff) - { - maxdiff = x; - j = i; - } - skill_delunitgroup(&list[j]); - group = &list[j]; - } - } - - if (group == NULL) - { - PRINTF("skill_initunitgroup: error unit group !\n"); - exit(1); - } - - group->src_id = src->id; - group->party_id = battle_get_party_id(src); - group->group_id = skill_unit_group_newid++; - if (skill_unit_group_newid <= 0) - skill_unit_group_newid = 10; - CREATE(group->unit, struct skill_unit, count); - group->unit_count = count; - group->val1 = group->val2 = 0; - group->skill_id = skillid; - group->skill_lv = skilllv; - group->unit_id = unit_id; - group->map = src->m; - group->range = 0; - group->limit = 10000; - group->interval = 1000; - group->tick = gettick(); - group->valstr = NULL; - - return group; -} - -/*========================================== - * スキルユニットグループ削除 - *------------------------------------------ - */ -int skill_delunitgroup(struct skill_unit_group *group) -{ - int i; - - nullpo_ret(group); - if (group->unit_count <= 0) - return 0; - - group->alive_count = 0; - if (group->unit != NULL) - { - for (i = 0; i < group->unit_count; i++) - if (group->unit[i].alive) - skill_delunit(&group->unit[i]); - } - if (group->valstr != NULL) - { - map_freeblock(group->valstr); - group->valstr = NULL; - } - - map_freeblock(group->unit); /* free()の替わり */ - group->unit = NULL; - group->src_id = 0; - group->group_id = 0; - group->unit_count = 0; - return 0; -} - -/*========================================== - * スキルユニットグループ全削除 - *------------------------------------------ - */ -int skill_clear_unitgroup(struct block_list *src) -{ - struct skill_unit_group *group = NULL; - int maxsug = 0; - - nullpo_ret(src); - - if (src->type == BL_PC) - { - group = ((struct map_session_data *) src)->skillunit; - maxsug = MAX_SKILLUNITGROUP; - } - else if (src->type == BL_MOB) - { - group = ((struct mob_data *) src)->skillunit; - maxsug = MAX_MOBSKILLUNITGROUP; - } - if (group) - { - int i; - for (i = 0; i < maxsug; i++) - if (group[i].group_id > 0 && group[i].src_id == src->id) - skill_delunitgroup(&group[i]); - } - return 0; -} - -/*========================================== - * スキルユニットグループの被影響tick検索 - *------------------------------------------ - */ -struct skill_unit_group_tickset *skill_unitgrouptickset_search( - struct block_list *bl, int group_id) -{ - int i, j = 0, k, s = group_id % MAX_SKILLUNITGROUPTICKSET; - struct skill_unit_group_tickset *set = NULL; - - nullpo_ret(bl); - - if (bl->type == BL_PC) - { - set = ((struct map_session_data *) bl)->skillunittick; - } - else - { - set = ((struct mob_data *) bl)->skillunittick; - } - if (set == NULL) - return 0; - for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++) - if (set[(k = (i + s) % MAX_SKILLUNITGROUPTICKSET)].group_id == - group_id) - return &set[k]; - else if (set[k].group_id == 0) - j = k; - - return &set[j]; -} - -/*========================================== - * スキルユニットグループの被影響tick削除 - *------------------------------------------ - */ -int skill_unitgrouptickset_delete(struct block_list *bl, int group_id) -{ - int i, s = group_id % MAX_SKILLUNITGROUPTICKSET; - struct skill_unit_group_tickset *set = NULL, *ts; - - nullpo_ret(bl); - - if (bl->type == BL_PC) - { - set = ((struct map_session_data *) bl)->skillunittick; - } - else - { - set = ((struct mob_data *) bl)->skillunittick; - } - - if (set != NULL) - { - - for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++) - if ((ts = - &set[(i + s) % MAX_SKILLUNITGROUPTICKSET])->group_id == - group_id) - ts->group_id = 0; - - } - return 0; -} - -/*========================================== - * スキルユニットタイマー発動処理用(foreachinarea) - *------------------------------------------ - */ -static -void skill_unit_timer_sub_onplace(struct block_list *bl, - struct block_list *src, unsigned int tick) -{ - struct skill_unit *su; - - nullpo_retv(bl); - - su = (struct skill_unit *) src; - - if (su && su->alive) - { - struct skill_unit_group *sg; - sg = su->group; - if (sg && battle_check_target(src, bl, sg->target_flag) > 0) - skill_unit_onplace(su, bl, tick); - } -} - -/*========================================== - * スキルユニットタイマー削除処理用(foreachinarea) - *------------------------------------------ - */ -void skill_unit_timer_sub_ondelete(struct block_list *bl, - struct block_list *src, unsigned int tick) -{ - struct skill_unit *su; - - nullpo_retv(bl); - - su = (struct skill_unit *) src; - - if (su && su->alive) - { - struct skill_unit_group *sg; - sg = su->group; - if (sg && battle_check_target(src, bl, sg->target_flag) > 0) - skill_unit_ondelete(su, bl, tick); - } -} - -/*========================================== - * スキルユニットタイマー処理用(foreachobject) - *------------------------------------------ - */ -static -void skill_unit_timer_sub(struct block_list *bl, unsigned int tick) -{ - struct skill_unit *unit; - struct skill_unit_group *group; - int range; - - nullpo_retv(bl); - unit = (struct skill_unit *) bl; - nullpo_retv(group = unit->group); - - if (!unit->alive) - return; - - range = (unit->range != 0) ? unit->range : group->range; - - /* onplaceイベント呼び出し */ - if (unit->alive && unit->range >= 0) - { - map_foreachinarea(std::bind(skill_unit_timer_sub_onplace, ph::_1, bl, tick), - bl->m, bl->x - range, bl->y - range, - bl->x + range, bl->y + range, BL_NUL); - if (group->unit_id == 0xaa - && DIFF_TICK(tick, group->tick) >= 6000 * group->val2) - { - map_foreachinarea(std::bind(skill_idun_heal, ph::_1, unit), - bl->m, bl->x - range, bl->y - range, - bl->x + range, bl->y + range, BL_NUL); - group->val2++; - } - } - /* 時間切れ削除 */ - if (unit->alive && - (DIFF_TICK(tick, group->tick) >= group->limit - || DIFF_TICK(tick, group->tick) >= unit->limit)) - { - switch (group->unit_id) - { - - case 0x8f: /* ブラストマイン */ - group->unit_id = 0x8c; - clif_changelook(bl, LOOK_BASE, group->unit_id); - group->limit = DIFF_TICK(tick + 1500, group->tick); - unit->limit = DIFF_TICK(tick + 1500, group->tick); - break; - case 0x90: /* スキッドトラップ */ - case 0x91: /* アンクルスネア */ - case 0x93: /* ランドマイン */ - case 0x94: /* ショックウェーブトラップ */ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x97: /* フリージングトラップ */ - case 0x98: /* クレイモアートラップ */ - case 0x99: /* トーキーボックス */ - { - struct block_list *src = map_id2bl(group->src_id); - if (group->unit_id == 0x91 && group->val2) - ; - else - { - if (src && src->type == BL_PC) - { - struct item item_tmp; - memset(&item_tmp, 0, sizeof(item_tmp)); - item_tmp.nameid = 1065; - item_tmp.identify = 1; - map_addflooritem(&item_tmp, 1, bl->m, bl->x, bl->y, NULL, NULL, NULL, 0); // 罠返還 - } - } - } - // TODO: determine if this was supposed to be break - FALLTHROUGH; - default: - skill_delunit(unit); - } - } - - if (group->unit_id == 0x8d) - { - unit->val1 -= 5; - if (unit->val1 <= 0 && unit->limit + group->tick > tick + 700) - unit->limit = DIFF_TICK(tick + 700, group->tick); - } -} - -/*========================================== - * スキルユニットタイマー処理 - *------------------------------------------ - */ -static -void skill_unit_timer(timer_id, tick_t tick, custom_id_t, custom_data_t) -{ - map_freeblock_lock(); - - map_foreachobject(std::bind(skill_unit_timer_sub, ph::_1, tick), BL_SKILL); - - map_freeblock_unlock(); -} - -/*========================================== - * スキルユニット移動時処理用(foreachinarea) - *------------------------------------------ - */ -static -void skill_unit_out_all_sub(struct block_list *bl, - struct block_list *src, unsigned int tick) -{ - struct skill_unit *unit; - struct skill_unit_group *group; - int range; - - nullpo_retv(bl); - nullpo_retv(src); - unit = (struct skill_unit *) bl; - nullpo_retv(group = unit->group); - - if (!unit->alive || src->prev == NULL) - return; - - range = (unit->range != 0) ? unit->range : group->range; - - if (range < 0 || battle_check_target(bl, src, group->target_flag) <= 0) - return; - - if (src->x >= bl->x - range && src->x <= bl->x + range && - src->y >= bl->y - range && src->y <= bl->y + range) - skill_unit_onout(unit, src, tick); -} - -/*========================================== - * スキルユニット移動時処理 - *------------------------------------------ - */ -int skill_unit_out_all(struct block_list *bl, unsigned int tick, int range) -{ - nullpo_ret(bl); - - if (bl->prev == NULL) - return 0; - - if (range < 7) - range = 7; - map_foreachinarea(std::bind(skill_unit_out_all_sub, ph::_1, bl, tick), - bl->m, bl->x - range, bl->y - range, - bl->x + range, bl->y + range, BL_SKILL); - - return 0; -} - -/*========================================== - * スキルユニット移動時処理用(foreachinarea) - *------------------------------------------ - */ -static -void skill_unit_move_sub(struct block_list *bl, - struct block_list *src, unsigned int tick) -{ - struct skill_unit *unit; - struct skill_unit_group *group; - int range; - - nullpo_retv(bl); - nullpo_retv(unit = (struct skill_unit *) bl); - nullpo_retv(src); - - if (!unit->alive || src->prev == NULL) - return; - - if ((group = unit->group) == NULL) - return; - range = (unit->range != 0) ? unit->range : group->range; - - if (range < 0 || battle_check_target(bl, src, group->target_flag) <= 0) - return; - - if (src->x >= bl->x - range && src->x <= bl->x + range && - src->y >= bl->y - range && src->y <= bl->y + range) - skill_unit_onplace(unit, src, tick); - else - skill_unit_onout(unit, src, tick); -} - -/*========================================== - * スキルユニット移動時処理 - *------------------------------------------ - */ -int skill_unit_move(struct block_list *bl, unsigned int tick, int range) -{ - nullpo_ret(bl); - - if (bl->prev == NULL) - return 0; - - if (range < 7) - range = 7; - map_foreachinarea(std::bind(skill_unit_move_sub, ph::_1, bl, tick), - bl->m, bl->x - range, bl->y - range, - bl->x + range, bl->y + range, BL_SKILL); - - return 0; -} - -/*========================================== - * スキルユニット自体の移動時処理(foreachinarea) - *------------------------------------------ - */ -static -void skill_unit_move_unit_group_sub(struct block_list *bl, - struct block_list *src, unsigned int tick) -{ - struct skill_unit *unit; - struct skill_unit_group *group; - int range; - - nullpo_retv(bl); - nullpo_retv(src); - unit = (struct skill_unit *) src; - nullpo_retv(group = unit->group); - - if (!unit->alive || bl->prev == NULL) - return; - - range = (unit->range != 0) ? unit->range : group->range; - - if (range < 0 || battle_check_target(src, bl, group->target_flag) <= 0) - return; - if (bl->x >= src->x - range && bl->x <= src->x + range && - bl->y >= src->y - range && bl->y <= src->y + range) - skill_unit_onplace(unit, bl, tick); - else - skill_unit_onout(unit, bl, tick); -} - -/*========================================== - * スキルユニット自体の移動時処理 - * 引数はグループと移動量 - *------------------------------------------ - */ -int skill_unit_move_unit_group(struct skill_unit_group *group, int m, int dx, - int dy) -{ - nullpo_ret(group); - - if (group->unit_count <= 0) - return 0; - - if (group->unit != NULL) - { - if (!battle_config.unit_movement_type) - { - int i; - for (i = 0; i < group->unit_count; i++) - { - struct skill_unit *unit = &group->unit[i]; - if (unit->alive && !(m == unit->bl.m && dx == 0 && dy == 0)) - { - int range = unit->range; - map_delblock(&unit->bl); - unit->bl.m = m; - unit->bl.x += dx; - unit->bl.y += dy; - map_addblock(&unit->bl); - if (range > 0) - { - if (range < 7) - range = 7; - map_foreachinarea(std::bind(skill_unit_move_unit_group_sub, ph::_1, &unit->bl, gettick()), - unit->bl.m, unit->bl.x - range, unit->bl.y - range, - unit->bl.x + range, unit->bl.y + range, BL_NUL); - } - } - } - } - else - { - int i, j, *r_flag, *s_flag, *m_flag; - struct skill_unit *unit1; - struct skill_unit *unit2; - r_flag = (int *) malloc(sizeof(int) * group->unit_count); - s_flag = (int *) malloc(sizeof(int) * group->unit_count); - m_flag = (int *) malloc(sizeof(int) * group->unit_count); - memset(r_flag, 0, sizeof(int) * group->unit_count); // 継承フラグ - memset(s_flag, 0, sizeof(int) * group->unit_count); // 継承フラグ - memset(m_flag, 0, sizeof(int) * group->unit_count); // 継承フラグ - - //先にフラグを全部決める - for (i = 0; i < group->unit_count; i++) - { - int move_check = 0; // かぶりフラグ - unit1 = &group->unit[i]; - for (j = 0; j < group->unit_count; j++) - { - unit2 = &group->unit[j]; - if (unit1->bl.m == m && unit1->bl.x + dx == unit2->bl.x - && unit1->bl.y + dy == unit2->bl.y) - { - //移動先にユニットがかぶってたら - s_flag[i] = 1; // 移動前のユニットナンバーの継承フラグon - r_flag[j] = 1; // かぶるユニットナンバーの残留フラグon - move_check = 1; //ユニットがかぶった。 - break; - } - } - if (!move_check) // ユニットがかぶってなかったら - m_flag[i] = 1; // 移動前ユニットナンバーの移動フラグon - } - - //フラグに基づいてユニット移動 - for (i = 0; i < group->unit_count; i++) - { - unit1 = &group->unit[i]; - if (m_flag[i]) - { // 移動フラグがonで - if (!r_flag[i]) - { // 残留フラグがoffなら - //単純移動(rangeも継承の必要無し) - int range = unit1->range; - map_delblock(&unit1->bl); - unit1->bl.m = m; - unit1->bl.x += dx; - unit1->bl.y += dy; - map_addblock(&unit1->bl); - if (range > 0) - { - if (range < 7) - range = 7; - map_foreachinarea(std::bind(skill_unit_move_unit_group_sub, ph::_1, &unit1->bl, gettick()), - - unit1->bl.m, unit1->bl.x - range, unit1->bl.y - range, - unit1->bl.x + range, unit1->bl.y + range, BL_NUL); - } - } - else - { // 残留フラグがonなら - //空ユニットになるので、継承可能なユニットを探す - for (j = 0; j < group->unit_count; j++) - { - unit2 = &group->unit[j]; - if (s_flag[j] && !r_flag[j]) - { - // 継承移動(range継承付き) - int range = unit1->range; - map_delblock(&unit2->bl); - unit2->bl.m = m; - unit2->bl.x = unit1->bl.x + dx; - unit2->bl.y = unit1->bl.y + dy; - unit2->range = unit1->range; - map_addblock(&unit2->bl); - if (range > 0) - { - if (range < 7) - range = 7; - map_foreachinarea(std::bind(skill_unit_move_unit_group_sub, ph::_1, &unit2->bl, gettick()), - - unit2->bl.m, unit2->bl.x - range, unit2->bl.y - range, - unit2->bl.x + range, unit2->bl.y + range, BL_NUL); - } - s_flag[j] = 0; // 継承完了したのでoff - break; - } - } - } - } - } - free(r_flag); - free(s_flag); - free(m_flag); - } - } - return 0; -} /*---------------------------------------------------------------------------- * アイテム合成 @@ -4904,28 +1649,12 @@ int skill_readdb(void) skill_db[i].castcancel = 1; else skill_db[i].castcancel = 0; - skill_db[i].cast_def_rate = atoi(split[9]); - skill_db[i].inf2 = atoi(split[10]); - skill_db[i].maxcount = atoi(split[11]); - if (strcasecmp(split[13], "weapon") == 0) - skill_db[i].skill_type = BF_WEAPON; - else if (strcasecmp(split[12], "magic") == 0) - skill_db[i].skill_type = BF_MAGIC; - else if (strcasecmp(split[12], "misc") == 0) - skill_db[i].skill_type = BF_MISC; - else - skill_db[i].skill_type = BF::ZERO; + skill_db[i].cast_def_rate = atoi(split[10]); + skill_db[i].inf2 = atoi(split[11]); + skill_db[i].maxcount = atoi(split[12]); + // split[13] was one of: BF_WEAPON, BF_MAGIC, BF_MISC, BF::ZERO memset(split2, 0, sizeof(split2)); - for (j = 0, p = split[14]; j < MAX_SKILL_LEVEL && p; j++) - { - split2[j] = p; - p = strchr(p, ':'); - if (p) - *p++ = 0; - } - for (k = 0; k < MAX_SKILL_LEVEL; k++) - skill_db[i].blewcount[k] = - (split2[k]) ? atoi(split2[k]) : atoi(split2[0]); + // split[14] was colon-separated blow counts. if (!strcasecmp(split[15], "passive")) { @@ -4981,9 +1710,6 @@ int do_init_skill(void) { skill_readdb(); - add_timer_interval(gettick() + SKILLUNITTIMER_INVERVAL, - skill_unit_timer, 0, 0, SKILLUNITTIMER_INVERVAL); - return 0; } |