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);