From 18b9549a0a8cfb0614c655d11f87f2acc7c8cc52 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 6 Nov 2006 21:10:45 +0000 Subject: - Corrected Ground Drift. Splash range of 3x3, stackable and placeable underneath others, cast time is 2 secs. It's considered ranged, and it's damage increase is defense ignoring, always neutral damage. - Added Bull's Eye 0.5 sec cast time - Corrected Bull's Eye implementation, it should deal normal damage against non brute/demi-human targets. - GS_DUST is now considered a short-range attack - Implemented Desperado's hit rate based on distance to caster as it's believed to behave. - Suiton's Speed/Agi penalty will affect everyone when used in versus maps. - GS_TRACKING's range is no longer affected by Snake Eye. - Cleaned up some skill_trap_splash - GS_FLING's defense reduction is now 5*lv% git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9158 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 14 ++++++ db/Changelog.txt | 1 + db/skill_cast_db.txt | 6 ++- db/skill_db.txt | 2 +- db/skill_unit_db.txt | 2 +- src/map/battle.c | 19 ++++--- src/map/skill.c | 139 ++++++++++++++++++++++++++++----------------------- src/map/status.c | 4 +- 8 files changed, 112 insertions(+), 75 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index c8d6eb241..682258734 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,20 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/11/06 + * Multiple Gunslinger skill corrections, refer to + http://ro.doddlercon.com/guides/gunslinger.html for information source: + [Skotlex] + - Corrected Ground Drift. Splash range of 3x3, stackable and placeable + underneath others, cast time is 2 secs. It's considered ranged, and it's + bonus damage increase is defense ignoring, always neutral. + - Corrected Bull's Eye implementation, it should deal normal damage against + non brute/demi-human targets. + - GS_DUST is now considered a short-range attack. + - Implemented Desperado's hit rate based on distance to caster as it's + believed to behave. + - GS_TRACKING's range is no longer affected by Snake Eye. + - GS_FLING's defense reduction is now 5*lv% + * Suiton's Speed/Agi penalty will affect everyone when used in versus maps. * Corrected Kaupe so it doesn't ends on the first part of Soul Destroyer. [Skotlex] * Applied some cleaning to the way Tatami Gaeshi knocks back. [Skotlex] diff --git a/db/Changelog.txt b/db/Changelog.txt index fd22db85c..311f63c6f 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -21,6 +21,7 @@ ======================== 11/06 + * Added Bull's Eye 0.5 sec cast time [Skotlex] * Ganbantein's delay is now 2 secs. [Skotlex] * Removed the time2 value of NJ_NEN since it has no use. [Skotlex] 11/05 diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt index 113eaa4db..243998795 100644 --- a/db/skill_cast_db.txt +++ b/db/skill_cast_db.txt @@ -850,6 +850,8 @@ 500,0,0,0,600000,0 //-- GS_FLING 501,0,0,0,30000,0 +//-- GS_BULLSEYE +503,500,0,0,0,0 //-- GS_MADNESSCANCEL 504,0,0,0,15000,0 //-- GS_ADJUSTMENT @@ -876,8 +878,8 @@ 519,1000,1200:1400:1600:1800:2000:2200:2400:2600:2800:3000,0,0,10000 //-- GS_SPREADATTACK // Delay unknown (if there is one, other that aspd) 520,1000,0,0,0,0 -//-- GS_GROUNDDRIFT // Delay unknown (if there is one, other that aspd) -521,1000,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000,10000 +//-- GS_GROUNDDRIFT +521,2000,0,0,3000:6000:9000:12000:15000:18000:21000:24000:27000:30000,10000 //========================================== diff --git a/db/skill_db.txt b/db/skill_db.txt index e57e41903..69cf2d275 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -545,7 +545,7 @@ 518,2,6,1,-1,0,0,10,1,no,0,0,0,weapon,5 //GS_DUST#Dust# 519,-9,6,1,-1,0,0,10,1,yes,0,0,0,weapon,0 //GS_FULLBUSTER#Full Buster# 520,-9,6,1,-1,2,1:1:1:2:2:2:3:3:3:4,10,1,no,0,0,0,weapon,0 //GS_SPREADATTACK#Spread Attack# -521,-9,6,2,-1,0,0,10,1,no,0,0,0,weapon,3 //GS_GROUNDDRIFT#Ground Drift# +521,-9,6,2,-1,0,1,10,1,no,0,0,0,weapon,3 //GS_GROUNDDRIFT#Ground Drift# 522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0 //NJ_TOBIDOUGU#NJ_TOBIDOUGU# 523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //NJ_SYURIKEN#NJ_SYURIKEN# 524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0 //NJ_KUNAI#NJ_KUNAI# diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt index 087412117..58090fdeb 100644 --- a/db/skill_unit_db.txt +++ b/db/skill_unit_db.txt @@ -89,7 +89,7 @@ 484,0xb8, , 2, 0,1000,enemy, 0x808 //HW_GRAVITATION 488,0xb9, , 3, 0, -1,all, 0x200 //CG_HERMODE 516,0xba, , 0, 3, 100,enemy, 0x000 //GS_DESPERADO -521,0xbe, , 0, 1,1000,enemy, 0x006 //GS_GROUNDDRIFT +521,0xbe, , 0, 1,1000,enemy, 0x000 //GS_GROUNDDRIFT 527,0xbc, , -1, 0,2000,enemy, 0x000 //NJ_TATAMIGAESHI 535,0xbd, , -1, 0, 200,enemy, 0x008 //NJ_KAENSIN 538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x000 //NJ_SUITON diff --git a/src/map/battle.c b/src/map/battle.c index 96b61e8d6..c278a330a 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -378,7 +378,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i if(sc->data[SC_ADJUSTMENT].timer != -1 && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) - damage=damage*80/100; + damage -= 20*damage/100; if(sc->data[SC_FOGWALL].timer != -1) { if(flag&BF_SKILL) //25% reduction @@ -885,6 +885,7 @@ static struct Damage battle_calc_weapon_attack( wd.flag=(wd.flag&~BF_RANGEMASK)|BF_LONG; break; case GS_DESPERADO: + case GS_DUST: //This one is the opposite, it consumes ammo, but should count as short range. wd.flag=(wd.flag&~BF_RANGEMASK)|BF_SHORT; break; @@ -917,11 +918,12 @@ static struct Damage battle_calc_weapon_attack( wd.type = 0x08; break; + case GS_GROUNDDRIFT: + wd.flag=(wd.flag&~BF_RANGEMASK)|BF_LONG; case KN_SPEARSTAB: case KN_BOWLINGBASH: case MO_BALKYOUNG: case TK_TURNKICK: - case GS_GROUNDDRIFT: wd.blewcount=0; break; @@ -1531,8 +1533,12 @@ static struct Damage battle_calc_weapon_attack( skillratio += 10*status_get_lv(src)/3; break; case GS_BULLSEYE: - skillratio += 400; - flag.cardfix = 0; + if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN) + && !(tstatus->mode&MD_BOSS)) + { //Only works well against brute/demihumans non bosses. + skillratio += 400; + flag.cardfix = 0; + } break; case GS_TRACKING: skillratio += 100 *(skill_lv+1); @@ -1590,9 +1596,6 @@ static struct Damage battle_calc_weapon_attack( case MO_EXTREMITYFIST: ATK_ADD(250 + 150*skill_lv); break; - case GS_GROUNDDRIFT: - ATK_ADD(50*skill_lv); - break; case TK_DOWNKICK: case TK_STORMKICK: case TK_TURNKICK: @@ -1832,6 +1835,8 @@ static struct Damage battle_calc_weapon_attack( wd.damage=battle_attr_fix(src,target,wd.damage,s_ele,tstatus->def_ele, tstatus->ele_lv); if(skill_num==MC_CARTREVOLUTION) //Cart Revolution applies the element fix once more with neutral element wd.damage = battle_attr_fix(src,target,wd.damage,ELE_NEUTRAL,tstatus->def_ele, tstatus->ele_lv); + if(skill_num== GS_GROUNDDRIFT) //Additional 50*lv Neutral damage. + wd.damage+= battle_attr_fix(src,target,50*skill_lv,ELE_NEUTRAL,tstatus->def_ele, tstatus->ele_lv); } if (flag.lh && wd.damage2 > 0) wd.damage2 = battle_attr_fix(src,target,wd.damage2,s_ele_,tstatus->def_ele, tstatus->ele_lv); diff --git a/src/map/skill.c b/src/map/skill.c index bf1bc6998..a90e179ce 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -773,7 +773,6 @@ int skill_get_range2 (struct block_list *bl, int id, int lv) break; // added to allow GS skills to be effected by the range of Snake Eyes [Reddozen] case GS_RAPIDSHOWER: - case GS_TRACKING: case GS_PIERCINGSHOT: case GS_FULLBUSTER: case GS_SPREADATTACK: @@ -1337,7 +1336,8 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int sc_start(bl,SC_STUN,70,skilllv,skill_get_time2(skillid,skilllv)); break; case GS_BULLSEYE: //0.1% coma rate. - status_change_start(bl,SC_COMA,10,skilllv,0,0,0,0,0); + if(tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN) + status_change_start(bl,SC_COMA,10,skilllv,0,0,0,0,0); break; case GS_PIERCINGSHOT: sc_start(bl,SC_BLEEDING,(skilllv*3),skilllv,skill_get_time2(skillid,skilllv)); @@ -3133,10 +3133,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int break; case GS_BULLSEYE: - if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN) && !(tstatus->mode&MD_BOSS)) - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - else if (sd) - clif_skill_fail(sd,skillid,0,0); + skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); break; case NJ_KASUMIKIRI: @@ -6692,9 +6689,10 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid, { int element[5]={ELE_WIND,ELE_DARK,ELE_POISON,ELE_WATER,ELE_FIRE}; - if (src->type == BL_PC) + if (sd) val1=sd->arrow_ele; - else val1=element[rand()%5]; + else + val1=element[rand()%5]; switch (val1) { @@ -6769,6 +6767,18 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid, ux+=(i%5-2); uy+=(i/5-2); break; + case UNT_DESPERADO: + val1 = abs(layout->dx[i]); + val2 = abs(layout->dy[i]); + if (val1 < 2 || val2 < 2) { //Nearby cross, linear decrease with no diagonals + if (val2 > val1) val1 = val2; + if (val1) val1--; + val1 = 36 -12*val1; + } else //Diagonal edges + val1 = 28 -4*val1 -4*val2; + if (val1 < 1) val1 = 1; + val2 = 0; + break; default: if (group->state.song_dance&0x1) val2 = unit_flag&(UF_DANCE|UF_SONG); //Store whether this is a song/dance @@ -6892,7 +6902,7 @@ int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned case UNT_SUITON: if(sc && sc->data[type].timer==-1) sc_start4(bl,type,100,sg->skill_lv, - battle_check_target(&src->bl,bl,BCT_ENEMY)>0?1:0, //Send val3 =1 to reduce agi. + map_flag_vs(bl->m) || battle_check_target(&src->bl,bl,BCT_ENEMY)>0?1:0, //Send val3 =1 to reduce agi. 0,0,sg->limit); break; @@ -7175,6 +7185,21 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] break; + case UNT_GROUNDDRIFT_WIND: + case UNT_GROUNDDRIFT_DARK: + case UNT_GROUNDDRIFT_POISON: + case UNT_GROUNDDRIFT_WATER: + case UNT_GROUNDDRIFT_FIRE: + map_foreachinrange(skill_trap_splash,&src->bl, + skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, + &src->bl,tick,0); + sg->unit_id = UNT_USED_TRAPS; + clif_changetraplook(&src->bl, UNT_FIREPILLAR_ACTIVE); + sg->limit=DIFF_TICK(tick,sg->tick)+1500; + sg->state.into_abyss = 1; + break; + + case UNT_TALKIEBOX: if (sg->src_id == bl->id) break; @@ -7312,42 +7337,10 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns break; case UNT_DESPERADO: - if (!(rand()%5)) //Has a low chance of connecting. [Skotlex] + if (rand()%100 < src->val1) skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; - case UNT_GROUNDDRIFT_WIND: - case UNT_GROUNDDRIFT_DARK: - case UNT_GROUNDDRIFT_POISON: - case UNT_GROUNDDRIFT_WATER: - case UNT_GROUNDDRIFT_FIRE: - skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,sg->val1); - - switch (sg->val1) - { - case ELE_WIND: - sc_start(bl,SC_STUN,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); - break; - case ELE_WATER: - sc_start(bl,SC_FREEZE,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); - break; - case ELE_POISON: - sc_start(bl,SC_POISON,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); - break; - case ELE_DARK: - sc_start(bl,SC_BLIND,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); - break; - case ELE_FIRE: - skill_blown(&src->bl,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv)); - break; - } - - sg->unit_id = UNT_USED_TRAPS; - clif_changetraplook(&src->bl, UNT_FIREPILLAR_ACTIVE); - sg->limit=DIFF_TICK(tick,sg->tick)+1500; - sg->state.into_abyss = 1; //Prevent Remove Trap from giving you the trap back. [Skotlex] - break; - case UNT_KAENSIN: skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); if (--src->val2 <= 0) @@ -9426,27 +9419,49 @@ int skill_trap_splash (struct block_list *bl, va_list ap) nullpo_retr(0, sg = unit->group); nullpo_retr(0, ss = map_id2bl(sg->src_id)); - if(battle_check_target(src,bl,BCT_ENEMY) > 0){ - switch(sg->unit_id){ - case UNT_SHOCKWAVE: - case UNT_SANDMAN: - case UNT_FLASHER: - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); - break; - case UNT_BLASTMINE: - case UNT_CLAYMORETRAP: - //Special property: Each target is hit N times (N = number of targets on splash area) - if (!count) count = 1; - for(i=0;iskill_id,sg->skill_lv,tick,0); - break; - case UNT_FREEZINGTRAP: - skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,0); - break; - } - } + if(battle_check_target(src,bl,BCT_ENEMY) <= 0) + return 0; - return 0; + switch(sg->unit_id){ + case UNT_SHOCKWAVE: + case UNT_SANDMAN: + case UNT_FLASHER: + skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); + break; + case UNT_BLASTMINE: + case UNT_CLAYMORETRAP: + //Special property: Each target is hit N times (N = number of targets on splash area) + if (!count) count = 1; + for(i=0;iskill_id,sg->skill_lv,tick,0); + break; + case UNT_FREEZINGTRAP: + skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,0); + break; + case UNT_GROUNDDRIFT_WIND: + if(skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1)) + sc_start(bl,SC_STUN,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); + break; + case UNT_GROUNDDRIFT_DARK: + if(skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1)) + sc_start(bl,SC_BLIND,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); + break; + case UNT_GROUNDDRIFT_POISON: + if(skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1)) + sc_start(bl,SC_POISON,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); + break; + case UNT_GROUNDDRIFT_WATER: + if(skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1)) + sc_start(bl,SC_FREEZE,5,sg->skill_lv,skill_get_time2(sg->skill_id, sg->skill_lv)); + break; + case UNT_GROUNDDRIFT_FIRE: + if(skill_attack(BF_WEAPON,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1)) + skill_blown(src,bl,skill_get_blewcount(sg->skill_id,sg->skill_lv)); + break; + default: + return 0; + } + return 1; } /*========================================== diff --git a/src/map/status.c b/src/map/status.c index 2c5a5c7e5..8820fa505 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -5523,8 +5523,8 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break; case SC_FLING: - val2 = 3*val1; //Def reduction - val3 = 3*val1; //Def2 reduction + val2 = 5*val1; //Def reduction + val3 = 5*val1; //Def2 reduction break; case SC_PROVOKE: //val2 signals autoprovoke. -- cgit v1.2.3-60-g2f50