diff options
Diffstat (limited to 'src/map/skill.c')
-rw-r--r-- | src/map/skill.c | 164 |
1 files changed, 103 insertions, 61 deletions
diff --git a/src/map/skill.c b/src/map/skill.c index 72363b9e3..dc3ebe62e 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2088,7 +2088,7 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in switch (target->type) { case BL_MOB: { struct mob_data* md = BL_CAST(BL_MOB, target); - if( md->class_ == MOBID_EMPERIUM ) + if (md->class_ == MOBID_EMPELIUM) return 0; if(src != target && is_boss(target)) // Bosses can't be knocked-back return 0; @@ -3032,7 +3032,7 @@ int skill_check_unit_range2_sub (struct block_list *bl, va_list ap) { if( skill_id == HP_BASILICA && bl->type == BL_PC ) return 0; - if( skill_id == AM_DEMONSTRATION && bl->type == BL_MOB && ((TBL_MOB*)bl)->class_ == MOBID_EMPERIUM ) + if (skill_id == AM_DEMONSTRATION && bl->type == BL_MOB && ((TBL_MOB*)bl)->class_ == MOBID_EMPELIUM) return 0; //Allow casting Bomb/Demonstration Right under emperium [Skotlex] return 1; } @@ -4999,15 +4999,13 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) { break; } - if( ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB ) - { - if( ((TBL_MOB*)target)->class_ == MOBID_EMPERIUM ) + if (ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB) { + if (((TBL_MOB*)target)->class_ == MOBID_EMPELIUM) break; - } - else if (inf && battle->check_target(src, target, inf) <= 0){ + } else if (inf && battle->check_target(src, target, inf) <= 0) { if (sd) clif->skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0); break; - } else if( ud->skill_id == RK_PHANTOMTHRUST && target->type != BL_MOB ) { + } else if (ud->skill_id == RK_PHANTOMTHRUST && target->type != BL_MOB) { if( !map_flag_vs(src->m) && battle->check_target(src,target,BCT_PARTY) <= 0 ) break; // You can use Phantom Thurst on party members in normal maps too. [pakpil] } @@ -5404,7 +5402,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if (skill_id == AB_HIGHNESSHEAL) { heal = heal * (17 + 3 * skill_lv) / 10; } - if (status->isimmune(bl) || (dstmd && (dstmd->class_ == MOBID_EMPERIUM || mob_is_battleground(dstmd)))) + if (status->isimmune(bl) || (dstmd != NULL && (dstmd->class_ == MOBID_EMPELIUM || mob_is_battleground(dstmd)))) heal = 0; if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.sex == 0) @@ -5650,7 +5648,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; } - class_ = skill_id==SA_MONOCELL?1002:mob->get_random_id(4, 1, 0); + class_ = skill_id == SA_MONOCELL ? MOBID_PORING : mob->get_random_id(4, 1, 0); clif->skill_nodamage(src,bl,skill_id,skill_lv,1); mob->class_change(dstmd,class_); if( tsc && dstmd->status.mode&MD_BOSS ) @@ -6652,7 +6650,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; } - if( dstmd && dstmd->class_ == MOBID_EMPERIUM ) + if (dstmd && dstmd->class_ == MOBID_EMPELIUM) break; // Cannot be Used on Emperium clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); @@ -6845,7 +6843,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin { int i,sp = 0; int64 hp = 0; - if( dstmd && dstmd->class_ == MOBID_EMPERIUM ) { + if (dstmd && dstmd->class_ == MOBID_EMPELIUM) { map->freeblock_unlock(); return 1; } @@ -7622,7 +7620,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin // Slim Pitcher case CR_SLIMPITCHER: // Updated to block Slim Pitcher from working on barricades and guardian stones. - if (dstmd && (dstmd->class_ == MOBID_EMPERIUM || (dstmd->class_ >= MOBID_BARRICADE1 && dstmd->class_ <= MOBID_GUARDIAN_STONE2))) + if (dstmd != NULL && (dstmd->class_ == MOBID_EMPELIUM || (dstmd->class_ >= MOBID_BARRICADE && dstmd->class_ <= MOBID_S_EMPEL_2))) break; if (script->potion_hp || script->potion_sp) { int hp = script->potion_hp, sp = script->potion_sp; @@ -7702,8 +7700,8 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin map->freeblock_unlock(); return 0; } - if (rnd() % 100 > skill_lv * 8 || (dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPERIUM) || mob_is_battleground(dstmd)))) { - if (sd) + if (rnd() % 100 > skill_lv * 8 || (dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPELIUM) || mob_is_battleground(dstmd)))) { + if (sd != NULL) clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); map->freeblock_unlock(); @@ -8740,7 +8738,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin { if( bl->type != BL_MOB ) break; md = map->id2md(bl->id); - if( md && md->class_ >= MOBID_SILVERSNIPER && md->class_ <= MOBID_MAGICDECOY_WIND ) + if (md && md->class_ >= MOBID_SILVERSNIPER && md->class_ <= MOBID_MAGICDECOY_WIND) status_kill(bl); clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); } @@ -9425,13 +9423,17 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if( !sd->ed ) break; - switch(sd->ed->db->class_){ - case 2115:case 2124: - case 2118:case 2121: + switch (sd->ed->db->class_) { + case ELEID_EL_AGNI_M: + case ELEID_EL_AQUA_M: + case ELEID_EL_VENTUS_M: + case ELEID_EL_TERA_M: duration = 6000; break; - case 2116:case 2119: - case 2122:case 2125: + case ELEID_EL_AGNI_L: + case ELEID_EL_AQUA_L: + case ELEID_EL_VENTUS_L: + case ELEID_EL_TERA_L: duration = 9000; break; } @@ -9632,7 +9634,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin if(sd) { struct mob_data *summon_md; - summon_md = mob->once_spawn_sub(src, src->m, src->x, src->y, status->get_name(src), 2308, "", SZ_SMALL, AI_NONE); + summon_md = mob->once_spawn_sub(src, src->m, src->x, src->y, status->get_name(src), MOBID_KO_KAGE, "", SZ_SMALL, AI_NONE); if( summon_md ) { summon_md->master_id = src->id; summon_md->special_state.ai = AI_ZANZOU; @@ -9794,18 +9796,27 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin break; case MH_SUMMON_LEGION: { - int summons[5] = {1004, 1303, 1303, 1994, 1994}; - int qty[5] = {3 , 3 , 4 , 4 , 5}; - struct mob_data *summon_md; + struct { + int mob_id; + int quantity; + } summons[5] = { + { MOBID_HORNET, 3 }, + { MOBID_GIANT_HONET, 3 }, + { MOBID_GIANT_HONET, 4 }, + { MOBID_LUCIOLA_VESPA, 4 }, + { MOBID_LUCIOLA_VESPA, 5 }, + }; int i, dummy = 0; + Assert_retb(skill_lv < ARRAYLENGTH(summons)); - i = map->foreachinmap(skill->check_condition_mob_master_sub, src->m, BL_MOB, src->id, summons[skill_lv-1], skill_id, &dummy); - if(i >= qty[skill_lv-1]) + i = map->foreachinmap(skill->check_condition_mob_master_sub, src->m, BL_MOB, src->id, summons[skill_lv-1].mob_id, skill_id, &dummy); + if(i >= summons[skill_lv-1].quantity) break; - for(i=0; i<qty[skill_lv - 1]; i++){ //easy way - summon_md = mob->once_spawn_sub(src, src->m, src->x, src->y, status->get_name(src), summons[skill_lv - 1], "", SZ_SMALL, AI_ATTACK); - if (summon_md) { + for (i = 0; i < summons[skill_lv-1].quantity; i++) { + struct mob_data *summon_md = mob->once_spawn_sub(src, src->m, src->x, src->y, status->get_name(src), + summons[skill_lv-1].mob_id, "", SZ_SMALL, AI_ATTACK); + if (summon_md != NULL) { summon_md->master_id = src->id; if (summon_md->deletetimer != INVALID_TIMER) timer->delete(summon_md->deletetimer, mob->timer_delete); @@ -10522,10 +10533,20 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case AM_SPHEREMINE: case AM_CANNIBALIZE: { - int summons[5] = { 1589, 1579, 1575, 1555, 1590 }; - //int summons[5] = { 1020, 1068, 1118, 1500, 1368 }; - int class_ = skill_id==AM_SPHEREMINE?1142:summons[skill_lv-1]; struct mob_data *md; + int class_ = 0; + if (skill_id == AM_SPHEREMINE) { + class_ = MOBID_MARINE_SPHERE; + } else { + Assert_retb(skill_lv > 0 && skill_lv <= 5); + switch (skill_lv) { + case 1: class_ = MOBID_G_MANDRAGORA; break; + case 2: class_ = MOBID_G_HYDRA; break; + case 3: class_ = MOBID_G_FLORA; break; + case 4: class_ = MOBID_G_PARASITE; break; + case 5: class_ = MOBID_G_GEOGRAPHER; break; + } + } // Correct info, don't change any of this! [Celest] md = mob->once_spawn_sub(src, src->m, x, y, status->get_name(src), class_, "", SZ_SMALL, AI_NONE); @@ -10626,7 +10647,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui if (rnd()%100 < 50) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } else { - TBL_MOB* md = mob->once_spawn_sub(src, src->m, x, y, "--ja--",(skill_lv < 2 ? 1084+rnd()%2 : 1078+rnd()%6),"", SZ_SMALL, AI_NONE); + int mob_id = skill_lv < 2 ? MOBID_BLACK_MUSHROOM + rnd()%2 : MOBID_RED_PLANT + rnd()%6; + TBL_MOB* md = mob->once_spawn_sub(src, src->m, x, y, "--ja--", mob_id, "", SZ_SMALL, AI_NONE); int i; if (!md) break; if ((i = skill->get_time(skill_id, skill_lv)) > 0) @@ -10771,11 +10793,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case NC_SILVERSNIPER: { - int class_ = 2042; - struct mob_data *md; - - md = mob->once_spawn_sub(src, src->m, x, y, status->get_name(src), class_, "", SZ_SMALL, AI_NONE); - if( md ) { + struct mob_data *md = mob->once_spawn_sub(src, src->m, x, y, status->get_name(src), MOBID_SILVERSNIPER, "", SZ_SMALL, AI_NONE); + if (md) { md->master_id = src->id; md->special_state.ai = AI_FLORA; if( md->deletetimer != INVALID_TIMER ) @@ -11910,7 +11929,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 int heal = skill->calc_heal(ss,bl,sg->skill_id,sg->skill_lv,true); struct mob_data *md = BL_CAST(BL_MOB, bl); #ifdef RENEWAL - if (md && md->class_ == MOBID_EMPERIUM) + if (md != NULL && md->class_ == MOBID_EMPELIUM) break; #endif if (md && mob_is_battleground(md)) @@ -12132,7 +12151,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 int heal; #ifdef RENEWAL struct mob_data *md = BL_CAST(BL_MOB, bl); - if (md && md->class_ == MOBID_EMPERIUM) + if (md && md->class_ == MOBID_EMPELIUM) break; #endif if ((sg->src_id == bl->id && !(tsc && tsc->data[SC_SOULLINK] && tsc->data[SC_SOULLINK]->val2 == SL_BARDDANCER)) @@ -13666,7 +13685,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id case SR_CURSEDCIRCLE: if (map_flag_gvg2(sd->bl.m)) { if (map->foreachinrange(mob->count_sub, &sd->bl, skill->get_splash(skill_id, skill_lv), BL_MOB, - MOBID_EMPERIUM, MOBID_GUARDIAN_STONE1, MOBID_GUARDIAN_STONE2)) { + MOBID_EMPELIUM, MOBID_S_EMPEL_1, MOBID_S_EMPEL_2)) { char output[128]; sprintf(output, "You're too close to a stone or emperium to do this skill"); /* TODO official response? or message.conf it */ clif->messagecolor_self(sd->fd, COLOR_RED, output); @@ -14023,10 +14042,22 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, case AM_CANNIBALIZE: case AM_SPHEREMINE: { int c=0; - int summons[5] = { 1589, 1579, 1575, 1555, 1590 }; - //int summons[5] = { 1020, 1068, 1118, 1500, 1368 }; - int maxcount = (skill_id==AM_CANNIBALIZE)? 6-skill_lv : skill->get_maxcount(skill_id,skill_lv); - int mob_class = (skill_id==AM_CANNIBALIZE)? summons[skill_lv-1] :1142; + int maxcount = 0; + int mob_class = 0; + if (skill_id == AM_CANNIBALIZE) { + Assert_retb(skill_lv > 0 && skill_lv <= 5); + maxcount = 6-skill_lv; + switch (skill_lv) { + case 1: mob_class = MOBID_G_MANDRAGORA; break; + case 2: mob_class = MOBID_G_HYDRA; break; + case 3: mob_class = MOBID_G_FLORA; break; + case 4: mob_class = MOBID_G_PARASITE; break; + case 5: mob_class = MOBID_G_GEOGRAPHER; break; + } + } else { + maxcount = skill->get_maxcount(skill_id,skill_lv); + mob_class = MOBID_MARINE_SPHERE; + } if(battle_config.land_skill_limit && maxcount>0 && (battle_config.land_skill_limit&BL_PC)) { i = map->foreachinmap(skill->check_condition_mob_master_sub ,sd->bl.m, BL_MOB, sd->bl.id, mob_class, skill_id, &c); if( c >= maxcount @@ -14043,17 +14074,15 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, case NC_MAGICDECOY: { int c = 0; int maxcount = skill->get_maxcount(skill_id,skill_lv); - int mob_class = 2042; - if( skill_id == NC_MAGICDECOY ) - mob_class = 2043; if( battle_config.land_skill_limit && maxcount > 0 && ( battle_config.land_skill_limit&BL_PC ) ) { - if( skill_id == NC_MAGICDECOY ) { + if (skill_id == NC_MAGICDECOY) { int j; - for(j = mob_class; j <= 2046; j++) + for (j = MOBID_MAGICDECOY_FIRE; j <= MOBID_MAGICDECOY_WIND; j++) map->foreachinmap(skill->check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, j, skill_id, &c); - } else - map->foreachinmap(skill->check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, mob_class, skill_id, &c); + } else { + map->foreachinmap(skill->check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, MOBID_SILVERSNIPER, skill_id, &c); + } if( c >= maxcount ) { clif->skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); return 0; @@ -14063,7 +14092,7 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, break; case KO_ZANZOU: { int c = 0; - i = map->foreachinmap(skill->check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, 2308, skill_id, &c); + i = map->foreachinmap(skill->check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, MOBID_KO_KAGE, skill_id, &c); if( c >= skill->get_maxcount(skill_id,skill_lv) || c != i) { clif->skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); return 0; @@ -17588,7 +17617,7 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) { } int skill_magicdecoy(struct map_session_data *sd, int nameid) { - int x, y, i, class_, skill_id; + int x, y, i, class_ = 0, skill_id; struct mob_data *md; nullpo_ret(sd); skill_id = sd->menuskill_val; @@ -17608,7 +17637,20 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid) { sd->sc.comet_x = sd->sc.comet_y = 0; sd->menuskill_val = 0; - class_ = (nameid == ITEMID_BOODY_RED || nameid == ITEMID_CRYSTAL_BLUE) ? 2043 + nameid - ITEMID_BOODY_RED : (nameid == ITEMID_WIND_OF_VERDURE) ? 2046 : 2045; + switch (nameid) { + case ITEMID_BOODY_RED: + class_ = MOBID_MAGICDECOY_FIRE; + break; + case ITEMID_CRYSTAL_BLUE: + class_ = MOBID_MAGICDECOY_WATER; + break; + case ITEMID_WIND_OF_VERDURE: + class_ = MOBID_MAGICDECOY_WIND; + break; + case ITEMID_YELLOW_LIVE: + class_ = MOBID_MAGICDECOY_EARTH; + break; + } md = mob->once_spawn_sub(&sd->bl, sd->bl.m, x, y, sd->status.name, class_, "", SZ_SMALL, AI_NONE); if( md ) { @@ -18532,11 +18574,11 @@ int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) { int skill_get_elemental_type( uint16 skill_id , uint16 skill_lv ) { int type = 0; - switch( skill_id ) { - case SO_SUMMON_AGNI: type = 2114; break; - case SO_SUMMON_AQUA: type = 2117; break; - case SO_SUMMON_VENTUS: type = 2120; break; - case SO_SUMMON_TERA: type = 2123; break; + switch (skill_id) { + case SO_SUMMON_AGNI: type = ELEID_EL_AGNI_S; break; + case SO_SUMMON_AQUA: type = ELEID_EL_AQUA_S; break; + case SO_SUMMON_VENTUS: type = ELEID_EL_VENTUS_S; break; + case SO_SUMMON_TERA: type = ELEID_EL_TERA_S; break; } type += skill_lv - 1; |