Index: db/re/skill_db.txt
===================================================================
--- db/re/skill_db.txt (revision 17259)
+++ db/re/skill_db.txt (working copy)
@@ -132,7 +132,7 @@
86,9,8,1,1,0,0,5,1,yes,0,0,0,magic,0, WZ_WATERBALL,Water Ball
87,9,6,2,1,0x1,0,10,1,yes,0,0,0,magic,0, WZ_ICEWALL,Ice Wall
88,0,6,4,1,0x2,2,10,1,yes,0,0,0,magic,0, WZ_FROSTNOVA,Frost Nova
-89,9,6,2,1,0,0,10,1,yes,0,0,0,magic,2, WZ_STORMGUST,Storm Gust
+89,9,6,2,1,0,1,10,1,yes,0,0,0,magic,2, WZ_STORMGUST,Storm Gust
90,9,8,1,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0, WZ_EARTHSPIKE,Earth Spike
91,9,8,2,2,0,0,5,1:2:3:4:5,yes,0,0,0,magic,0, WZ_HEAVENDRIVE,Heaven's Drive
92,9,6,2,2,0x1,0,5,1,yes,0,0,3,magic,0, WZ_QUAGMIRE,Quagmire
Index: src/map/skill.c
===================================================================
--- src/map/skill.c (revision 17259)
+++ src/map/skill.c (working copy)
@@ -2727,9 +2727,19 @@
dir = unit_getdir(bl);// backwards
break;
// This ensures the storm randomly pushes instead of exactly a cell backwards per official mechanics.
- case WZ_STORMGUST:
- dir = rand()%8;
+ case WZ_STORMGUST: {
+ int dx = bl->x-skill_area_temp[4];
+ int dy = bl->y-skill_area_temp[5];
+ if( dx == 0 && dy == 0 ){ // both are standing on the same spot
+ dir = rand()%8; //make it random
+ }
+ else //push it farther then center
+ dir = map_calc_dir(bl,skill_area_temp[4],skill_area_temp[5]);
+ ShowInfo("srcx=%d,srcy=%d, blx=%d,bly=%d, \n\tdx=%d, dy=%d => dir=%d\n",
+ skill_area_temp[4],skill_area_temp[5],bl->x,bl->y,
+ dx,dy,dir);
break;
+ }
case WL_CRIMSONROCK:
dir = map_calc_dir(bl,skill_area_temp[4],skill_area_temp[5]);
break;
@@ -3897,6 +3907,10 @@
status_heal(src,heal,0,0);
}
} else {
+ skill_area_temp[0] = 0;
+ skill_area_temp[1] = bl->id;
+ skill_area_temp[2] = 0;
+
switch ( skill_id ) {
case NJ_BAKUENRYU:
case LG_EARTHDRIVE:
@@ -3908,19 +3922,18 @@
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);
+ case WL_CRIMSONROCK:
+ skill_area_temp[4] = bl->x;
+ skill_area_temp[5] = bl->y;
+ break;
+ case WM_REVERBERATION_MELEE:
+ case WM_REVERBERATION_MAGIC:
+ skill_area_temp[1] = 0;
+ break;
default:
break;
}
- skill_area_temp[0] = 0;
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = 0;
- if( skill_id == WL_CRIMSONROCK ) {
- skill_area_temp[4] = bl->x;
- skill_area_temp[5] = bl->y;
- }
- if( skill_id == WM_REVERBERATION_MELEE || skill_id == WM_REVERBERATION_MAGIC )
- skill_area_temp[1] = 0;
// if skill damage should be split among targets, count them
//SD_LEVEL -> Forced splash damage for Auto Blitz-Beat -> count targets
//special case: Venom Splasher uses a different range for searching than for splashing
@@ -3932,6 +3945,17 @@
}
break;
+ case WZ_STORMGUST: //SG counter does not reset per stormgust. IE: One hit from a SG and two hits from another will freeze you.
+ #ifndef RENEWAL
+ if (tsc)
+ tsc->sg_counter++; //SG hit counter.
+ if (skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,0) <= 0 && tsc)
+ tsc->sg_counter=0; //Attack absorbed.
+ #else
+ skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,0);
+ #endif
+ break;
+
case WL_COMET:
if(!map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) // Nothing should happen if the target is on Land Protector
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
@@ -9856,7 +9880,6 @@
case WZ_FIREPILLAR:
case WZ_QUAGMIRE:
case WZ_VERMILION:
- case WZ_STORMGUST:
case WZ_HEAVENDRIVE:
case PR_SANCTUARY:
case PR_MAGNUS:
@@ -9956,6 +9979,12 @@
case GS_GROUNDDRIFT: //Ammo should be deleted right away.
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
break;
+ case WZ_STORMGUST:
+ flag|=1;
+ skill_area_temp[4] = x;
+ skill_area_temp[5] = y;
+ skill_unitsetting(src,skill_id,skill_lv,x,y,0);
+ break;
case RG_GRAFFITI: /* Graffiti [Valaris] */
skill_clear_unitgroup(src);
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
@@ -11572,17 +11601,15 @@
++count < SKILLUNITTIMER_INTERVAL/sg->interval && !status_isdead(bl) );
}
break;
- /**
- * The storm gust counter was dropped in renewal
- **/
- #ifndef RENEWAL
- case WZ_STORMGUST: //SG counter does not reset per stormgust. IE: One hit from a SG and two hits from another will freeze you.
- if (tsc)
- tsc->sg_counter++; //SG hit counter.
- if (skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0) <= 0 && tsc)
- tsc->sg_counter=0; //Attack absorbed.
+
+ case WZ_STORMGUST:
+ //make it splash to all char
+ map_foreachinrange(skill_area_sub, bl,
+ skill_get_splash(sg->skill_id,sg->skill_lv),BL_CHAR,
+ ss,sg->skill_id,sg->skill_lv,tick, BCT_ENEMY|1,
+ skill_castend_damage_id);
break;
- #endif
+
case GS_DESPERADO:
if (rnd()%100 < src->val1)
skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);