Corrected NPC Earthquake skill (fixes #1289)
* Properly implemented the skill as a unit skill. * Corrected the damage calculation and removed attempts at diving by zero. * The skill now ignores the target's defense.
This commit is contained in:
parent
37b3644350
commit
19f2bc597c
@ -778,7 +778,7 @@
|
|||||||
|
|
||||||
//****
|
//****
|
||||||
// Additional NPC Skills (Episode 11.3)
|
// Additional NPC Skills (Episode 11.3)
|
||||||
653,0,8,4,0,0x6,5:7:9:11:13:5:7:9:11:13,10,1,no,0,0x40002,0,magic,0,0x0, NPC_EARTHQUAKE,Earthquake
|
653,0,8,4,0,0x26,5:7:9:11:13:5:7:9:11:13,10,1,no,0,0x40002,0,magic,0,0x1, NPC_EARTHQUAKE,Earthquake
|
||||||
654,6,6,1,3,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_FIREBREATH,Fire Breath
|
654,6,6,1,3,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_FIREBREATH,Fire Breath
|
||||||
655,6,6,1,1,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_ICEBREATH,Ice Breath
|
655,6,6,1,1,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_ICEBREATH,Ice Breath
|
||||||
656,6,6,1,4,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_THUNDERBREATH,Thunder Breath
|
656,6,6,1,4,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_THUNDERBREATH,Thunder Breath
|
||||||
|
@ -105,6 +105,7 @@
|
|||||||
538,0xbb, , 1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010 //NJ_SUITON
|
538,0xbb, , 1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010 //NJ_SUITON
|
||||||
539,0x86, , 3, 0,1000,enemy, 0x010 //NJ_HYOUSYOURAKU
|
539,0x86, , 3, 0,1000,enemy, 0x010 //NJ_HYOUSYOURAKU
|
||||||
541,0x86, , 2:2:3:3:4, 0,1000,enemy, 0x010 //NJ_RAIGEKISAI
|
541,0x86, , 2:2:3:3:4, 0,1000,enemy, 0x010 //NJ_RAIGEKISAI
|
||||||
|
653,0xc6, , 0, 5:7:9:11:13:5:7:9:11:13, 300,enemy, 0x010 //NPC_EARTHQUAKE
|
||||||
670,0xc7, , 1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008 //NPC_EVILLAND
|
670,0xc7, , 1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008 //NPC_EVILLAND
|
||||||
|
|
||||||
//706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG
|
//706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG
|
||||||
|
@ -778,7 +778,7 @@
|
|||||||
|
|
||||||
//****
|
//****
|
||||||
// Additional NPC Skills (Episode 11.3)
|
// Additional NPC Skills (Episode 11.3)
|
||||||
653,0,8,4,0,0x6,5:7:9:11:13:5:7:9:11:13,10,1,no,0,0x40002,0,magic,0,0x0, NPC_EARTHQUAKE,Earthquake
|
653,0,8,4,0,0x26,5:7:9:11:13:5:7:9:11:13,10,1,no,0,0x40002,0,magic,0,0x1, NPC_EARTHQUAKE,Earthquake
|
||||||
654,6,6,1,3,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_FIREBREATH,Fire Breath
|
654,6,6,1,3,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_FIREBREATH,Fire Breath
|
||||||
655,6,6,1,1,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_ICEBREATH,Ice Breath
|
655,6,6,1,1,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_ICEBREATH,Ice Breath
|
||||||
656,6,6,1,4,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_THUNDERBREATH,Thunder Breath
|
656,6,6,1,4,0,3,10,1,no,0,0x2,14,weapon,0,0x0, NPC_THUNDERBREATH,Thunder Breath
|
||||||
|
@ -106,6 +106,7 @@
|
|||||||
538,0xbb, , 1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010 //NJ_SUITON
|
538,0xbb, , 1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010 //NJ_SUITON
|
||||||
539,0x86, , 3, 0,1000,enemy, 0x010 //NJ_HYOUSYOURAKU
|
539,0x86, , 3, 0,1000,enemy, 0x010 //NJ_HYOUSYOURAKU
|
||||||
541,0x86, , 1:1:2:2:3, 0,1000,enemy, 0x010 //NJ_RAIGEKISAI
|
541,0x86, , 1:1:2:2:3, 0,1000,enemy, 0x010 //NJ_RAIGEKISAI
|
||||||
|
653,0xc6, , 0, 5:7:9:11:13:5:7:9:11:13, 300,enemy, 0x010 //NPC_EARTHQUAKE
|
||||||
670,0xc7, , 1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008 //NPC_EVILLAND
|
670,0xc7, , 1, 5:5:5:5:5:5:5:5:5:13,1000,all,0x008 //NPC_EVILLAND
|
||||||
|
|
||||||
//706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG
|
//706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG
|
||||||
|
@ -2526,6 +2526,12 @@ static bool is_attack_hitting(struct Damage wd, struct block_list *src, struct b
|
|||||||
case NPC_UNDEADATTACK:
|
case NPC_UNDEADATTACK:
|
||||||
case NPC_TELEKINESISATTACK:
|
case NPC_TELEKINESISATTACK:
|
||||||
case NPC_BLEEDING:
|
case NPC_BLEEDING:
|
||||||
|
case NPC_EARTHQUAKE:
|
||||||
|
case NPC_FIREBREATH:
|
||||||
|
case NPC_ICEBREATH:
|
||||||
|
case NPC_THUNDERBREATH:
|
||||||
|
case NPC_ACIDBREATH:
|
||||||
|
case NPC_DARKNESSBREATH:
|
||||||
hitrate += hitrate * 20 / 100;
|
hitrate += hitrate * 20 / 100;
|
||||||
break;
|
break;
|
||||||
case KN_PIERCE:
|
case KN_PIERCE:
|
||||||
@ -3492,6 +3498,9 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
|||||||
case NPC_PULSESTRIKE:
|
case NPC_PULSESTRIKE:
|
||||||
skillratio += 100 * (skill_lv - 1);
|
skillratio += 100 * (skill_lv - 1);
|
||||||
break;
|
break;
|
||||||
|
case NPC_EARTHQUAKE:
|
||||||
|
skillratio += 100 + 100 * skill_lv + 100 * (skill_lv / 2);
|
||||||
|
break;
|
||||||
case RG_BACKSTAP:
|
case RG_BACKSTAP:
|
||||||
if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty)
|
if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty)
|
||||||
skillratio += (200 + 40 * skill_lv) / 2;
|
skillratio += (200 + 40 * skill_lv) / 2;
|
||||||
@ -5683,6 +5692,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
case PF_SOULBURN:
|
case PF_SOULBURN:
|
||||||
ad.damage = tstatus->sp * 2;
|
ad.damage = tstatus->sp * 2;
|
||||||
break;
|
break;
|
||||||
|
case NPC_EARTHQUAKE: {
|
||||||
|
struct Damage wd = battle_calc_weapon_attack(src, target, skill_id, skill_lv, ad.miscflag);
|
||||||
|
|
||||||
|
ad.damage = wd.damage;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case AB_RENOVATIO:
|
case AB_RENOVATIO:
|
||||||
ad.damage = status_get_lv(src) * 10 + sstatus->int_;
|
ad.damage = status_get_lv(src) * 10 + sstatus->int_;
|
||||||
break;
|
break;
|
||||||
@ -5842,9 +5857,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
case NPC_ENERGYDRAIN:
|
case NPC_ENERGYDRAIN:
|
||||||
skillratio += 100 * skill_lv;
|
skillratio += 100 * skill_lv;
|
||||||
break;
|
break;
|
||||||
case NPC_EARTHQUAKE:
|
|
||||||
skillratio += 100 + 100 * skill_lv + 100 * (skill_lv / 2);
|
|
||||||
break;
|
|
||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
case WZ_HEAVENDRIVE:
|
case WZ_HEAVENDRIVE:
|
||||||
case WZ_METEOR:
|
case WZ_METEOR:
|
||||||
@ -6162,15 +6174,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill_id == NPC_EARTHQUAKE) {
|
|
||||||
//Adds atk2 to the damage, should be influenced by number of hits and skill-ratio, but not mdef reductions. [Skotlex]
|
|
||||||
//Also divide the extra bonuses from atk2 based on the number in range [Kevin]
|
|
||||||
if(mflag>0)
|
|
||||||
ad.damage+= (sstatus->rhw.atk2*skillratio/100)/mflag;
|
|
||||||
else
|
|
||||||
ShowError("Zero range by %d:%s, divide per 0 avoided!\n", skill_id, skill_get_name(skill_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ad.damage<1)
|
if(ad.damage<1)
|
||||||
ad.damage=1;
|
ad.damage=1;
|
||||||
else if(sc) { //only applies when hit
|
else if(sc) { //only applies when hit
|
||||||
|
@ -3959,14 +3959,6 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
|||||||
case BS_HAMMERFALL:
|
case BS_HAMMERFALL:
|
||||||
sc_start(src, target, status_skill2sc(skl->skill_id), skl->type, skl->skill_lv, skill_get_time2(skl->skill_id, skl->skill_lv));
|
sc_start(src, target, status_skill2sc(skl->skill_id), skl->type, skl->skill_lv, skill_get_time2(skl->skill_id, skl->skill_lv));
|
||||||
break;
|
break;
|
||||||
case NPC_EARTHQUAKE:
|
|
||||||
if( skl->type > 1 )
|
|
||||||
skill_addtimerskill(src,tick+250,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
|
|
||||||
skill_area_temp[0] = map_foreachinrange(skill_area_sub, src, skill_get_splash(skl->skill_id, skl->skill_lv), BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, BCT_ENEMY, skill_area_sub_count);
|
|
||||||
skill_area_temp[1] = src->id;
|
|
||||||
skill_area_temp[2] = 0;
|
|
||||||
map_foreachinrange(skill_area_sub, src, skill_get_splash(skl->skill_id, skl->skill_lv), splash_target(src), src, skl->skill_id, skl->skill_lv, tick, skl->flag, skill_castend_damage_id);
|
|
||||||
break;
|
|
||||||
case WZ_WATERBALL:
|
case WZ_WATERBALL:
|
||||||
{
|
{
|
||||||
//Get the next waterball cell to consume
|
//Get the next waterball cell to consume
|
||||||
@ -4666,7 +4658,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
case NJ_HUUMA:
|
case NJ_HUUMA:
|
||||||
case ASC_METEORASSAULT:
|
case ASC_METEORASSAULT:
|
||||||
case GS_SPREADATTACK:
|
case GS_SPREADATTACK:
|
||||||
case NPC_EARTHQUAKE:
|
|
||||||
case NPC_PULSESTRIKE:
|
case NPC_PULSESTRIKE:
|
||||||
case NPC_HELLJUDGEMENT:
|
case NPC_HELLJUDGEMENT:
|
||||||
case NPC_VAMPIRE_GIFT:
|
case NPC_VAMPIRE_GIFT:
|
||||||
@ -4750,9 +4741,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
case MH_XENO_SLASHER:
|
case MH_XENO_SLASHER:
|
||||||
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
|
clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
|
||||||
break;
|
break;
|
||||||
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_MELEE:
|
||||||
case WM_REVERBERATION_MAGIC:
|
case WM_REVERBERATION_MAGIC:
|
||||||
skill_area_temp[1] = 0;
|
skill_area_temp[1] = 0;
|
||||||
@ -4777,7 +4765,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);
|
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
|
// recursive invocation of skill_castend_damage_id() with flag|1
|
||||||
if (battle_config.skill_wall_check && skill_id != NPC_EARTHQUAKE)
|
if (battle_config.skill_wall_check)
|
||||||
map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
else
|
else
|
||||||
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, 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), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
||||||
@ -6853,7 +6841,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||||
case SR_EARTHSHAKER:
|
case SR_EARTHSHAKER:
|
||||||
case NC_INFRAREDSCAN:
|
case NC_INFRAREDSCAN:
|
||||||
case NPC_EARTHQUAKE:
|
|
||||||
case NPC_VAMPIRE_GIFT:
|
case NPC_VAMPIRE_GIFT:
|
||||||
case NPC_HELLJUDGEMENT:
|
case NPC_HELLJUDGEMENT:
|
||||||
case NPC_PULSESTRIKE:
|
case NPC_PULSESTRIKE:
|
||||||
@ -11594,6 +11581,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
#ifdef RENEWAL
|
#ifdef RENEWAL
|
||||||
case NJ_HUUMA:
|
case NJ_HUUMA:
|
||||||
#endif
|
#endif
|
||||||
|
case NPC_EARTHQUAKE:
|
||||||
case NPC_EVILLAND:
|
case NPC_EVILLAND:
|
||||||
case RA_ELECTRICSHOCKER:
|
case RA_ELECTRICSHOCKER:
|
||||||
case RA_CLUSTERBOMB:
|
case RA_CLUSTERBOMB:
|
||||||
@ -12764,6 +12752,9 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case NPC_EARTHQUAKE:
|
||||||
|
clif_skill_damage(src, src, gettick(), status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SKILL);
|
||||||
|
break;
|
||||||
case GC_POISONSMOKE:
|
case GC_POISONSMOKE:
|
||||||
if( !(sc && sc->data[SC_POISONINGWEAPON]) )
|
if( !(sc && sc->data[SC_POISONINGWEAPON]) )
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -13525,6 +13516,11 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|||||||
skill_delunit(unit);
|
skill_delunit(unit);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case UNT_EARTHQUAKE:
|
||||||
|
skill_attack(BF_MAGIC, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick,
|
||||||
|
map_foreachinrange(skill_area_sub, &unit->bl, skill_get_splash(sg->skill_id, sg->skill_lv), BL_CHAR, &unit->bl, sg->skill_id, sg->skill_lv, tick, BCT_ENEMY, skill_area_sub_count));
|
||||||
|
break;
|
||||||
|
|
||||||
case UNT_SKIDTRAP: {
|
case UNT_SKIDTRAP: {
|
||||||
//Knockback away from position of user during placement [Playtester]
|
//Knockback away from position of user during placement [Playtester]
|
||||||
skill_blown(&unit->bl,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv),
|
skill_blown(&unit->bl,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv),
|
||||||
|
@ -1965,7 +1965,7 @@ enum s_skill_unit_id {
|
|||||||
UNT_DEATHWAVE, //TODO
|
UNT_DEATHWAVE, //TODO
|
||||||
UNT_WATERATTACK, //TODO
|
UNT_WATERATTACK, //TODO
|
||||||
UNT_WINDATTACK, //TODO
|
UNT_WINDATTACK, //TODO
|
||||||
UNT_EARTHQUAKE, //TODO
|
UNT_EARTHQUAKE,
|
||||||
UNT_EVILLAND,
|
UNT_EVILLAND,
|
||||||
UNT_DARK_RUNNER, //TODO
|
UNT_DARK_RUNNER, //TODO
|
||||||
UNT_DARK_TRANSFER, //TODO
|
UNT_DARK_TRANSFER, //TODO
|
||||||
|
Loading…
x
Reference in New Issue
Block a user