From 19f2bc597ca19b445a989c7ab1e897a351c99e41 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 20 May 2016 14:00:58 -0400 Subject: [PATCH] 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. --- db/pre-re/skill_db.txt | 2 +- db/pre-re/skill_unit_db.txt | 1 + db/re/skill_db.txt | 2 +- db/re/skill_unit_db.txt | 1 + src/map/battle.c | 27 +++++++++++++++------------ src/map/skill.c | 24 ++++++++++-------------- src/map/skill.h | 2 +- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index c20775c2f7..e086ef7525 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -778,7 +778,7 @@ //**** // 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 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 diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index 9616b0e15c..f490e85db7 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/db/pre-re/skill_unit_db.txt @@ -105,6 +105,7 @@ 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 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 //706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 7c5192b83a..bc010d5d58 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -778,7 +778,7 @@ //**** // 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 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 diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index 038a3dae62..2197fd8036 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -106,6 +106,7 @@ 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 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 //706,0xfd, , 0, 0,1000,all, 0x000 //NPC_VENOMFOG diff --git a/src/map/battle.c b/src/map/battle.c index 49def0fda5..f67ef22104 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2526,6 +2526,12 @@ static bool is_attack_hitting(struct Damage wd, struct block_list *src, struct b case NPC_UNDEADATTACK: case NPC_TELEKINESISATTACK: 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; break; case KN_PIERCE: @@ -3492,6 +3498,9 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case NPC_PULSESTRIKE: skillratio += 100 * (skill_lv - 1); break; + case NPC_EARTHQUAKE: + skillratio += 100 + 100 * skill_lv + 100 * (skill_lv / 2); + break; case RG_BACKSTAP: if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty) 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: ad.damage = tstatus->sp * 2; 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: ad.damage = status_get_lv(src) * 10 + sstatus->int_; break; @@ -5842,9 +5857,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NPC_ENERGYDRAIN: skillratio += 100 * skill_lv; break; - case NPC_EARTHQUAKE: - skillratio += 100 + 100 * skill_lv + 100 * (skill_lv / 2); - break; #ifdef RENEWAL case WZ_HEAVENDRIVE: case WZ_METEOR: @@ -6162,15 +6174,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list #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) ad.damage=1; else if(sc) { //only applies when hit diff --git a/src/map/skill.c b/src/map/skill.c index 6e6cc6847f..0d5110fb62 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3959,14 +3959,6 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) 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)); 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: { //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 ASC_METEORASSAULT: case GS_SPREADATTACK: - case NPC_EARTHQUAKE: case NPC_PULSESTRIKE: case NPC_HELLJUDGEMENT: 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: clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); 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_MAGIC: 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); // 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); 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); @@ -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); case SR_EARTHSHAKER: case NC_INFRAREDSCAN: - case NPC_EARTHQUAKE: case NPC_VAMPIRE_GIFT: case NPC_HELLJUDGEMENT: 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 case NJ_HUUMA: #endif + case NPC_EARTHQUAKE: case NPC_EVILLAND: case RA_ELECTRICSHOCKER: case RA_CLUSTERBOMB: @@ -12764,6 +12752,9 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_ 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: if( !(sc && sc->data[SC_POISONINGWEAPON]) ) return NULL; @@ -13525,6 +13516,11 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns skill_delunit(unit); 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: { //Knockback away from position of user during placement [Playtester] skill_blown(&unit->bl,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv), diff --git a/src/map/skill.h b/src/map/skill.h index 27aad09cf5..1c876000b9 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -1965,7 +1965,7 @@ enum s_skill_unit_id { UNT_DEATHWAVE, //TODO UNT_WATERATTACK, //TODO UNT_WINDATTACK, //TODO - UNT_EARTHQUAKE, //TODO + UNT_EARTHQUAKE, UNT_EVILLAND, UNT_DARK_RUNNER, //TODO UNT_DARK_TRANSFER, //TODO