summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c9
-rw-r--r--src/map/skill.c42
-rw-r--r--src/map/skill.h1
-rw-r--r--src/map/status.c15
4 files changed, 49 insertions, 18 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index 4fc5fb72f..992ed62e3 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -1256,10 +1256,12 @@ static struct Damage battle_calc_weapon_attack(
case NJ_SYURIKEN:
case NJ_KUNAI:
case NJ_HUUMA:
+ wd.flag=(wd.flag&~BF_RANGEMASK)|BF_LONG;
flag.arrow = 1;
break;
case GS_MAGICALBULLET:
+ wd.flag=(wd.flag&~BF_RANGEMASK)|BF_LONG;
flag.arrow = 0;
break;
}
@@ -2267,8 +2269,9 @@ static struct Damage battle_calc_weapon_attack(
wd.div_=skill_get_num(TF_DOUBLE,skill_lv?skill_lv:1);
wd.type = 0x08;
}
- } else if (( (skill_lv = 5*pc_checkskill(sd,GS_CHAINACTION)) > 0 && sd->weapontype1 == 0x11) ||
- sd->double_rate > 0) // Copied double attack
+ } else if (( (skill_lv = 5*pc_checkskill(sd,GS_CHAINACTION)) > 0 &&
+ (sd->weapontype1 == 0x11 || sd->weapontype1 == 0x12 || sd->weapontype1 == 0x13
+ || sd->weapontype1 == 0x14 || sd->weapontype1 == 0x15)) || sd->double_rate > 0) // Copied double attack
if (rand()%100 < (skill_lv>sd->double_rate?skill_lv:sd->double_rate))
{
wd.damage *=2;
@@ -2946,7 +2949,7 @@ struct Damage battle_calc_misc_attack(
break;
case NJ_ZENYNAGE:
damage=1000*skill_lv;
- if(skill_lv == 0) damage -= 1;
+ if(skill_lv == 10) damage -= 1;
if(map_flag_vs(bl->m) || is_boss(bl))
damage=damage/2; //temp value
break;
diff --git a/src/map/skill.c b/src/map/skill.c
index f06e3d860..72865d9c0 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -3102,7 +3102,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
case GS_RAPIDSHOWER:
case GS_DUST:
case GS_FULLBUSTER:
- case GS_SPREADATTACK:
+
case NJ_SYURIKEN:
case NJ_KUNAI:
case NJ_HUUMA:
@@ -3112,6 +3112,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
//race check
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
+ case GS_DESPERADO:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ map_foreachinrange(skill_attack_area, src,
+ skill_get_splash(skillid, skilllv), BL_CHAR,
+ BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY);
+ break;
+ case GS_SPREADATTACK:
+ map_foreachinrange(skill_area_sub, bl,
+ skill_get_splash(skillid, skilllv),BL_CHAR,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ break;
case NJ_ZENYNAGE:
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
break;
@@ -3124,13 +3136,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
case NJ_KOUENKA:
- case NJ_BAKUENRYU:
case NJ_HYOUSENSOU:
case NJ_HYOUSYOURAKU:
case NJ_HUUJIN:
case NJ_RAIGEKISAI:
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break;
+ case NJ_KAMAITACHI:
+ // Does it stop if touch an obstacle? it shouldn't shoot trough walls
+ map_foreachinpath (skill_attack_area,src->m,src->x,src->y,bl->x,bl->y,
+ skill_get_splash(skillid, skilllv),BL_CHAR,
+ BF_WEAPON,src,src,skillid,skilllv,tick,flag,BCT_ENEMY); // varargs
+ break;
//Not implemented yet [Vicious]
case GS_FLING:
//case GS_TRIPLEACTION:
@@ -3141,7 +3158,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
case GS_DISARM:
//case GS_PIERCINGSHOT:
//case GS_RAPIDSHOWER:
- case GS_DESPERADO:
+ //case GS_DESPERADO:
//case GS_DUST:
//case GS_FULLBUSTER:
//case GS_SPREADATTACK:
@@ -3156,12 +3173,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
//case NJ_KIRIKAGE:
//case NJ_KOUENKA:
case NJ_KAENSIN:
- //case NJ_BAKUENRYU:
//case NJ_HYOUSENSOU:
//case NJ_HYOUSYOURAKU:
//case NJ_HUUJIN:
//case NJ_RAIGEKISAI:
- case NJ_KAMAITACHI:
+ //case NJ_KAMAITACHI:
case NJ_ISSEN:
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break;
@@ -5688,6 +5704,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if(rand()%100 < (50+10*skilllv))
pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv);
+ else if(sd->spiritball > 0)
+ pc_delspiritball(sd,1,0);
}
break;
case GS_MADNESSCANCEL:
@@ -6073,6 +6091,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒ?ƒeƒNƒ^? */
+ case NJ_SUITON:
skill_unitsetting(src,skillid,skilllv,x,y,0);
break;
@@ -6251,6 +6270,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
//Until they're at right position - gs_unit- [Vicious]
case NJ_KAENSIN:
+ case NJ_BAKUENRYU:
case NJ_HYOUSYOURAKU:
case NJ_RAIGEKISAI:
skill_unitsetting(src,skillid,skilllv,x,y,0);
@@ -6760,6 +6780,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int
case UNT_VOLCANO:
case UNT_DELUGE:
case UNT_VIOLENTGALE:
+ case UNT_SUITON:
if(sc && sc->data[type].timer==-1)
sc_start4(bl,type,100,sg->skill_lv,sg->group_id,0,0,
skill_get_time2(sg->skill_id,sg->skill_lv));
@@ -7286,6 +7307,7 @@ static int skill_unit_onleft(int skill_id, struct block_list *bl,unsigned int ti
case SA_VIOLENTGALE:
case CG_HERMODE:
case HW_GRAVITATION:
+ case NJ_SUITON:
if (sc && sc->data[type].timer != -1)
status_change_end(bl, type, -1);
break;
@@ -8194,7 +8216,7 @@ int skill_check_condition(struct map_session_data *sd,int type)
}
break;
case GS_ADJUSTMENT:
- if(sd->sc.data[SC_MADNESSCANCEL].timer == -1) {
+ if(sd->spiritball < 2 || sd->sc.data[SC_MADNESSCANCEL].timer == -1) {
clif_skill_fail(sd,skill,0,0);
return 0;
}
@@ -8349,7 +8371,7 @@ int skill_check_condition(struct map_session_data *sd,int type)
case ST_WATER:
//?…?ê”»’è
//(!map[sd->bl.m].flag.rain) && //they have removed RAIN effect. [Lupus]
- if ( (sd->sc.data[SC_DELUGE].timer == -1) &&
+ if ( (sd->sc.data[SC_DELUGE].timer == -1 || sd->sc.data[SC_SUITON].timer == -1) &&
(!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKWATER)))
{
clif_skill_fail(sd,skill,0,0);
@@ -9568,7 +9590,7 @@ int skill_clear_element_field(struct block_list *bl)
for (i=0;i<max;i++) {
skillid=ug[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+ if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR||skillid==NJ_SUITON)
skill_delunitgroup(&ug[i]);
}
return 0;
@@ -9598,11 +9620,11 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl)
for (i=0;i<max;i++) {
if(sd){
skillid=sd->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+ if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR||skillid==NJ_SUITON)
return &sd->skillunit[i];
}else if(md){
skillid=md->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+ if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR||skillid==NJ_SUITON)
return &md->skillunit[i];
}
}
diff --git a/src/map/skill.h b/src/map/skill.h
index bd40a8382..141d465a5 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -928,6 +928,7 @@ enum {
UNT_HERMODE,
UNT_KAENSIN,
+ UNT_SUITON,
};
diff --git a/src/map/status.c b/src/map/status.c
index 2d8080811..1142f6810 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -281,10 +281,10 @@ void initChangeTables(void) {
//Until they're at right position - gs_set_sc- [Vicious] / some of these don't seem to have a status icon adequate [blackhole89]
set_sc(GS_MADNESSCANCEL, SC_MADNESSCANCEL, SI_MADNESSCANCEL);
set_sc(GS_ADJUSTMENT, SC_ADJUSTMENT, SI_ADJUSTMENT);
- set_sc(GS_INCREASING, SC_INCREASING, SI_BLANK);
+ set_sc(GS_INCREASING, SC_INCREASING, SI_ACCURACY);
set_sc(GS_GATLINGFEVER, SC_GATLINGFEVER, SI_GATLINGFEVER);
set_sc(NJ_TATAMIGAESHI, SC_TATAMIGAESHI, SI_BLANK);
- set_sc(NJ_UTSUSEMI, SC_UTSUSEMI, SI_BLANK);
+ set_sc(NJ_UTSUSEMI, SC_UTSUSEMI, SI_MAEMI);
set_sc(NJ_KAENSIN, SC_KAENSIN, SI_BLANK);
set_sc(NJ_SUITON, SC_SUITON, SI_BLANK);
set_sc(NJ_NEN, SC_NEN, SI_NEN);
@@ -1721,6 +1721,9 @@ int status_calc_agi(struct block_list *bl, int agi)
agi -= 2 + sc->data[SC_DECREASEAGI].val1;
if(sc->data[SC_QUAGMIRE].timer!=-1)
agi -= sc->data[SC_QUAGMIRE].val1*(bl->type==BL_PC?5:10);
+ int class = status_get_class(bl);
+ if(sc->data[SC_SUITON].timer!=-1 || class != JOB_NINJA)
+ agi -= (((sc->data[SC_SUITON].val1 - 1) / 3) + 1) * 3;
}
return agi;
@@ -1992,7 +1995,7 @@ int status_calc_flee(struct block_list *bl, int flee)
if(sc->data[SC_ADJUSTMENT].timer!=-1)
flee += 30;
if(sc->data[SC_GATLINGFEVER].timer!=-1)
- flee -= sc->data[SC_GATLINGFEVER].val2*5;
+ flee -= sc->data[SC_GATLINGFEVER].val1*5;
}
if (bl->type == BL_PC && map_flag_gvg(bl->m)) //GVG grounds flee penalty, placed here because it's "like" a status change. [Skotlex]
@@ -2230,7 +2233,7 @@ int status_calc_aspd_rate(struct block_list *bl, int aspd_rate)
if(sc->data[SC_MADNESSCANCEL].timer!=-1)
aspd_rate -= 20;
if(sc->data[SC_GATLINGFEVER].timer!=-1)
- aspd_rate -= sc->data[SC_GATLINGFEVER].val2*2;
+ aspd_rate -= sc->data[SC_GATLINGFEVER].val1*2;
}
return aspd_rate;
@@ -3854,6 +3857,9 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
calc_flag = 1;
val3 = val1*3;
break;
+ case SC_SUITON:
+ calc_flag = 1;
+ break;
case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
calc_flag = 1;
@@ -4449,7 +4455,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
calc_flag = 1;
break;
case SC_UTSUSEMI:
- case SC_SUITON:
case SC_NEN:
break;