|
@@ -397,18 +397,22 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
|
|
|
switch( skill_id ) {
|
|
|
case BA_APPLEIDUN:
|
|
|
#ifdef RENEWAL
|
|
|
- hp = 100+5*skill_lv+5*(status_get_vit(src)/10); // HP recovery
|
|
|
+ hp = 100 + 5 * skill_lv + 5 * (status_get_vit(src) / 10); // HP recovery
|
|
|
#else
|
|
|
- hp = 30+5*skill_lv+5*(status_get_vit(src)/10); // HP recovery
|
|
|
+ hp = 30 + 5 * skill_lv + 5 * (status_get_vit(src) / 10); // HP recovery
|
|
|
#endif
|
|
|
if( sd )
|
|
|
- hp += 5*pc_checkskill(sd,BA_MUSICALLESSON);
|
|
|
+ hp += 5 * pc_checkskill(sd,BA_MUSICALLESSON);
|
|
|
break;
|
|
|
case PR_SANCTUARY:
|
|
|
- hp = (skill_lv>6)?777:skill_lv*100;
|
|
|
+ hp = (skill_lv > 6) ? 777 : skill_lv * 100;
|
|
|
break;
|
|
|
case NPC_EVILLAND:
|
|
|
- hp = (skill_lv>6)?666:skill_lv*100;
|
|
|
+ hp = (skill_lv > 6) ? 666 : skill_lv * 100;
|
|
|
+ break;
|
|
|
+ case AB_HIGHNESSHEAL:
|
|
|
+ hp = ((status_get_lv(src) + status_get_int(src)) / 8) * (4 + ((sd ? pc_checkskill(sd,AL_HEAL) : 1) * 8));
|
|
|
+ hp = (hp * (17 + 3 * skill_lv)) / 10;
|
|
|
break;
|
|
|
default:
|
|
|
if (skill_lv >= battle_config.max_heal_lv)
|
|
@@ -418,12 +422,10 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
|
|
|
* Renewal Heal Formula
|
|
|
* Formula: ( [(Base Level + INT) / 5] x 30 ) x (Heal Level / 10) x (Modifiers) + MATK
|
|
|
*/
|
|
|
- hp = (status_get_lv(src) + status_get_int(src)) / 5 * 30 * (skill_id == AB_HIGHNESSHEAL ? ((sd) ? pc_checkskill(sd,AL_HEAL) : skill_get_max(AL_HEAL)) : skill_lv) / 10;
|
|
|
+ hp = (status_get_lv(src) + status_get_int(src)) / 5 * 30 * skill_lv / 10;
|
|
|
#else
|
|
|
- hp = (status_get_lv(src) + status_get_int(src)) / 8 * (4 + ( (skill_id == AB_HIGHNESSHEAL ? ((sd) ? pc_checkskill(sd,AL_HEAL) : skill_get_max(AL_HEAL)) : skill_lv) * 8));
|
|
|
+ hp = (status_get_lv(src) + status_get_int(src)) / 8 * (4 + (skill_lv * 8));
|
|
|
#endif
|
|
|
- if (skill_id == AB_HIGHNESSHEAL)
|
|
|
- hp = hp * ( 17 + 3 * skill_lv ) / 10;
|
|
|
if( sd && ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) )
|
|
|
hp += hp * skill * 2 / 100;
|
|
|
else if( src->type == BL_HOM && (skill = hom_checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0 )
|
|
@@ -437,10 +439,10 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
|
|
|
hp >>= 1;
|
|
|
|
|
|
if( sd && (skill = pc_skillheal_bonus(sd, skill_id)) )
|
|
|
- hp += hp*skill/100;
|
|
|
+ hp += hp * skill / 100;
|
|
|
|
|
|
if( tsd && (skill = pc_skillheal2_bonus(tsd, skill_id)) )
|
|
|
- hp += hp*skill/100;
|
|
|
+ hp += hp * skill / 100;
|
|
|
|
|
|
if( sc && sc->data[SC_OFFERTORIUM] && (skill_id == AB_HIGHNESSHEAL || skill_id == AB_CHEAL ||
|
|
|
skill_id == PR_SANCTUARY || skill_id == AL_HEAL) )
|
|
@@ -460,8 +462,10 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk
|
|
|
// MATK part of the RE heal formula [malufett]
|
|
|
// Note: in this part matk bonuses from items or skills are not applied
|
|
|
switch( skill_id ) {
|
|
|
- case BA_APPLEIDUN: case PR_SANCTUARY:
|
|
|
- case NPC_EVILLAND: break;
|
|
|
+ case BA_APPLEIDUN:
|
|
|
+ case PR_SANCTUARY:
|
|
|
+ case NPC_EVILLAND:
|
|
|
+ break;
|
|
|
default:
|
|
|
{
|
|
|
struct status_data *status = status_get_status_data(src);
|
|
@@ -2713,6 +2717,24 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
|
|
|
case WL_CHAINLIGHTNING_ATK:
|
|
|
skill_id = WL_CHAINLIGHTNING;
|
|
|
break;
|
|
|
+ case WL_TETRAVORTEX_FIRE:
|
|
|
+ case WL_TETRAVORTEX_WATER:
|
|
|
+ case WL_TETRAVORTEX_WIND:
|
|
|
+ case WL_TETRAVORTEX_GROUND:
|
|
|
+ skill_id = WL_TETRAVORTEX;
|
|
|
+ break;
|
|
|
+ case WL_SUMMON_ATK_FIRE:
|
|
|
+ skill_id = WL_SUMMONFB;
|
|
|
+ break;
|
|
|
+ case WL_SUMMON_ATK_WIND:
|
|
|
+ skill_id = WL_SUMMONBL;
|
|
|
+ break;
|
|
|
+ case WL_SUMMON_ATK_WATER:
|
|
|
+ skill_id = WL_SUMMONWB;
|
|
|
+ break;
|
|
|
+ case WL_SUMMON_ATK_GROUND:
|
|
|
+ skill_id = WL_SUMMONSTONE;
|
|
|
+ break;
|
|
|
case LG_OVERBRAND_BRANDISH:
|
|
|
case LG_OVERBRAND_PLUSATK:
|
|
|
skill_id = LG_OVERBRAND;
|
|
@@ -3207,6 +3229,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
case WM_REVERBERATION_MAGIC:
|
|
|
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_REVERBERATION,-2,6);
|
|
|
break;
|
|
|
+ case WZ_SIGHTBLASTER:
|
|
|
case HT_CLAYMORETRAP:
|
|
|
case HT_BLASTMINE:
|
|
|
case HT_FLASHER:
|
|
@@ -3220,9 +3243,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
case HT_LANDMINE:
|
|
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, type);
|
|
|
break;
|
|
|
- case WZ_SIGHTBLASTER:
|
|
|
- dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
|
|
|
- break;
|
|
|
case RL_R_TRIP_PLUSATK:
|
|
|
case RL_BANISHING_BUSTER:
|
|
|
case RL_S_STORM:
|
|
@@ -3468,9 +3488,11 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap)
|
|
|
case RA_ICEBOUNDTRAP:
|
|
|
case SC_DIMENSIONDOOR:
|
|
|
case SC_BLOODYLUST:
|
|
|
+ case WM_REVERBERATION:
|
|
|
case GN_THORNS_TRAP:
|
|
|
case GN_HELLS_PLANT:
|
|
|
case RL_B_TRAP:
|
|
|
+ case SC_ESCAPE:
|
|
|
//Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set)
|
|
|
if (skill_id != g_skill_id && !(skill_get_inf2(g_skill_id)&INF2_TRAP) && g_skill_id != AS_VENOMDUST && g_skill_id != MH_POISON_MIST)
|
|
|
return 0;
|
|
@@ -3878,7 +3900,7 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
break;
|
|
|
case WM_REVERBERATION_MELEE:
|
|
|
case WM_REVERBERATION_MAGIC:
|
|
|
- skill_attack(skill_get_type(skl->skill_id),src, src, target, skl->skill_id, skl->skill_lv, 0, SD_LEVEL);
|
|
|
+ skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
|
|
break;
|
|
|
case SC_FATALMENACE:
|
|
|
if( src == target ) // Casters Part
|
|
@@ -4071,12 +4093,11 @@ static int skill_active_reverberation(struct block_list *bl, va_list ap) {
|
|
|
if (bl->type != BL_SKILL)
|
|
|
return 0;
|
|
|
if (su->alive && (sg = su->group) && sg->skill_id == WM_REVERBERATION) {
|
|
|
- clif_changetraplook(bl, UNT_USED_TRAPS);
|
|
|
map_foreachinrange(skill_trap_splash, bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, bl, gettick());
|
|
|
- su->limit = DIFF_TICK(gettick(), sg->tick) + 1500;
|
|
|
+ su->limit = DIFF_TICK(gettick(), sg->tick);
|
|
|
sg->unit_id = UNT_USED_TRAPS;
|
|
|
}
|
|
|
- return 0;
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
static int skill_reveal_trap(struct block_list *bl, va_list ap)
|
|
@@ -4480,8 +4501,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case SR_FLASHCOMBO_ATK_STEP4:
|
|
|
case SR_WINDMILL:
|
|
|
case SR_RIDEINLIGHTNING:
|
|
|
- case WM_SOUND_OF_DESTRUCTION:
|
|
|
- case WM_REVERBERATION:
|
|
|
+ case WM_REVERBERATION_MELEE:
|
|
|
+ case WM_REVERBERATION_MAGIC:
|
|
|
case SO_VARETYR_SPEAR:
|
|
|
case GN_CART_TORNADO:
|
|
|
case GN_CARTCANNON:
|
|
@@ -4522,6 +4543,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case NPC_EARTHQUAKE://FIXME: Isn't EarthQuake a ground skill after all?
|
|
|
skill_addtimerskill(src,tick+250,src->id,0,0,skill_id,skill_lv,2,flag|BCT_ENEMY|SD_SPLASH|1);
|
|
|
break;
|
|
|
+ case WM_REVERBERATION_MELEE:
|
|
|
+ case WM_REVERBERATION_MAGIC:
|
|
|
+ skill_area_temp[1] = 0;
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -4543,7 +4568,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
skill_area_temp[0] = map_foreachinrange(skill_area_sub, bl, (skill_id == AS_SPLASHER)?1:skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count);
|
|
|
|
|
|
// recursive invocation of skill_castend_damage_id() with flag|1
|
|
|
- map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), (skill_id == WM_REVERBERATION_MELEE || skill_id == WM_REVERBERATION_MAGIC) ? BL_CHAR : splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
|
if( skill_id == AS_SPLASHER ) {
|
|
|
map_freeblock_unlock(); // Don't consume a second gemstone.
|
|
|
return 0;
|
|
@@ -9620,7 +9645,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
sc_start2(src,bl,type,skill_area_temp[5],skill_lv,src->id,skill_area_temp[6]);
|
|
|
else {
|
|
|
// Success chance: (Skill Level x 6) + (Voice Lesson Skill Level x 2) + (Caster’s Job Level / 2) %
|
|
|
- skill_area_temp[5] = skill_lv * 6 + ((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)) * 2 + (sd ? sd->status.job_level : 50) / 2;
|
|
|
+ skill_area_temp[5] = skill_lv * 6 + ((sd) ? pc_checkskill(sd, WM_LESSON) : 1) * 2 + (sd ? sd->status.job_level : 50) / 2;
|
|
|
skill_area_temp[6] = skill_get_time(skill_id,skill_lv);
|
|
|
map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ALL|BCT_WOS|1, skill_castend_nodamage_id);
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
@@ -9834,8 +9859,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
// Success chance: [(15 + 5 * Skill Level) + ( Caster's INT / 5 ) + ( Caster's Job Level / 5 ) - ( Target's INT / 6 ) - ( Target's LUK / 10 )] %
|
|
|
int rate = (15 + 5 * skill_lv) * 1000 + status_get_int(src) * 200 + (sd ? sd->status.job_level * 200 : 0) - status_get_int(bl) * 1000 / 6 - status_get_luk(bl) * 100;
|
|
|
struct status_data *bstatus = status_get_base_status(bl);
|
|
|
- // Resistance: {(Target’s Base Level / 20) + (Target’s Base INT / 40)} seconds
|
|
|
- int duration = skill_get_time(skill_id, skill_lv) - (status_get_baselevel_limit(bl, 150) * 50 + bstatus->int_ * 25);
|
|
|
+ // Resistance: {(Target's Base Level / 20) + (Target's Base INT / 40)} seconds
|
|
|
+ int duration = skill_get_time(skill_id, skill_lv) - (status_get_lv(bl) * 50 + bstatus->int_ * 25);
|
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
status_change_start(src,bl,type,rate,skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
|
|
|
}
|
|
@@ -9844,8 +9869,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
case WM_LULLABY_DEEPSLEEP:
|
|
|
if (flag&1) {
|
|
|
struct status_data *bstatus = status_get_base_status(bl);
|
|
|
- // Resistance: {(Target’s Base Level / 20) + (Target’s Base INT / 20)} seconds
|
|
|
- int duration = skill_area_temp[6] - (status_get_baselevel_limit(bl, 150) * 50 + bstatus->int_ * 50);
|
|
|
+ // Resistance: {(Target's Base Level / 20) + (Target's Base INT / 20)} seconds
|
|
|
+ int duration = skill_area_temp[6] - (status_get_lv(bl) * 50 + bstatus->int_ * 50);
|
|
|
status_change_start(src,bl,type,skill_area_temp[5],skill_lv,0,0,0,max(duration,5000),SCSTART_NORATEDEF|SCSTART_NOTICKDEF); // Avoid general resistance
|
|
|
}
|
|
|
else {
|
|
@@ -10666,6 +10691,7 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
return skill_castend_pos(tid,tick,id,data);
|
|
|
}
|
|
|
case GN_WALLOFTHORN:
|
|
|
+ case SC_ESCAPE:
|
|
|
ud->skillx = target->x;
|
|
|
ud->skilly = target->y;
|
|
|
ud->skilltimer = tid;
|
|
@@ -11595,9 +11621,10 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
break;
|
|
|
|
|
|
case SC_ESCAPE:
|
|
|
- clif_skill_nodamage(src,src,skill_id,-1,1);
|
|
|
- skill_unitsetting(src,HT_ANKLESNARE,skill_lv,x,y,2);
|
|
|
+ clif_skill_nodamage(src,src,skill_id,skill_lv,1);
|
|
|
+ skill_unitsetting(src,skill_id,skill_lv,x,y,0);
|
|
|
skill_addtimerskill(src,tick,src->id,0,0,skill_id,skill_lv,0,0);
|
|
|
+ flag |= 1;
|
|
|
break;
|
|
|
|
|
|
case LG_OVERBRAND: {
|
|
@@ -11636,8 +11663,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
break;
|
|
|
|
|
|
case WM_GREAT_ECHO:
|
|
|
- flag|=1; // Should counsume 1 item per skill usage.
|
|
|
- map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY, skill_castend_damage_id);
|
|
|
+ case WM_SOUND_OF_DESTRUCTION:
|
|
|
+ i = skill_get_splash(skill_id,skill_lv);
|
|
|
+ map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id);
|
|
|
break;
|
|
|
|
|
|
case WM_SEVERE_RAINSTORM:
|
|
@@ -12144,12 +12172,11 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
|
&& (src->type&battle_config.vs_traps_bctall))
|
|
|
target = BCT_ALL;
|
|
|
break;
|
|
|
- case HT_ANKLESNARE:
|
|
|
- if( flag&2 ) val3 = SC_ESCAPE;
|
|
|
case HT_SKIDTRAP:
|
|
|
case MA_SKIDTRAP:
|
|
|
//Save position of caster
|
|
|
val1 = ((src->x)<<16)|(src->y);
|
|
|
+ case HT_ANKLESNARE:
|
|
|
case HT_SHOCKWAVE:
|
|
|
case HT_SANDMAN:
|
|
|
case MA_SANDMAN:
|
|
@@ -12169,6 +12196,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
|
case RA_FIRINGTRAP:
|
|
|
case RA_ICEBOUNDTRAP:
|
|
|
case RL_B_TRAP:
|
|
|
+ case SC_ESCAPE:
|
|
|
{
|
|
|
struct skill_condition req = skill_get_requirement(sd,skill_id,skill_lv);
|
|
|
ARR_FIND(0, MAX_SKILL_ITEM_REQUIRE, i, req.itemid[i] && (req.itemid[i] == ITEMID_TRAP || req.itemid[i] == ITEMID_TRAP_ALLOY));
|
|
@@ -12344,11 +12372,6 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
|
case LG_BANDING:
|
|
|
limit = -1;
|
|
|
break;
|
|
|
- case WM_REVERBERATION:
|
|
|
- if( battle_config.vs_traps_bctall && map_flag_vs(src->m) && (src->type&battle_config.vs_traps_bctall) )
|
|
|
- target = BCT_ALL;
|
|
|
- val1 = skill_lv + 1;
|
|
|
- val2 = 1;
|
|
|
case WM_POEMOFNETHERWORLD: // Can't be placed on top of Land Protector.
|
|
|
if( skill_id == WM_POEMOFNETHERWORLD && map_flag_gvg2(src->m) )
|
|
|
target = BCT_ALL;
|
|
@@ -12476,6 +12499,7 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
|
case MA_SKIDTRAP:
|
|
|
case HT_CLAYMORETRAP:
|
|
|
case HT_BLASTMINE:
|
|
|
+ case SC_ESCAPE:
|
|
|
unit_val1 = 3500;
|
|
|
break;
|
|
|
|
|
@@ -12499,6 +12523,9 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|
|
if (unit_val1 < 1) unit_val1 = 1;
|
|
|
unit_val2 = 0;
|
|
|
break;
|
|
|
+ case WM_REVERBERATION:
|
|
|
+ unit_val1 = 1 + skill_lv;
|
|
|
+ break;
|
|
|
case WM_POEMOFNETHERWORLD:
|
|
|
unit_val1 = 1 + skill_lv;
|
|
|
break;
|
|
@@ -13067,7 +13094,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|
|
|
|
|
case UNT_ANKLESNARE:
|
|
|
case UNT_MANHOLE:
|
|
|
- if( sg->val2 == 0 && tsc && (sg->unit_id == UNT_ANKLESNARE || bl->id != sg->src_id) ) {
|
|
|
+ if( sg->val2 == 0 && tsc && ((sg->unit_id == UNT_ANKLESNARE && skill_id != SC_ESCAPE) || bl->id != sg->src_id) ) {
|
|
|
int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
|
|
|
|
|
|
if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, SCSTART_NORATEDEF) ) {
|
|
@@ -13386,8 +13413,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|
|
|
|
|
case UNT_REVERBERATION:
|
|
|
clif_changetraplook(&unit->bl,UNT_USED_TRAPS);
|
|
|
- map_foreachinrange(skill_trap_splash,&unit->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &unit->bl,tick);
|
|
|
- sg->limit = DIFF_TICK(tick,sg->tick) + 1500;
|
|
|
+ map_foreachinrange(skill_trap_splash, &unit->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &unit->bl, tick);
|
|
|
+ sg->limit = DIFF_TICK(tick,sg->tick) + 1000;
|
|
|
sg->unit_id = UNT_USED_TRAPS;
|
|
|
break;
|
|
|
|
|
@@ -13882,11 +13909,10 @@ int64 skill_unit_ondamaged(struct skill_unit *unit, int64 damage)
|
|
|
case UNT_ANKLESNARE:
|
|
|
case UNT_ICEWALL:
|
|
|
case UNT_WALLOFTHORN:
|
|
|
+ case UNT_REVERBERATION:
|
|
|
case UNT_NETHERWORLD:
|
|
|
unit->val1 -= (int)cap_value(damage,INT_MIN,INT_MAX);
|
|
|
break;
|
|
|
- case UNT_REVERBERATION:
|
|
|
- unit->val1--;
|
|
|
default:
|
|
|
damage = 0;
|
|
|
break;
|
|
@@ -15461,10 +15487,14 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16
|
|
|
req.itemid[i] = skill_db[idx]->require.itemid[i];
|
|
|
req.amount[i] = skill_db[idx]->require.amount[i];
|
|
|
|
|
|
- if( skill_id >= HT_SKIDTRAP && skill_id <= HT_TALKIEBOX && pc_checkskill(sd, RA_RESEARCHTRAP) > 0){
|
|
|
+ if (skill_id >= HT_SKIDTRAP && skill_id <= HT_TALKIEBOX && pc_checkskill(sd, RA_RESEARCHTRAP) > 0 || skill_id == SC_ESCAPE) {
|
|
|
int16 itIndex;
|
|
|
- if( (itIndex = pc_search_inventory(sd,req.itemid[i])) < 0 || ( itIndex >= 0 && sd->status.inventory[itIndex].amount < req.amount[i] ) ){
|
|
|
- req.itemid[i] = ITEMID_TRAP_ALLOY;
|
|
|
+
|
|
|
+ if ((itIndex = pc_search_inventory(sd,req.itemid[i])) < 0 || ( itIndex >= 0 && sd->status.inventory[itIndex].amount < req.amount[i])) {
|
|
|
+ if (skill_id == SC_ESCAPE) // Alloy Trap has priority over normal Trap
|
|
|
+ req.itemid[i] = ITEMID_TRAP;
|
|
|
+ else
|
|
|
+ req.itemid[i] = ITEMID_TRAP_ALLOY;
|
|
|
req.amount[i] = 1;
|
|
|
}
|
|
|
break;
|
|
@@ -16866,11 +16896,9 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
|
|
|
if( bl->type != BL_PC && !is_boss(bl) )
|
|
|
sc_start2(ss,bl,SC_ELEMENTALCHANGE,100,sg->skill_lv,skill_get_ele(sg->skill_id,sg->skill_lv),skill_get_time2(sg->skill_id,sg->skill_lv));
|
|
|
break;
|
|
|
- case UNT_REVERBERATION:
|
|
|
- if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {
|
|
|
- skill_attack(BF_WEAPON, ss, src, bl, WM_REVERBERATION_MELEE, sg->skill_lv,tick, 0);
|
|
|
- skill_addtimerskill(ss, tick + 200, bl->id, 0, 0, WM_REVERBERATION_MAGIC, sg->skill_lv, BF_MAGIC, SD_LEVEL);
|
|
|
- }
|
|
|
+ case UNT_REVERBERATION: // For proper skill delay animation when used with Dominion Impulse
|
|
|
+ skill_addtimerskill(ss, tick + status_get_amotion(ss), bl->id, 0, 0, WM_REVERBERATION_MELEE, sg->skill_lv, BF_WEAPON, 0);
|
|
|
+ skill_addtimerskill(ss, tick + status_get_amotion(ss) * 2, bl->id, 0, 0, WM_REVERBERATION_MAGIC, sg->skill_lv, BF_MAGIC, 0);
|
|
|
break;
|
|
|
case UNT_FIRINGTRAP:
|
|
|
case UNT_ICEBOUNDTRAP:
|
|
@@ -17176,11 +17204,14 @@ int skill_delunit(struct skill_unit* unit)
|
|
|
|
|
|
// perform ondelete actions
|
|
|
switch (group->skill_id) {
|
|
|
- case HT_ANKLESNARE: {
|
|
|
+ case HT_ANKLESNARE:
|
|
|
+ case SC_ESCAPE:
|
|
|
+ {
|
|
|
struct block_list* target = map_id2bl(group->val2);
|
|
|
+ enum sc_type type = status_skill2sc(group->skill_id);
|
|
|
|
|
|
if( target )
|
|
|
- status_change_end(target, SC_ANKLE, INVALID_TIMER);
|
|
|
+ status_change_end(target, type, INVALID_TIMER);
|
|
|
}
|
|
|
break;
|
|
|
case WZ_ICEWALL:
|
|
@@ -17609,7 +17640,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
|
|
|
case UNT_ANKLESNARE:
|
|
|
case UNT_ELECTRICSHOCKER:
|
|
|
- if( group->val2 > 0 || group->val3 == SC_ESCAPE ) { //Used Trap doesn't return back to item
|
|
|
+ if (group->val2 > 0) { //Used Trap doesn't return back to item
|
|
|
skill_delunit(unit);
|
|
|
break;
|
|
|
}
|
|
@@ -17683,10 +17714,10 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
clif_changetraplook(bl,UNT_USED_TRAPS);
|
|
|
if (group->unit_id == UNT_REVERBERATION)
|
|
|
map_foreachinrange(skill_trap_splash, bl, skill_get_splash(group->skill_id, group->skill_lv), group->bl_flag, bl, tick);
|
|
|
- group->limit = DIFF_TICK(tick,group->tick) + 1500;
|
|
|
- unit->limit = DIFF_TICK(tick,group->tick) + 1500;
|
|
|
+ group->limit = DIFF_TICK(tick,group->tick) + 1000;
|
|
|
+ unit->limit = DIFF_TICK(tick,group->tick) + 1000;
|
|
|
group->unit_id = UNT_USED_TRAPS;
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_FEINTBOMB: {
|
|
|
struct block_list *src = map_id2bl(group->src_id);
|
|
@@ -17760,14 +17791,13 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
}
|
|
|
break;
|
|
|
case UNT_REVERBERATION:
|
|
|
- if (unit->val1 <= 0)
|
|
|
- unit->limit = DIFF_TICK(tick, group->tick) + 700;
|
|
|
- break;
|
|
|
case UNT_NETHERWORLD:
|
|
|
if (unit->val1 <= 0) {
|
|
|
clif_changetraplook(bl,UNT_USED_TRAPS);
|
|
|
- group->limit = DIFF_TICK(tick,group->tick)+1000;
|
|
|
- unit->limit = DIFF_TICK(tick,group->tick)+1000;
|
|
|
+ if (group->unit_id == UNT_REVERBERATION)
|
|
|
+ map_foreachinrange(skill_trap_splash, bl, skill_get_splash(group->skill_id, group->skill_lv), group->bl_flag, bl, tick);
|
|
|
+ group->limit = DIFF_TICK(tick,group->tick) + 1000;
|
|
|
+ unit->limit = DIFF_TICK(tick,group->tick) + 1000;
|
|
|
group->unit_id = UNT_USED_TRAPS;
|
|
|
}
|
|
|
break;
|